Contexto. O original usou o Tigris (S3-compatível) como área de pouso por limitação do Databricks. O pedido admite Parquet local ou em S3/Tigris.
Decisão. Um único RAIZ_DADOS (caminho local ou s3://bucket/prefixo). Leitura/escrita S3 pelo DuckDB
(httpfs + CREATE SECRET com AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ENDPOINT_URL_S3,
região auto, estilo de URL configurável) e comando rfb sincronizar (boto3, como o subir_arquivos_tigris.py
original) para publicar raw/ e gold/. Testes usam moto em modo servidor.
Consequências. O caminho padrão não depende de nuvem. Não há credenciais Tigris neste ambiente: a validação real no Tigris é um passo manual documentado.
O modo s3:// não fechava de ponta a ponta. Decisões:
- Duas raízes.
RAIZ_DADOS(local ous3://bucket/prefixo) é onde vivem as fontes e ogold/lidos pelo dbt.RAIZ_DADOS_LOCAL(padrão./dados) é onde o EL grava, onde fica o arquivowarehouse.duckdbe onde ficam os temporários do DuckDB: sempre local, porque o DuckDB não abre banco gravável em S3. No targets3,path/temp_directoryusamRAIZ_DADOS_LOCALeexternal_root/fontes usamRAIZ_DADOS. - Fluxo s3.
rfb ingerir(grava emRAIZ_DADOS_LOCAL) →rfb sincronizar(enviaraw/egold/) →dbt build --target s3(lês3://…/raw, gravagoldems3://…/gold). Osynccompara tamanho e sha256 (metadadosha256do objeto), não o ETag. - Secret. O secret S3 do DuckDB vem só do profile
s3(transform/profiles.yml), sem valor padrão para as três variáveisAWS_*/AWS_ENDPOINT_URL_S3: se faltar, o dbt falha nomeando a variável (paridade com a validação do Python). O helper Pythonsql_create_secretfoi removido: não era usado em produção, duplicava o profile e interpolava credenciais sem escapar'. - Variável vazia = padrão (
configuracao.py), e.env.exampletraz as chaves opcionais comentadas.