Qualidade de Dados e Observabilidade: DQDL, Quarentena, Lineage e SLOs
Transforme o lakehouse já construído em um sistema que consegue provar os próprios números: AWS Glue Data Quality de ponta a ponta (as 32 regras do DQDL, expressões, cláusulas where, regras dinâmicas, labels e constantes; rulesets presos a uma única tabela; a tarefa do Data Catalog versus EvaluateDataQuality dentro de um job Glue; resultados no S3, no service store e em tabelas Iceberg no Data Catalog; métricas do CloudWatch e eventos do EventBridge mais o checkbox do qual elas secretamente dependem), Deequ/PyDeequ e DataBrew apenas em caminhos verificados pela AWS, o padrão de quarentena com as ações warn/quarantine/halt e Write-Audit-Publish em branches do Iceberg, um SLO de frescor de três relógios com aritmética P95 resolvida, logs, métricas, alarmes e dashboards do CloudWatch por camada, seletores de data events do CloudTrail escopados com um aviso de custo, o catálogo de negócios DataZone e o lineage compatível com OpenLineage contra o catálogo Glue e o plano de auditoria do CloudTrail, uma configuração completa de remediação EventBridge → SNS → Lambda, os casos Siemens e Vanguard, uma caixa de atualização de outubro de 2026 com fontes, quatro verificações interativas, cinco diagramas, seis exemplos resolvidos e onze questões de prova.
As lições 01 to 14 construíram algo que funciona: um prefixo bronze, tabelas Iceberg, jobs do Glue, um catálogo, Athena e QuickSight, orquestração, grants do Lake Formation, controles de PII e um perímetro endurecido. Nada disso responde à pergunta que os seus consumidores realmente vão fazer; vocês conseguem provar que os números gold de hoje estão certos, e conseguem me dizer o que mudou quando não estão? Um lakehouse sem qualidade e observabilidade é um jeito muito rápido de mover dados errados.
Esta lição constrói a camada de prova na ordem em que a própria orientação da AWS organiza o assunto: engines → regras → runtimes → resultados e sinais → quarentena → SLOs → observabilidade por camada → auditoria → lineage → remediação. Duas ideias carregam tudo. Primeira, qualidade é um passo de pipeline com saída, não um dashboard: ela ou bloqueia uma gravação, ou separa linhas, ou levanta um sinal para alguém ser acionado. Segunda, observabilidade tem três planos distintos que os times confundem o tempo todo, o catálogo Glue guarda metadados técnicos e permissões, o DataZone guarda significado de negócio e lineage, o CloudTrail guarda quem chamou o quê. Todo número abaixo está datado de outubro de 2026.
====================================================================
QUALIDADE + OBSERVABILIDADE - ESPINHA DA AULA, AWS DATA LAKEHOUSE, AULA 15
====================================================================
ENGINES ..... Glue Data Quality (DQDL, gerenciado, construído sobre o Deequ)
- tarefa do Data Catalog OU EvaluateDataQuality no job
Deequ / PyDeequ - OSS, analyzers customizados, runtimes exóticos
DataBrew - expressões de check sem código em profile jobs
checks custom - Lambda / Glue / EMR à sua escolha
REGRAS ...... Rules = [ ... ] preso a UMA tabela; 32 tipos de regra;
expressões, cláusulas where, regras dinâmicas
(RowCount > avg(last(10))), labels (team=finance),
constantes, SQL de pré-processamento; 2.000 regras e
65 KB por ruleset; sem colunas aninhadas ou de lista
RUNTIMES .... tarefa do catálogo: recomendações (BASIC; ADVANCED via
Bedrock set 2026), predicados de partição com pushdown,
mínimo de 2 DPUs - mas NÃO nomeia registros com falha
job ETL: colunas DataQualityRules* de nível de linha,
auto scaling, Flex, incremental por bookmark - mas
não há execuções de recomendação
RESULTADOS .. JSON no S3 -> tabela externa + crawler -> Athena;
service store -> console + APIs Get/List;
tabelas Iceberg no Data Catalog (jul 2026),
particionadas por catalog_id/database/table/day
SINAIS ...... EventBridge "Data Quality Evaluation Results
Available" (source aws.glue-dataquality) com score,
state, rulesSucceeded/Failed/Skipped -
que só funciona enquanto "Publish metrics to
Amazon CloudWatch" permanecer SELECIONADO
CloudWatch namespace Glue Data Quality:
glue.data.quality.rules.passed / .failed
QUARENTENA .. warn | quarantine | halt (as três ações do
InsuranceLake); apenas resultados de nível de linha;
regras de razão e limiar não podem colocar em
quarentena; WAP = branch de staging do Iceberg ->
audit -> fast_forward para main
SLO ......... P95(disponibilidade - evento) <= meta em três relógios:
tempo de evento / tempo de chegada / tempo de
disponibilidade; codificar como DataFreshness +
FileFreshness + alarmes de volume RowCount
OBSERVABILIDADE um dashboard do CloudWatch por camada de medalhão;
log groups do Glue /aws-glue/jobs/output, /error,
/logs-v2 (continuous logging, redirect Logs IA);
métricas AWS/Athena do Athena; X-Ray para Lambda e
Step Functions - NÃO para executores do Spark
AUDIT ....... eventos de gestão do CloudTrail (primeira cópia grátis)
vs data events do S3 ($0.10 por 100.000, opt-in,
escopados por advanced event selectors, sem curingas)
PLANES ...... Glue Data Catalog = metadados técnicos + permissões
(grants do Lake Formation; registro NÃO é lineage)
Amazon DataZone = catálogo de negócios + lineage
(compatível com OpenLineage; captura automática
Glue/Redshift)
CloudTrail = auditoria de acesso (quem chamou, não de
onde uma coluna foi derivada)
Preços ...... exemplos do Glue DQ a $0.44 por DPU-hour (uma
segunda linha na mesma página lê $0.22 - veja E2);
Flex $0.29; mínimo de 2 DPUs, cobrança de 1 minuto;
anomaly detection 1 DPU por estatística;
EventBridge $1.00 por milhão de custom events;
métrica custom do CloudWatch $0.30 por métrica-mês
[lista de us-east-1, em outubro de 2026]
====================================================================Nesta lição você vai:
- escolher uma engine de qualidade no próprio mapeamento de Prescriptive Guidance da AWS, Glue Data Quality, DataBrew, Deequ ou código customizado, e defender o default;
- criar DQDL: rulesets presos a uma tabela, os quatro modificadores (expressões,
where, regras dinâmicas, labels), os 32 tipos de regra, e quais deles podem gerar uma linha reprovada; - rodar a avaliação nos dois runtimes, a tarefa do Data Catalog e o
EvaluateDataQualitydentro de um job Glue, e saber exatamente o que cada um pode e não pode fazer; - pousar resultados em três destinos: JSON no S3, o service store do Glue e tabelas Iceberg no Data Catalog, e depois lê-los no Athena;
- ligar os sinais: eventos do EventBridge, métricas do CloudWatch no namespace
Glue Data Quality, alarmes, dashboards: incluindo o checkbox que mata os alertas em silêncio; - construir o padrão de quarentena de ponta a ponta: separar as linhas, gravar o prefixo e a tabela de quarentena, emitir a métrica, o alerta, e rodar um backfill que permanece idempotente;
- calcular um SLO de frescor em três relógios e defender um número P95 com aritmética de verdade;
- escopar os data events do CloudTrail por prefixo sensível para que a trilha de auditoria não vire a maior linha da fatura;
- separar os três planos, catálogo Glue, catálogo de negócios e lineage do DataZone, auditoria do CloudTrail, e nomear apenas as fontes de lineage que a AWS de fato documenta;
- ligar um caminho de remediação EventBridge → SNS → Lambda que funcione, com o IAM que cabe;
- estudar dois casos de clientes da AWS, uma caixa de atualização de outubro de 2026 com fontes, onze questões de prova e quatro verificações interativas.
1. Quatro engines de qualidade, uma decisão
1.1 O mapeamento da própria AWS
O Prescriptive Guidance da AWS publica uma tabela de mapeamento de soluções para checks de qualidade de dados. É a resposta correta mais rápida para "qual ferramenta":
Necessidade | Engine | Onde roda | Escopo verificado |
|---|---|---|---|
Condições sem código, no nível de coluna ou de tabela, para analistas | AWS Glue DataBrew | Profile job + ruleset | Sintaxe própria CheckExpression, não é DQDL; relatório de validação ao lado do perfil |
Código customizado em um job do Glue ou regras sem código em tabelas de catálogo | AWS Glue Data Quality | Tarefa do catálogo ou transform ETL | DQDL, gerenciado, serverless, "construído sobre o framework open-source DeeQu" |
Checks sob medida no seu próprio ETL, à sua escolha | Checks customizados | Lambda, Glue, EMR | O que você escrever |
Relatório de métricas, validação de restrições e sugestão de restrições | Deequ (open source) | EMR, SageMaker, Glue com o JAR certo | Analyzers no estilo CompletenessConstraint, repositório de métricas, checks de anomalia |
(AWS Prescriptive Guidance: Data quality checks, acesso em 2026-10-11.)
Para o lakehouse deste curso a resposta é Glue Data Quality por default, com o DataBrew reservado ao profiling de analistas de negócio sobre conjuntos CSV/JSON, e PyDeequ apenas onde a customização no nível do Deequ é de fato necessária. Isso não é uma disputa de popularidade: o Glue DQ avalia "tabelas e views do Amazon Athena suportadas que estão armazenadas no AWS Glue Data Catalog" sobre o "Amazon S3, Amazon Redshift, fontes JDBC compatíveis com o Data Catalog e formatos de data lake transacionais como Apache Iceberg, Apache Hudi e Delta Lake": esse é exatamente o substrato que você construiu nas Lições 02 to 08 (Glue Developer Guide, acesso em 2026-10-11).
- 📚 Você sabia? O Glue Data Quality não é uma reimplementação: a AWS afirma que ele é "construído sobre o framework open-source DeeQu" e que não há "Sem lock-in… permitindo que você mantenha as regras que está escrevendo em uma linguagem aberta" (Glue Developer Guide, acesso em 2026-10-11). É por isso que uma regra DQDL se parece com o vocabulário de restrições do Deequ, e por que a biblioteca open source continua sendo um escape hatch legítimo para analyzers que o produto não expõe.
1.2 O que o "gerenciado" compra, em uma tabela
Glue Data Quality | Deequ / PyDeequ | Regras do DataBrew | Great Expectations (faça você mesmo) | |
|---|---|---|---|---|
Autoração | DQDL, console, API, nó do Studio | Restrições em Scala/Python | Expressões de check sem código | Suítes de expectations em Python |
Execução gerenciada | Sim, tarefas serverless e integração com ETL | Não, você roda o Spark | Sim, dentro de profile jobs | Não, você hospeda |
Recomendações de regra | Sim (BASIC; ADVANCED via Bedrock, set 2026) | Sugestão de restrição no código | Aba Recommendations no console | Não |
Registros reprovados de nível de linha | Sim, apenas no caminho ETL | Sim, se você montar a separação | Não: os findings são agregados | Sim, se você montar |
Alertas | EventBridge + CloudWatch, embutidos | Você monta a publicação no SNS | Evento do EventBridge por ruleset validado | Você monta |
Postura de suporte AWS | Produto de primeira parte | Open source (comunidade/exemplos da AWS) | Produto de primeira parte | Não é uma oferta da AWS |
A última linha importa. O Great Expectations aparece nesta lição apenas como um framework traga-o-você-mesmo: a AWS não publica nenhuma oferta gerenciada de GX, a documentação legada do próprio GX fixa a integração com o AWS Glue em "a versão mais recente do GX que suporta esta integração é o GX 0.15.50", e o walkthrough do conector do Glue Catalog é um post de parceiro. Trate o GX como o seu runner, para você versionar, aplicar patches e suportar.
2. DQDL: a linguagem, os modificadores, o contrato do ruleset
2.1 O contrato: Rules = [ ... ] preso a uma tabela
Um ruleset é uma lista entre colchetes e separada por vírgulas, presa a exatamente uma tabela de catálogo:
Ruleset = 'Rules = [IsComplete "col1", IsPrimaryKey "col2", RowCount between 2000 and 8000]'
TargetTable = {'TableName': 'orders', 'DatabaseName': 'lakehouse_silver'}Essa é a forma de create_data_quality_ruleset (Glue Developer Guide: Using APIs to measure and manage data quality, acesso em 2026-10-11). Dois limites definem o tamanho de um ruleset: 2.000 regras por ruleset ("Se seus rulesets forem maiores, recomendamos dividir em vários rulesets") e um tamanho de ruleset de 65 KB. Estatísticas são um orçamento separado: 100.000 estatísticas por conta, armazenadas gratuitamente por 2 anos (Glue pricing, acesso em 2026-10-11).
Uma exclusão de nível de linguagem para decorar: "O DQDL não suporta atualmente dados de coluna aninhados ou de tipo lista." Structs aninhados e arrays estão fora do escopo de alvos diretos de regra: aplane ou use CustomSql contra uma view pré-processada.
2.2 Os quatro modificadores que mudam a semântica
Modificador | Desde | O que faz | Exemplo |
|---|---|---|---|
Expressões | GA 2023-05-24 (produto) | Limiares, intervalos, enums, regex, with threshold | Uniqueness "email" = 1.0, ColumnValues "currency" matches "^[A-Z]{3}$" with threshold > 0.999 |
Cláusula where | 2024-06-26 | Filtra linhas antes de a regra avaliar | Completeness "First_Name" > 0.95 where "weight > 10" |
Regras dinâmicas | preview 2023-11-27, GA 2024-08-07 | Limiares calculados a partir do histórico de execuções | RowCount > avg(last(10)), Completeness "colA" between min(last(5)) - 1 and max(last(5)) + 1 |
Labels | GA 2025-11-21 | Tags chave-valor escritas em DQDL para fatiar resultados por dono | label team=finance, consultável nos resultados de regra, nos resultados de nível de linha e nas respostas de API |
(Notas de versão do Glue DQ e AWS What's New, 2025-11-25, acesso em 2026-10-11.)
Três recursos de apoio completam o pacote: constantes (2025-11-21) permitem definir um valor uma vez e referenciá-lo no script inteiro, "evitando problemas relacionados aos limites de tamanho de consulta"; consultas de pré-processamento (GA 2025-11-25) rodam SparkSQL sobre a tabela antes da avaliação, pelo campo PreProcessingQuery de DataQualityGlueTable, para você derivar colunas, filtrar ou validar relações entre colunas; e regras compostas complexas (2024-11-22) permitem aninhar grupos AND/OR em vez de empilhar regras planas.
Repare na armadilha da coluna with threshold: essa cláusula só funciona com ColumnValues, ColumnDataType e CustomSql. Coloque-a em Completeness e você está escrevendo uma regra que o DQDL não vai avaliar do jeito que você imagina.
2.3 Os 32 tipos de regra, e os que podem nomear uma linha
A referência de tipos de regra do DQDL lista exatamente 32 tipos em outubro de 2026: AggregateMatch, AllStatistics, ColumnCorrelation, ColumnCount, ColumnDataType, ColumnExists, ColumnLength, ColumnNamesMatchPattern, ColumnValues, Completeness, CustomSql, DataFreshness, DatasetMatch, DistinctValuesCount, Distribution, Entropy, IsComplete, IsPrimaryKey, IsUnique, Mean, ReferentialIntegrity, RowCount, RowCountMatch, SchemaMatch, StandardDeviation, Sum, Uniqueness, UniqueValueRatio, DetectAnomalies, FileFreshness, FileMatch, FileUniqueness e FileSize.
Elas se dividem em quatro famílias:
NÍVEL DE LINHA (pode nomear o registro problemático) ..... Completeness, IsComplete,
IsUnique, IsPrimaryKey, Uniqueness, UniqueValueRatio, ColumnValues,
ColumnLength, ColumnDataType, ColumnExists, DetectAnomalies,
DataFreshness, CustomSql COM limiar de nível de linha, File* (não)
NÍVEL DE CONJUNTO (apenas agregado - NUNCA uma linha reprovada) .. RowCount,
RowCountMatch, Mean, StandardDeviation, Sum, ColumnCount,
ColumnExists, ColumnNamesMatchPattern, ColumnCorrelation,
CustomSql (forma geral), AggregateMatch
ENTRE CONJUNTOS .................................. ReferentialIntegrity,
DatasetMatch, AggregateMatch, SchemaMatch
ANALYZERS / CENTRADOS EM ARQUIVO ................ AllStatistics,
Distribution, FileFreshness, FileMatch, FileUniqueness, FileSizeA própria documentação do Studio é franca sobre a divisão: regras de nível de conjunto "não conseguem identificar registros de erro porque são aplicadas no nível do conjunto de dados" (Glue Developer Guide: Evaluating data quality with AWS Glue Studio, acesso em 2026-10-11). Construa uma quarentena em cima de RowCount e você não vai colocar nada em quarentena.
2.4 Exemplo resolvido E1, o ruleset orders da camada silver
Alvo: lakehouse_silver.orders, uma tabela Iceberg particionada por dt, avaliada dentro do job bronze→silver e reavaliada diariamente como tarefa de catálogo.
Exemplo resolvido E1 - ruleset DQDL para lakehouse_silver.orders, em outubro de 2026
Rules = [
ColumnExists "order_id",
ColumnExists "customer_id",
ColumnExists "order_ts",
IsPrimaryKey "order_id", -- not-null + unique em uma regra só
Completeness "customer_id" > 0.999, -- nível de linha, colocável em quarentena
Completeness "order_ts" > 0.995, -- nível de linha, colocável em quarentena
Uniqueness "order_id" > 0.999, -- tolera 0.1% de duplicatas
ColumnValues "order_status" in ["created","paid","shipped","cancelled"]
with threshold > 0.99, -- até 1% de enum sujo é tolerado
ColumnValues "currency" matches "^[A-Z]{3}$" with threshold > 0.999,
ColumnValues "total_amount" > 0,
RowCount > 1000, -- guarda de pipeline morto
RowCount <= avg(last(10)) * 1.5, -- guarda dinâmica de pico de volume
DataFreshness "order_ts" > (now() - 2 days)
where "dt = current_date - 1", -- frescor da partição de ontem
CustomSql "SELECT order_id FROM primary WHERE total_amount != item_sum"
]
SCORE = regras aprovadas / regras avaliadas -> 14/14 = 1.00, 13/14 = 0.929
REGRAS CAPAZES DE QUARENTENA = o par Completeness, o Uniqueness,
os três ColumnValues e o CustomSql de nível de linha
APENAS NÍVEL DE CONJUNTO = as duas regras de RowCount e o DataFreshness
-> isso ALERTA (halt / notify), nunca separa linhasPor que cada linha merece estar ali: IsPrimaryKey colapsa duas regras em uma; as formas com limiar em ColumnValues toleram menos de 1% de sujeira sem reprovar a execução inteira; RowCount <= avg(last(10)) * 1.5 é uma guarda de pico dinâmica que não precisa de constante ajustada à mão; o CustomSql de nível de linha é a única regra aqui que pode te entregar uma lista de IDs de pedido para colocar em quarentena; e DataFreshness … where "dt = current_date - 1" limita o aviso de frescor à partição que deveria estar fresca em vez de gritar sobre a história inteira.
O walkthrough de getting-started da AWS mostra a mesma forma na tabela de tickets de exemplo, IsComplete "SET_FINE_AMOUNT", Uniqueness "TICKET_NUMBER" > 0.95, ColumnValues "PROVINCE" in [...], ColumnLength "INFRACTION_DESCRIPTION" between 15 and 31, com a ressalva importante da documentação: as recomendações "facilitam o início… sem escrever código", mas as regras são geradas a partir de estatísticas atuais, então trate-as como um rascunho a apertar (acesso em 2026-10-11).
2.5 Recomendações de regra: BASIC e ADVANCED via Bedrock
start_data_quality_rule_recommendation_run(DataSource={'GlueTable': {...}}, Role=role_arn) devolve um RunId; busque ResultIds em get_data_quality_ruleset_evaluation_run e depois cada get_data_quality_result(ResultId=…). As execuções de recomendação são apagadas automaticamente depois de 90 dias. Desde 2026-09-18 / 2026-09-25, um modo ADVANCED usa o Amazon Bedrock com metadados da tabela e linhas amostradas para gerar DQDL: um assistente de rascunho, não uma aprovação.
Como responder
Exercício de preenchimento com 5 lacunas. Digite as palavras que faltam e verifique a resposta.
Preencha as palavras-chave de DQDL e do Glue Data Quality nas quais esta lição se apoia:
Um ruleset é escrito como espaço = [ lista de regras ] e fica preso a exatamente uma tabela de catálogo; um filtro aplicado antes de uma regra rodar é a cláusula espaço; um limiar calculado a partir do histórico de execuções, como RowCount > espaço(last(10)), é uma regra espaço; e a regra que verifica not-null e unicidade de uma vez só é espaço.
Banco de Palavras, arraste as palavras para os espaços acima:
3. Dois runtimes: a tarefa do Data Catalog e o EvaluateDataQuality no job
Eles compartilham DQDL, EventBridge, métricas do CloudWatch, resultados no S3 e ações de IAM. Eles não são intercambiáveis.
Tarefa do Data Catalog ( StartDataQualityRulesetEvaluationRun) | Integrado ao ETL ( EvaluateDataQuality.apply / nó do Studio) | |
|---|---|---|
Identificar quais registros falharam | "Não suportado" | "Suportado": resultados de nível de linha |
Avaliação incremental | Predicados de partição com pushdown / de catálogo | AWS Glue job bookmarks |
Auto scaling | Não suportado | Suportado |
Recomendações de regra | Sim (sem recomendações dentro de execuções de ETL) | Não |
Detecção de anomalias por ML, regras dinâmicas, EventBridge, CloudWatch, resultados no S3 | Suportado | Suportado |
Execução Flex / DPU com auto-scaling | : | Suportado |
Ação de falha | Score + evento | "Fail job after loading target data" → AssertionError |
(Glue Developer Guide: matriz de capacidades, acesso em 2026-10-11.)
3.1 Dentro do job
from awsglue.transforms import EvaluateDataQuality
dq = EvaluateDataQuality.apply(
frame=orders_frame,
ruleset=ruleset, # Rules = [ ... ]
publishing_options={
"dataQualityEvaluationContext": "silver_orders", # namespace; default "default_context"
"enableDataQualityCloudWatchMetrics": True, # default False
"enableDataQualityResultsPublishing": True, # default True -> Glue Studio "Data quality" tab
"resultsS3Prefix": "s3://lakehouse-dq/results/" # optional S3 sink
})A opção de saída do transform é a decisão que importa: "Dados originais" versus "Adicionar novas colunas para indicar erros de qualidade dos dados". A segunda acrescenta quatro colunas: DataQualityRulesPass, DataQualityRulesFail, DataQualityRulesSkip (arrays de string) e DataQualityEvaluationResult ("Passed" ou "Failed" no nível da linha). A nota da própria AWS é a que vale decorar: "seus resultados gerais podem ser FAIL, mas um registro específico pode passar." As regras no Studio ficam "dentro dos colchetes e… separadas por vírgulas": Rules = [ Completeness "year" > 0.8, Completeness "month" > 0.8 ].
Qualidade incremental vem dos job bookmarks: para entradas no S3, a marca d'água é o tempo de última modificação do objeto, com um maxBand padrão de 900.000 ms (15 minutos), durante o qual a listagem "provavelmente estará consistente". Bookmarks exigem job.init no início e job.commit no final, e dependem de um transformation_ctx único: omita-o e o operador não é rastreado de modo algum (que é exatamente como você relê uma dimensão de propósito a cada execução).
3.2 Três destinos de resultado, e desde julho de 2026 o catálogo é um deles
- Resultados JSON no S3 (opt-in via
resultsS3Prefixou o local de resultados da tarefa) → registre com um crawler,CREATE EXTERNAL TABLEcom um SerDe JSON,MSCK REPAIR TABLE, e depois Athena. A AWS entrega o DDL completo, particionado poryear/month/day. - O service store do Glue → legível por
GetDataQualityResult/ListDataQualityResultse renderizado na aba Data quality do console; o Data quality snapshot mostra as últimas 10 execuções entre rulesets por default. - Tabelas Iceberg no Data Catalog (GA 2026-07-27) → quatro tipos de resultado em opt-in, resultados de regra, de profiling, de nível de linha e de observação, configurados via
--additional-run-optionsemStartDataQualityRulesetEvaluationRunouadditional_optionsem um job ETL. Nada é gravado por default: "Você precisa habilitar explicitamente cada tipo de resultado."
aws glue start-data-quality-ruleset-evaluation-run \
--data-source '{"GlueTable": {"DatabaseName": "lakehouse_silver","TableName": "orders"}}' \
--role arn:aws:iam::111122223333:role/glue-dq-task \
--ruleset-names '["silver_orders_strict"]' \
--additional-run-options '{
"DataQualityRuleResults": {
"WriteDataQualityRuleResultsEnabled": true,
"CatalogTableConfig": {"DatabaseName": "quality_results","TableName": "rule_results"}
}
}'
CHAVES DE PARTIÇÃO de toda tabela de resultados ... catalog_id, database_name,
table_name, day(stored_on)
COLUNAS DE RESULTADO DE REGRA ............ dq_result_id, rule_name,
rule_description (a expressão DQDL), rule_result (PASS|FAIL),
evaluation_message, evaluated_metrics MAP<STRING,DOUBLE>,
catalog_id, database_name, table_name,
ruleset_evaluation_run_id, started_on, completed_on,
evaluated_rule, ruleset_name
COLUNAS DE NÍVEL DE LINHA ................ todas as colunas de origem +
data_quality_rules_pass / _fail / _skip (ARRAY),
data_quality_evaluation_result (Passed|Failed), stored_on,
region, account_idEsta é a maior mudança de 2026 no assunto desta lição: seu histórico de qualidade vira uma tabela Iceberg comum, com as mesmas ferramentas de Athena, Lake Formation, time travel e QuickSight do resto do lakehouse.
3.3 O contrato de alertas tem um checkbox escondido
Toda avaliação concluída emite um evento do EventBridge:
{
"detail-type": "Data Quality Evaluation Results Available",
"source": "aws.glue-dataquality",
"detail": {
"contextType": "GLUE_DATA_CATALOG",
"runId": "dqrun-9f2c...",
"databaseName": "lakehouse_silver",
"tableName": "orders",
"catalogId": "111122223333",
"resultID": "dqr-...",
"rulesetNames": ["silver_orders_strict"],
"state": "FAILED",
"score": 0.928,
"rulesSucceeded": 13,
"rulesFailed": 1,
"rulesSkipped": 0
}
}A variante de ETL usa contextType: "GLUE_JOB" com jobId, jobName e evaluationContext. O caminho paralelo do CloudWatch é igualmente simples: "Cada avaliação do AWS Glue Data Quality emite um par de métricas chamadas glue.data.quality.rules.passed… e glue.data.quality.rules.failed" sob o namespace Glue Data Quality, publicado por tabela e por ruleset.
Não desmarque "Publish metrics to Amazon CloudWatch." A AWS documenta isso de forma direta: para avaliações no Data Catalog e em jobs de ETL, "a opção Publish metrics to Amazon CloudWatch, que vem selecionada por padrão, deve permanecer selecionada para que a publicação no EventBridge funcione." Times desligam ela para economizar alguns dólares de métricas custom e perdem as métricas do CloudWatch e os eventos do EventBridge no mesmo clique: alarmes, notificações e remediação ficam em silêncio enquanto as regras continuam rodando e o score continua caindo. A consequência de IAM é a mesma chave: a publicação precisa de cloudwatch:PutMetricData condicionado a "cloudwatch:namespace": "Glue Data Quality".
A preferência declarada da AWS: "Nossa abordagem recomendada é configurar alertas de qualidade de dados usando o Amazon EventBridge, porque o Amazon EventBridge requer uma configuração única para alertar os clientes." A alternativa com CloudWatch é um alarme padrão: glue.data.quality.rules.failed, estatística Sum, período de 1 minuto, limiar ≥ 1, ação = tópico SNS.
- 📚 Você sabia? O score não é uma nota de qualidade que você passa adiante: a AWS o define como "a porcentagem de regras de qualidade de dados que passaram para a entrada". Um ruleset com uma regra fraca pontua 1.0 enquanto 40% das linhas são lixo. É por isso que existem as colunas de nível de linha e as tabelas de resultado: score para o alerta, linhas para a correção (Glue Developer Guide, acesso em 2026-10-11).
4. Deequ, PyDeequ e DataBrew: os caminhos laterais verificados
4.1 Deequ: a engine, e onde ele ainda compensa
O anúncio do PyDeequ da AWS descreve o original: o Deequ "é usado internamente na Amazon para verificar a qualidade de muitos grandes conjuntos de dados de produção… O sistema calcula métricas de qualidade de dados regularmente (com cada nova versão de um conjunto de dados), verifica restrições definidas pelos produtores de dados e publica os conjuntos de dados para os consumidores em caso de sucesso. Em casos de erro, a publicação do conjunto de dados pode ser interrompida e os produtores são notificados para agir." Calcular → verificar → publicar-ou-parar é o loop que o Glue DQ colocou como produto em 2023 (AWS Big Data Blog, 2020-12-30, atualizado em junho de 2024).
Motivos legítimos restantes para rodar você mesmo o Deequ, segundo os próprios posts da AWS:
Motivo | Veículo documentado pela AWS | Restrição dura |
|---|---|---|
Analyzers/restrições customizados que o DQDL não expressa | PyDeequ no EMR | O JAR do Deequ precisa corresponder à sua versão do Spark: pydeequ.deequ_maven_coord → com.amazon.deequ:deequ:2.0.3-spark-3.3; "é crítica a fornecer as coordenadas Maven corretas do Apache" |
Validação de migração: diff de métricas origem vs destino | Job no EMR grava resultados em uma tabela do Glue (por exemplo db_deequ.db_migration_validation_result), auditado no Athena | Mesmo pinning de JAR/Spark |
Conjuntos de dados muito pequenos que precisam de startup rápida | Deequ no AWS Lambda com o Spark Runtime for AWS Lambda (SoAL) | O SoAL "é maior que o limite de 250 MB para empacotamento de arquivo zip" → imagem de contêiner; a AWS recomenda o Glue Data Quality "para jobs Spark que rodam mais de 15 minutos ou arquivos maiores (mais de 1 GB)" |
Checks de anomalia sobre um repositório de métricas | FileSystemMetricsRepository + Holt-Winters, resultados no SNS | A receita publicada de Holt-Winters foi verificada "no AWS Glue 2.0, pydeequ release/1_1_1, Spark 2.4 e deequ-1.1.0_spark-2.4-scala-2.11.jar (apenas)": fixe a versão ou não use |
O PyDeequ "suporta Spark até a versão 3.3.0" segundo as notas do PyDeequ 1.1.x que a AWS vincula, e "pode funcionar dentro do Amazon EMR e do SageMaker". O resumo honesto de 2026: a maior parte do valor do Deequ já está dentro do Glue Data Quality; recorra à biblioteca quando o runtime for exótico ou a restrição não for expressível.
4.2 DataBrew: regras, mas não DQDL
A história de qualidade do DataBrew é um ruleset de CheckExpressions avaliado dentro de um profile job: "Se qualquer um dos critérios de uma regra não for atendido, o ruleset como um todo reprova na validação", e a execução "produz um relatório de validação além do perfil de dados" no mesmo local. Forma da API: CheckExpression, ColumnSelectors (Name ou Regex), Disabled, SubstitutionMap, Threshold (Type/Unit/Value). Restrições a respeitar: apenas colunas de tipos simples (string, números, boolean) participam, e as regras ficam na aba Recommendations da tela de ruleset.
Ao concluir, "o DataBrew envia um evento do Amazon CloudWatch com os detalhes dessa execução de job… para cada ruleset validado… e o evento contém o resultado (SUCCEEDED, FAILED ou ERROR)" mais um link para o relatório. Esse evento é o seu padrão do EventBridge para checks de propriedade dos analistas. As métricas ficam no namespace AWS/DataBrew, o exemplo documentado é SessionCount.
As regras do DataBrew não são DQDL. A sintaxe de expressão de check, o console, os eventos, o relatório e a semântica de falha são todos diferentes do Glue Data Quality. Copiar Completeness "col" > 0.95 para um ruleset do DataBrew, ou um CheckExpression do DataBrew para um ruleset do Glue, falha nos dois sentidos. O Prescriptive Guidance da AWS mantém os dois separados por um motivo: DataBrew para checks de analista sem código, Glue Data Quality para DQDL embutido em job e em catálogo, Deequ para um relatório de métricas/restrições, código customizado para todo o resto.
4.3 Exemplo resolvido E2: quanto custa um gate de qualidade, e onde colocá-lo
O benchmark da própria AWS: 104 colunas, 1 milhão de linhas, 10 DPUs (AWS Big Data Blog, 2024-03-12):
Exemplo resolvido E2 - custo e colocação da execução de DQ, lista de us-east-1, em outubro de 2026
BENCHMARK (104 colunas, 1M linhas, 10 DPUs)
0 regras ......... 53,2 s ... 0,15 DPU-hr .... $0,06
10 regras ........ ~150 s ... 0,42 DPU-hr .... $0,18
100 regras ....... -- ....... 0,52 DPU-hr .... $0,23
400 regras ....... 445,7 s .. 1,24 DPU-hr .... $0,54
-> o custo é dominado pela VARREDURA da tabela, não pela contagem de regras:
"o custo… só começa a aumentar após avaliar rulesets com
mais de 100 regras, permanecendo constante abaixo desse número."
COLOCAÇÃO, mesmo ruleset silver de 20 regras (30 execuções/mês)
A. Tarefa de catálogo independente, 5 DPUs x 20 min
5 x (20/60) x $0.44 ............................. $0.73 / execução
$0.73 x 30 ..................................... $21.90 / mês
na taxa Flex de $0.29 .......................... $0.48 / execução
B. Dentro do job silver existente (6 DPUs, +5 min marginal)
6 x (5/60) x $0.44 ............................. $0.22 / execução
$0.22 x 30 ..................................... $6.60 / mês
E você ganha resultados de nível de linha -> a quarentena funciona
C. Add-on de anomaly detection: 20 estatísticas x 1 DPU x 15/3600 h x $0.44
.............................................. +$0.037 / execução
("entre 10-20 segundos" por estatística, em média)
D. Piso da tarefa de perfil/qualidade .............. 2 DPUs, mínimo de 1 minuto
CONFLITO DE PREÇO A VERIFICAR ANTES DE ORÇAR
aws.amazon.com/glue/pricing traz dois números de DQ na mesma
data de acesso (2026-10-11): os exemplos resolvidos do Data Quality
calculam a $0.44 por DPU-hour (tarefa de recomendação 5 DPUs x 10 min
= "$0.37"; avaliação de catálogo 5 DPUs x 20 min = "$0.73"; DQ de ETL
6 DPUs x 20 min = "$0.88", Flex "$0.58"), enquanto uma linha da
tabela de preços lê Glue Data Quality = "$0.22 por DPU-hour".
Intervalo para a opção A: $11.00 - $21.90 / mês. Verifique no console.Duas conclusões sobrevivem à ambiguidade de preço: orçe pelo tamanho da tabela × frequência, não pela contagem de regras, e para um desenho de quarentena a avaliação dentro do job domina porque é mais barata e é o único caminho que pode nomear as linhas.
5. Quarentena: um padrão, não um produto
5.1 Três ações, dois checkpoints
A InsuranceLake, sample da AWS Solutions Library, formaliza o que todo pipeline de produção precisa: três ações em dois checkpoints de pipeline:
Ação | Comportamento | Use quando |
|---|---|---|
Warn | Apenas registra ou notifica; o fluxo segue | Problemas cosméticas, primeiras execuções de uma regra nova |
Quarantine | Remove as linhas reprovadas do fluxo e grava em um armazenamento de quarentena separado + uma tabela de quarentena no Data Catalog | Defeitos de nível de linha com significado de negócio |
Halt | Para o pipeline / reprova o job | O conjunto de dados está inutilizável a jusante |
Checkpoints: before_transform ("imediatamente após o mapeamento de schema… antes de qualquer transformação ser executada") e after_transform ("logo antes de salvar os dados no bucket Cleanse"). A regra que importa para o desenho do seu ruleset: "a expressão de qualidade de dados precisa ser escrita usando resultados de nível de linha para avaliar e colocar linhas individuais em quarentena" e "regras que dependem de razões ou limiares não são suportadas como regras de quarentena."
A InsuranceLake também mostra como fica um halt por frescor quando você quer que o pipeline pare em vez de separar:
CustomSql 'SELECT count(*) FROM primary
WHERE claims_last_updated >= now() - interval 24 hours' >= 15.2 A separação, em código
from awsglue.transforms import EvaluateDataQuality, Filter
rowLevelOutcomes = EvaluateDataQuality.apply(
frame=orders_frame,
ruleset=quarantine_capable_ruleset, # only row-level rules
publishing_options={
"dataQualityEvaluationContext": "silver_orders",
"enableDataQualityCloudWatchMetrics": True,
"enableDataQualityResultsPublishing": True,
"resultsS3Prefix": "s3://lakehouse-dq/results/"
})
clean = Filter.apply(frame=rowLevelOutcomes,
f=lambda r: r["DataQualityEvaluationResult"] == "Passed")
dirty = Filter.apply(frame=rowLevelOutcomes,
f=lambda r: r["DataQualityEvaluationResult"] != "Passed")
# clean -> s3://lakehouse-silver/orders/dt=2026-10-10/ (Iceberg commit)
# dirty -> s3://lakehouse-quarantine/orders/dt=2026-10-10/ + catalog table
# glue.data.quality.rules.failed metric -> EventBridge -> SNS/LambdaA orientação do Studio da AWS também oferece uma variante de primeira parte: em Data quality actions, escolha Fail job after loading target data, que aparece como AssertionError: The job failed due to failing DQ rules for node: …: halt sem quarentena.
5.3 Exemplo resolvido E3, o loop de quarentena com números reais
Exemplo resolvido E3 - um dia ruim em lakehouse_silver.orders, em outubro de 2026
Entrada ................................. 1.000.000 linhas, 480 arquivos
Regras avaliadas (capazes de quarentena) .. Completeness customer_id,
Uniqueness order_id,
ColumnValues order_status,
CustomSql total_amount = item_sum
Linhas aprovadas ......................... 987.520 (98,752%)
Linhas em quarentena ..................... 12.480 (1,248%)
- customer_id nulo ..................... 8.900
- order_id duplicado ................... 2.310
- order_status ilegal ................. 1.150
- divergência de valor ................ 120 <- forma de linha do CustomSql
Score do ruleset ......................... 0,75 (3/4 regras aprovadas)
-> o score diz "reprovado", as LINHAS dizem "1,248% do lote está sujo"
Gravação da quarentena ................... s3://lakehouse-quarantine/orders/
dt=2026-10-10/ (~4,1 MB Parquet)
Alerta ................................. EventBridge state=FAILED -> SNS
-> Lambda -> ticket + objeto marcador
Backfill ......................................................
1. o analista corrige 120 linhas de valor a montante, reemite 340 arquivos corrigidos
2. Step Functions "replay-partition" limpa a partição de quarentena
de dt=2026-10-10 (a InsuranceLake limpa o armazenamento de quarentena
e as tabelas no reload da partição)
3. o mesmo job reprocessa a partição; bookmark rebobinado ou um novo
transformation_ctx, saída para um prefixo NOVO ou MERGE no Iceberg
4. commit do silver + refresh do gold; a tabela de resultados de DQ registra a aprovação
Custo do reprocesso (6 DPUs x 5 min marginal, $0.44/DPU-hr) ... $0.22As duas últimas linhas são o ponto: quarentena sem um caminho de backfill é só perda de dados com etapas extras. E como agora os resultados são tabelas Iceberg, a pergunta "como o gold estava antes da partição ruim" se responde com time travel em vez de um restore.
5.4 Write-Audit-Publish: a forma nativa do Iceberg
O padrão WAP da AWS substitui a cópia física de quarentena por branches: grave tudo em uma branch stg → rode o Glue DQ contra ela → filtre as linhas aprovadas em uma branch audit → fast_forward para main com o procedimento fast_forward do Spark. O conjunto de regras de demonstração do blog verificava a temperatura do sensor "entre −10 e 50 °C", e nomeia o trade-off com honestidade: "O principal desafio do padrão WAP é a latência adicional que ele introduz." A abordagem de dead-letter-queue (o prefixo de quarentena no S3) é a outra opção documentada: escolha pela latência que você pode pagar ou pelo armazenamento duplicado que você pode tolerar.
Como responder
Exercício de ordenação com 7 itens. Coloque-os na ordem correta e verifique a resposta.
Arraste o loop de quarentena e backfill para a ordem em que ele precisa rodar:
- 📚 Você sabia? Bookmarks rastreiam origens, não destinos. A documentação da AWS diz de forma direta que "quando você rebobina ou redefin um bookmark, o AWS Glue não limpa os arquivos de destino porque pode haver vários destinos e os destinos não são rastreados com job bookmarks." É por isso que o passo de backfill acima grava em um prefixo novo ou faz MERGE, reexecutar no mesmo caminho anexa duplicatas que a sua regra
IsPrimaryKeydepois vai cumpridamente colocar em quarentena na próxima execução (Glue Developer Guide, job bookmarks, acesso em 2026-10-11).
6. SLOs de frescor: três relógios e a aritmética
6.1 Separe os relógios antes de definir uma meta
Relógio | Definição | Onde você mede |
|---|---|---|
Tempo de evento | Quando o evento de negócio aconteceu: carregado nos dados | Uma coluna de timestamp ( order_ts) |
Tempo de chegada | Quando o objeto atingiu o prefixo bronze | LastModified do S3 |
Tempo de disponibilidade | Quando o commit do silver/gold tornou a consulta possível no Athena | Commit da tabela / timestamp do resultado |
SLO de frescor = P95(disponibilidade − evento) ≤ meta. O pipeline contribui com dois intervalos: chegada − evento (atraso de ingestão) e disponibilidade − chegada (atraso de processamento + DQ + backfill). O DQDL dá duas codificações: DataFreshness contra uma coluna de timestamp da tabela ("Verifica se os dados estão frescos", métrica Column.[Column].DataFreshness.Compliance, resultados de nível de linha: Sim) e FileFreshness contra os timestamps de arquivo do S3 (caminho de arquivo/pasta + limiar, nível de linha: Não).
6.2 Exemplo resolvido E4: um SLO de 3 horas, aritmética P95
Exemplo resolvido E4 - matemática do SLO de frescor, 30 lotes diários, em outubro de 2026
SLO: P95(disponibilidade - evento) <= 3 h = 180 min
INTERVALO MÉDIA P95
CDC da origem: evento -> bronze .... 35 min 55 min
bronze -> silver (incl. DQ) ........ 12 min 22 min
silver -> gold + catálogo .......... 9 min 15 min
espera de orquestração (offset de
agendamento + Step Functions) .... 38 min 70 min
------- -------
soma dos P95 (conservador, some
os P95 de cada componente) ....... 94 min 162 min = 2,7 h
FOLGA vs SLO de 3 h ................ 18 min
ALAVANCAS, da mais barata:
1. cortar o offset de agendamento de 38 min (alinhamento de cron do EventBridge)
2. paralelizar a agregação do gold
3. ajustar o CDC / aumentar a concorrência do DQ
ESCALADA DE ALERTA:
- DQDL: DataFreshness "order_ts" > (now() - 2 days) where dt = yesterday
- CloudWatch: RowCount do silver = 0 (pipeline morto, não lento)
- EventBridge: state do job Glue FAILED
- Dashboard: tendência de P95 de frescor móvel de 7 diasSome os P95 dos componentes em vez de fazer a média das médias, o P95 de uma soma é limitado pela soma dos P95, então 162 minutos é o número defensável para colocar na frente de um stakeholder, e os 18 minutos de folga dizem qual alavancagem puxar antes de estourar. A escada de falhas é deliberadamente redundante: uma regra de frescor pega dado velho, um alarme de RowCount zero pega um pipeline morto, e um evento de job FAILED pega o crash, três problemas diferentes que todos parecem com "o dashboard está velho".
6.3 Codificando volume e schema drift como alarmes
Sinal | DQDL / métrica | Forma do alarme | O que ele realmente significa |
|---|---|---|---|
Frescor | DataFreshness, FileFreshness, FileMatch | glue.data.quality.rules.failed Sum ≥ 1, 1 min | Envelhecimento ou um feed parado |
Volume | RowCount > 1000, RowCount <= avg(last(10)) * 1.5 (dinâmico) | Mesma métrica, escopada ao ruleset de volume | Colapso (0 linhas) ou uma carga duplicada desenfreada |
Schema drift | SchemaMatch, ColumnExists, ColumnDataType, ColumnNamesMatchPattern, ColumnLength | EventBridge em state: FAILED filtrado para o ruleset de schema → Lambda abre um ticket | Uma origem mudou de forma embaixo de você |
Value drift | ColumnValues … with threshold, DetectAnomalies na métrica de outra regra | Alarme de score + estatísticas de anomalia (cobrado por estatística) | A distribuição mudou, não apenas quebrou |
Crash de pipeline | n/a: evento de falha de job | EventBridge em job do Glue FAILED | Nada rodou |
O DetectAnomalies merece menção especial: ele "verifica anomalias nas métricas relatadas por outro tipo de regra", o que transforma as regras de limiar de ontem em um baseline auto-ajustável: a 1 DPU por estatística, por execução, e é por isso que a AWS recomenda habilitá-lo de forma seletiva.
7. Observabilidade operacional: um dashboard por camada
7.1 Logs por camada
Camada | Para onde vão os logs | Notas |
|---|---|---|
Jobs do Glue | /aws-glue/jobs/output (stdout/stderr), /aws-glue/jobs/error (system, daemon, Glue Logger), /aws-glue/jobs/logs-v2 (continuous logging: driver + executor, em tempo real) | Redirecione com --continuous-log-logGroup; Glue 4.0+/5.0 "todos os jobs têm capacidades de logging em tempo real"; uma security configuration anexa o seu nome; groups criptografados com KMS precisam de logs:AssociateKmsKey |
Falhas de job do Glue | Job insights no mesmo group /aws-glue/jobs/logs-v2/ | -job-insights-rca-driver dá o número da linha do script que falhou, a última ação do Spark e uma lista concisa de eventos; um stream baseado em regra acrescenta a análise de causa raiz |
Custo dos logs | Um group da classe Logs Infrequent Access, por exemplo /aws-glue/jobs/logs-v2-infrequent-access, apontado pelo --continuous-log-logGroup | Ressalvas: "Você não pode mudar a classe de log de um group depois que ele é criado", e o Logs IA não pode ser visualizado no console padrão de Logs |
Redshift Serverless | /aws/redshift/<namespace>/<log_type> para logs de conexão, de usuário e de atividade | Criados automaticamente se faltarem: com retenção Never Expire. Defina uma política de retenção ou a fatura cresce sem você |
Athena | Métricas em AWS/Athena (opt-in por workgroup: "publish query metrics to CloudWatch") + eventos de mudança de estado | EngineExecutionTime, ProcessedBytes, TotalExecutionTime; dimensões QueryState, QueryType, WorkGroup. O histórico detalhado de consultas tem 30 dias: auditoria de longo prazo precisa de EventBridge → Lambda → Firehose → S3 |
Orquestração | X-Ray: Lambda (modos de tracing Active vs PassThrough) e Step Functions (service map) | Traces graváveis por 7 dias, consultáveis por 30 dias; tamanho mínimo garantido de trace do Step Functions 100 KiB. O X-Ray não rastreia executores do Spark dentro do Glue |
Configurações multi-conta centralizam com filtros de assinatura cross-account, um destino de logs Firehose/Kinesis, ou CloudWatch Logs data centralization no nível de Organizations (os nomes de log group de destino aceitam ${source.accountId}, ${source.region}, ${source.logGroup}, ${source.org.id}).
7.2 O mapa de dashboards
A recomendação do Prescriptive Guidance da AWS é um dashboard por preocupação: "um dashboard do CloudWatch pode mostrar aos usuários o status das cargas… ou que porcentagem dos dados deles foi descartada por baixa qualidade ou quais fontes têm o máximo de falhas." Para este lakehouse isso vira um dashboard por camada de medalhão mais um painel de operações de dados no nível da conta:
Free tier em outubro de 2026: 10 métricas custom, 3 dashboards referenciando até 50 métricas cada, 10 métricas de alarme, 1 milhão de requisições de API e 5 GB de ingestão de logs por mês; métricas custom custam $0,30 por métrica-mês nos primeiros 10.000, depois as faixas de $0,10 e $0,05. Dashboards e alarmes são rateados por hora a partir da criação: um alarme sem uso não é grátis, e alarmes de anomaly detection "incurrem custos por cada métrica que você listar na expressão de métrica do alarme, mais dois custos adicionais de métrica de alarme."
Como responder
Exercício de associação com 8 pares. Associe cada item à esquerda com a resposta à direita.
Combine cada sinal observado com o alarme que você deveria construir sobre ele:
Arraste as respostas daqui:
8. Data events do CloudTrail: prefixos escopados e a fatura
O CloudTrail é a trilha de auditoria do plano de dados, e, sem escopo, a fatura surpresa. "Por padrão, trails e event data stores não registram data events. Cobranças adicionais se aplicam aos data events." Habilitá-los exige advanced event selectors com eventCategory Equals Data e resources.type Equals AWS:S3:Object, escopados com resources.ARN StartsWith, repare que a barra final faz parte do ARN: arn:aws:s3:lakehouse-bronze/.
Regras da estrada:
- "Seletores não suportam o uso de curingas como
*": você enumera prefixos, não faz glob. - Seletores básicos: até 5 event selectors e 250 data resources por trail; seletores avançados permitem até 500 valores especificados entre condições, e os dois estilos não podem ser misturados.
- Exclusões são filtros gratuitos:
{"Field": "eventSource", "NotEquals": ["s3lifecycle.amazonaws.com"]}derruba o ruído de lifecycle;readOnly = falsedá auditoria somente de escrita para uma landing zone. - Preços: data events $0.10 por 100.000 entregues ao S3 (agregações $0.03 por 100.000 analisados); management events primeira cópia grátis, cópias adicionais $2.00 por 100.000. Management events respondem quem executou
StartJobRun/GrantPermissions/StartQueryExecution; data events respondem quem tocou em qual objeto.
8.1 Exemplo resolvido E5: três seletores, uma fatura
Exemplo resolvido E5 - auditoria de data events escopada para o lakehouse, em outubro de 2026
Um trail, TRÊS seletores avançados (nunca o bucket inteiro):
SELETOR 1 - chegada no bronze (somente escrita)
eventCategory = Data, resources.type = AWS::S3::Object
resources.ARN StartsWith arn:aws:s3:::lakehouse-bronze/
eventName Equals [PutObject, CompleteMultipartUpload], readOnly = false
volume 20.000.000 events/mês
custo . (20.000.000 / 100.000) x $0.10 ............. $20.00 / mês
SELETOR 2 - bucket de quarentena (leitura + escrita, pequeno, auditoria total)
resources.ARN StartsWith arn:aws:s3:::lakehouse-quarantine/
volume 500.000 events/mês
custo . (500.000 / 100.000) x $0.10 ................ $0.50 / mês
SELETOR 3 - prefixo silver de PII (leitura + escrita)
resources.ARN StartsWith arn:aws:s3:::lakehouse-silver/pii/
volume 2.000.000 events/mês
custo . (2.000.000 / 100.000) x $0.10 .............. $2.00 / mês
-----------------------------
TOTAL ESCOPADO ................................. $22.50 / mês
EQUIVALENTE SEM ESCOPO (o próprio exemplo da AWS:
300.000.000 events x $0.1/100.000) ............. $300.00 / mês
ECONOMIA ....................................... $277.50 / mês
Management events (primeira cópia grátis) mantêm a história do "quem executou o quê":
StartJobRun, GrantPermissions, StartQueryExecution -> dashboard grátis.Os data events do CloudTrail são a clássica fatura surpresa de analytics. Eles vêm desligados por padrão, são cobrados por evento, e um prefixo bronze movimentado com uploads multipart emite tanto PutObject quanto CompleteMultipartUpload para cada objeto. Escopo um seletor por prefixo sensível, chegada no bronze, quarentena, PII no silver, e mantenha readOnly = false na landing zone, onde a auditoria de leitura não acrescenta nada. Desligado-por-padrão somado ao preço por evento é exatamente por que a AWS criou os advanced event selectors: "seletores granulares para registrar data events, o que pode ajudar você a controlar custos registrando apenas os data events de interesse" (CloudTrail User Guide, acesso em 2026-10-11).
9. Três planos: DataZone, o catálogo Glue, CloudTrail
9.1 Para que serve cada plano
Plano | Serviço | Responde | Explicitamente não responde |
|---|---|---|---|
Catálogo técnico + permissões | AWS Glue Data Catalog + Lake Formation | Quais tabelas/colunas/partições existem? Quem pode lê-las? | Quem as leu; de onde uma coluna foi derivada |
Catálogo de negócios + lineage | Amazon DataZone | O que esses dados significam? De onde vieram e o que os consome? Em linguagem de negócio: "catalogar dados em toda a sua organização com contexto de negócio", mais nomes de negócio, descrições, termos de glossário, metadata forms | Aplicação de permissões; auditoria de chamadas de API |
Auditoria de acesso | AWS CloudTrail | Qual principal chamou qual API em qual recurso, quando, de onde? | Derivação no nível de coluna; significado de negócio |
O registro no Lake Formation autoriza o acesso a um local, é um escopo de permissão, não uma aresta de lineage. O CloudTrail registra atividade, não é um grafo de derivação. Apresentar qualquer um dos dois como "lineage" é a confusão mais comum deste espaço.
9.2 Lineage: as fontes que você consegue nomear de fato
Fonte | O que você obtém | Status |
|---|---|---|
Execuções de data source do Glue no DataZone | Nós de dataset para ativos do Glue ou do Redshift publicados no catálogo do DataZone são gerados automaticamente; a execução do Data Source "busca informações dos metadados de tabela para montar o lineage" para tabelas S3, DynamoDB, Catalog, Delta Lake, Iceberg e Hudi armazenadas no Amazon S3: JDBC e DocumentDB/MongoDB não são suportados | Verificado |
Histórico de consultas do Redshift no DataZone | "As executions de lineage capturam consultas executadas para um banco de dados dado e geram eventos de lineage" | Verificado |
Eventos compatíveis com OpenLineage via APIs do DataZone | O data lineage no DataZone é "um recurso compatível com OpenLineage… de sistemas habilitados para OpenLineage ou por meio de APIs": schedulers, warehouses e engines SQL enviam eventos para dentro; precisamos habilitar opt-in porque algumas conexões/jobs podem ser de teste | Verificado (lado da ingestão) |
Execuções de job do Glue | A API JobRun e os eventos de job do EventBridge dão as arestas S3 → tabela dos seus próprios pipelines | Verificado como metadado de execução |
QuickSight | Entra nesta lição como consumidor das tabelas de resultados de DQ e de custo no Athena, o papel em que os próprios blogs da AWS o usam | Apenas consumidor |
CloudTrail | Quem acessou o quê, o plano de auditoria acima | Auditoria, não lineage |
O DataZone fica em cima do catálogo de negócios: você cria data sources para Glue e Redshift, importa metadados técnicos para o inventário de um projeto, cura com nomes de negócio/termos de glossário/metadata forms, e publica: "Apenas a versão mais recente do ativo do inventário pode ser publicada no catálogo." Um consumidor então vê "uma visualização do lineage desse ativo com 1 nível upstream e downstream." É uma camada de governança e descoberta, não um substituto do AWS Glue Data Catalog que o Athena e o Redshift Spectrum consultam.
- 📚 Você sabia? O lineage do DataZone chegou ao geral em 2024-12-03, e o anúncio é explícito de que a captura é automática para Glue e Redshift e programática para todo o resto: os produtores "hidratam as informações de lineage programaticamente criando nós de lineage customizados por meio de APIs que aceitam eventos compatíveis com OpenLineage de componentes de pipeline existentes, como schedulers, warehouses, ferramentas de análise e engines SQL." Então o teste de integração do seu lakehouse é simples: publique um ativo do Glue, execute o seu data source, e veja se o nó upstream aparece, antes de prometer lineage ponta a ponta para alguém (AWS News Blog, 2024-12-03).
Legenda para decorar: catálogo = metadados técnicos e permissões (Glue + Lake Formation); DataZone = catálogo de negócios e lineage; CloudTrail = auditoria de acesso. Três planos, três ferramentas.
10. Exemplo resolvido E6: EventBridge → SNS → Lambda de remediação, ligado
10.1 A regra
{
"source": ["aws.glue-dataquality"],
"detail-type": ["Data Quality Evaluation Results Available"],
"detail": {
"context": {
"contextType": ["GLUE_DATA_CATALOG"],
"databaseName": ["lakehouse_silver"],
"tableName": ["orders"]
},
"state": ["FAILED"],
"rulesetNames": ["silver_orders_strict"]
}
}10.2 Os alvos, em ordem
Alvo 1, tópico SNS dq-alerts (email / Chatbot para o canal humano). A entrega do SNS para Lambda e SQS é isenta de cobrança de entrega do SNS, "Sem cobrança por entregas para SQS Queues. Aplica-se a precificação padrão do SQS", e idem para o Lambda.
Alvo 2: Lambda dq-remediate:
import json, os, boto3
from datetime import datetime, timezone
glue = boto3.client("glue")
s3 = boto3.client("s3")
sfn = boto3.client("stepfunctions")
def handler(event, context):
d = event["detail"]
# 1. fetch the failing rules and metrics for this run
res = glue.get_data_quality_result(ResultId=d["resultID"])
failing = [r for r in res.get("RuleResults", []) if r.get("RuleResult") == "FAIL"]
# 2. drop a marker object so the state is queryable in Athena
ts = datetime.now(timezone.utc).strftime("%Y/%m/%d/%H%M%S")
s3.put_object(
Bucket="lakehouse-quarantine",
Key=f"_alerts/{d['databaseName']}/{d['tableName']}/{ts}.json",
Body=json.dumps({"runId": d["runId"], "score": d.get("score"),
"failedRules": [f["RuleName"] for f in failing]}).encode())
# 3. start the replay of the affected partition
sfn.start_execution(
stateMachineArn=os.environ["REPLAY_SFN"],
input=json.dumps({"database": d["databaseName"], "table": d["tableName"],
"ruleset": d["rulesetNames"][0], "resultId": d["resultID"]}))
return {"failed": len(failing)}10.3 O IAM que cabe, e quanto custa
IAM do E6 (menor privilégio, em outubro de 2026)
Função da tarefa de DQ ..... glue:CreateDataQualityRuleset,
glue:StartDataQualityRulesetEvaluationRun,
glue:StartDataQualityRuleRecommendationRun, glue:GetDataQualityResult,
glue:PublishDataQuality, glue:PutDataQualityStatisticAnnotation,
glue:PutDataQualityProfileAnnotation
+ cloudwatch:PutMetricData com condição
"cloudwatch:namespace": "Glue Data Quality" <- necessário para as métricas
+ s3:PutObject no prefixo de resultados <- necessário para resultados no S3
Função da Lambda ........... glue:GetDataQualityResult em dataQualityRuleset/*,
s3:PutObject no prefixo _alerts/,
states:StartExecution na máquina de estados de replay
Custo mensal do E6, lista de us-east-1, em outubro de 2026
EventBridge custom events .. 12 eventos de DQ/dia x 30 = 360/mês
360 / 1.000.000 x $1.00 ............................. $0.00036
EventBridge -> Lambda entrega na mesma conta ............ $0.00
SNS -> Lambda entrega ................................... $0.00 (sem cobrança do SNS)
Chamadas do Lambda (12/mês, 128 MB, ~200 ms) ............ free tier
Métricas custom do CloudWatch: 2 métricas de DQ + 4 métricas de camada
6 x $0.30 ........................................... $1.80 / mês
(o free tier cobre as primeiras 10 métricas custom)
Alarmes do CloudWatch x 3 (rateados por hora, resolução padrão) ... verifique no console
-----------
TOTAL DO PLANO DE REMEDIAÇÃO .......................... ~$1,80 / mêsA conclusão é econômica: o caminho de alerta é quase grátis; o caminho de dados é o que custa dinheiro. E essa é a forma correta: um lakehouse que aciona alguém por $1,80 por mês e gasta $21,90 por mês de fato medindo os próprios dados.
Atualizações de 2026 (em outubro de 2026)
O que mudou na história de qualidade, observabilidade e lineage entre 2025 e outubro de 2026: cada linha conferida contra uma fonte primária da AWS:
- Recomendações de regra ADVANCED pelo Amazon Bedrock (2026-09-18; histórico de documentação 2026-09-25). O Glue Data Quality agora pode usar "metadados da tabela e linhas amostradas para gerar Data Quality Definition Language (DQDL)" em um modo ADVANCED: um assistente de rascunho assentado em cima do mesmo DQDL, não uma linguagem nova (notas de versão do Glue DQ e histórico de docs, acesso em 2026-10-11).
- Views do Athena agora estão no escopo (2026-09-18). A página inicial agora diz que o Glue DQ "avalia tabelas e views do Amazon Athena suportadas que estão armazenadas no AWS Glue Data Catalog": materiais mais antigos afirmando que views do Athena não são suportadas estão desatualizados; confira na página ao vivo antes de ensinar uma exclusão.
- Distribution Analyzer e tabelas de resultados Iceberg (2026-07-27). Você pode "calcular distribuições de frequência para as suas colunas de dados" (histogramas com bins para colunas numéricas) e "gravar resultados de qualidade de dados em tabelas Apache Iceberg no AWS Glue Data Catalog", o histórico de qualidade vira uma tabela de lakehouse de primeira classe, com time travel.
- O Glue Data Quality continua sendo o produto de qualidade atual (GA 2023-05-24). O marco do Big Data Blog de 2023, regras rodando em tempo de ETL ou em agendamento, visualizações de score no console, continua sendo o estado do produto em outubro de 2026, com as releases de 2025 to 2026 (labels, constantes, consultas de pré-processamento, regras de arquivo, resultados Iceberg, recomendações pelo Bedrock) empilhadas por cima em vez de substituídas.
- S3 Metadata (2025-01-27) coloca metadados de objeto atrás do SQL. "O S3 Metadata facilita consultar e filtrar metadados de objetos S3 usando SQL… você pode consultar metadados de objetos com o Amazon Athena", com tabelas do S3 Metadata aparecendo no AWS Glue Data Catalog: uma nova fonte de fatos operacionais adjacentes a lineage (contagens, tamanhos e timestamps de objetos) para dashboards de frescor.
- Domínios do DataZone sobem para o SageMaker Unified Studio (2025-09-11), e o re:Invent 2025 adicionou evals e controles de política do Bedrock AgentCore ao lado do "onboarding com um clique do SageMaker Unified Studio". O DataZone permanece a espinha dorsal de governança e metadados da IDE unificada de dados + ML + analytics, de modo que o plano de catálogo de negócios e lineage que esta lição descreve é agora a camada sobre a qual o Unified Studio se apoia (AWS Big Data Blog, 2025-09-11; anúncios principais do AWS re:Invent 2025, 2025-12-01).
Casos Reais
A AWS publica como isso fica em escala. Todo número abaixo é afirmação de cliente ou da AWS e não auditada, com fonte e data nomeadas, o ponto examinável é o padrão.
Caso A, Siemens: logs centralizados que transformaram dias em 10 minutos
Elemento | Detalhe |
|---|---|
Cliente | Siemens, manufatura industrial / tecnologia: divisão de Cloud Security Operations |
Desafio | Mais de 800 contas AWS produzindo logs de segurança e de acesso que não podiam ser armazenados ou pesquisados centralmente; investigações exigiam correlação manual |
Serviços | Amazon Security Lake como armazenamento central no S3, logs de acesso ao servidor do Amazon S3 e VPC Flow Logs como fontes, Cribl (AWS Partner) roteando o subconjunto relevante adiante para o Splunk |
Padrão | Pouse tudo de barato no S3 e projete apenas as fatias caras na engine de análise: a mesma economia do lake de analytics, aplicada à telemetria de observabilidade |
Resultado como publicado | "5 to 7 TB de dados de segurança diariamente" ingeridos com "apenas os 600 GB mais relevantes" encaminhados: uma redução de 90 por cento; $1.3 milhões economizados por ano ao agregar mais logs; onboarding de novas fontes cortado para 1 to 2 dias; tempo de identificação de causa raiz reduzido em 75%; em uma investigação, "identificou que dados no Amazon S3 foram impactados em um evento dentro de 10 minutos em vez de vários dias" |
Fonte | Estudo de caso da AWS, Siemens Boosts Security Visibility Across 800+ AWS Accounts Using Amazon Security Lake (sem data; acesso em 2026-10-11) |
A lição para este curso é a forma da resposta: o 10-minutos-versus-vários-dias da Siemens é o que log groups por camada, seletores escopados e um dashboard por camada compram para você: você não diagnostica mais rápido porque a ferramenta é mais esperto, você diagnostica mais rápido porque a evidência já estava indexada e escopada. Repare no que o caso não afirma: o Security Lake é um serviço de agregação de logs de segurança, não o AWS Lake Formation, e ele produz evidência de auditoria, não lineage de coluna.
Caso B, Vanguard: um "data swamp" transformado em produtos de dados com dono
Elemento | Detalhe |
|---|---|
Cliente | Vanguard, gestão de investimentos: Financial Advisor Services ("FAS 360") |
Desafio | Um "data swamp fragmentado de arquivos Parquet no Amazon Simple Storage Service (Amazon S3)" que precisava virar um sistema estruturado e governado |
Serviços | Arquitetura multi-warehouse do Amazon Redshift (produtor RA3 + consumidores Serverless, compartilhamento zero-copy), produtos de dados em Apache Iceberg no S3, AWS Glue para ETL e cálculo de métricas |
Escala após dois anos | 20 TB no Redshift mais 150 TB no data lake S3; 600+ jobs de ETL do AWS Glue (um aumento de 30x); 300+ tabelas (3x); 250+ materialized views; 500+ dashboards (25x); 500.000+ consultas de usuário por mês |
A ligação com a qualidade | "A Vanguard está curando produtos de dados no data lake usando o formato Apache Iceberg e aproveitando o AWS Glue para cálculo de métricas e integração do data lake", o passo de curadoria é onde regras, SLOs de frescor e dono se conectam |
Fonte | AWS Big Data Blog, How Vanguard transformed analytics with Amazon Redshift multi-warehouse architecture, publicado em 2026-03-18 (acesso em 2026-10-11) |
Leia os 600 jobs e as 500.000 consultas mensais como uma declaração de orçamento de qualidade: nesse volume, uma partição ruim silenciosa não é um incômodo, é um mês de decisões erradas. A frase "data swamp" é o próprio atalho da indústria para o que acontece quando um lake acumula arquivos sem curadoria, dono e checks: que é exatamente o modo de falha que as regras, a quarentena e os SLOs desta lição existem para prevenir. (Os números de escala são reportados pela Vanguard/AWS no post de março de 2026; são instantâneos, não garantias.)
Perguntas de Prática (Practice Questions)
Como responder
Questão de múltipla escolha com 4 opções. Selecione uma opção e escolha Verificar resposta.
Uma tarefa DQ do Data Catalog falha e você precisa dos IDs exatos das linhas que quebraram a regra para que sejam corrigidas. Qual é o movimento correto em outubro de 2026?
Como responder
Questão de múltipla escolha com 4 opções. Selecione uma opção e escolha Verificar resposta.
A sua regra do EventBridge sobre 'Data Quality Evaluation Results Available' parou de disparar embora o ruleset continue rodando e o score continue caindo. Qual é a causa documentada mais provável?
Como responder
Questão de múltipla escolha com 4 opções. Selecione uma opção e escolha Verificar resposta.
Um fluxo de quarentena é construído sobre RowCount, Mean, StandardDeviation e um CustomSql na forma geral. O que acontece quando linhas falham?
Como responder
Questão de múltipla escolha com 4 opções. Selecione uma opção e escolha Verificar resposta.
Qual construto do DQDL deve carregar um SLO de frescor de 'a partição de ontem deve conter eventos com no máximo 2 dias', escopado para que o histórico não seja sinalizado?
Como responder
Questão de múltipla escolha com 4 opções. Selecione uma opção e escolha Verificar resposta.
O mesmo ruleset silver de 20 regras avaliado 30 vezes por mês. Qual colocação está correta para um desenho de quarentena, usando a aritmética publicada do exemplo da AWS?
Como responder
Questão de múltipla escolha com 4 opções. Selecione uma opção e escolha Verificar resposta.
Para o seu SLO de frescor os P95 dos componentes são: CDC 55 min, bronze→silver incluindo DQ 22 min, silver→gold 15 min, espera de orquestração 70 min. O que você reporta?
Como responder
Questão de múltipla escolha com 4 opções. Selecione uma opção e escolha Verificar resposta.
Você precisa auditar quem gravou objetos na landing zone do bronze. Qual configuração está correta e com custo controlado em outubro de 2026?
Como responder
Questão de múltipla escolha com 4 opções. Selecione uma opção e escolha Verificar resposta.
Um stakeholder pergunta: 'De onde veio esta coluna gold, e quem leu ela na terça-feira passada?' Qual combinação está correta?
Como responder
Questão de múltipla escolha com 4 opções. Selecione uma opção e escolha Verificar resposta.
Qual afirmação sobre rulesets do DQDL está correta em outubro de 2026?
Como responder
Questão de múltipla escolha com 4 opções. Selecione uma opção e escolha Verificar resposta.
O seu time quer trabalho de restrições no nível do Deequ em um conjunto de dados de 400 MB que precisa terminar em menos de 5 minutos. O que a orientação da AWS sustenta?
Como responder
Questão de múltipla escolha com 4 opções. Selecione uma opção e escolha Verificar resposta.
Qual veredito comparativo sobre qualidade de dados em um lakehouse da AWS está correto em outubro de 2026?
Veredito Comparativo: Glue Data Quality vs Deequ autogerido vs Great Expectations faça você mesmo vs observabilidade de terceiros
- Contra o Deequ autogerido: o Deequ é a engine debaixo do Glue Data Quality, então rodá-lo você mesmo reimplementa recomendações, scoring, eventos do EventBridge, métricas do CloudWatch, console, tabelas de resultados e IAM: tudo isso que vem gerenciado. O Deequ autogerido ainda ganha em três lugares documentados: analyzers que o DQDL não expressa, lotes EMR sem interface, e validação de migração em que você difunde métricas origem-vs-destino em uma tabela de catálogo. Os custos são reais: o JAR precisa casar com a sua versão do Spark ("é crítica a fornecer as coordenadas Maven corretas do Apache"), a orientação publicada do PyDeequ chega no máximo a Spark 3.3, e a famosa receita Holt-Winters estava fixada em Glue 2.0 + um JAR específico. Escolha-a pelo analyzer, não pela plataforma.
- Contra o Great Expectations faça você mesmo: o GX é um framework competente que a AWS não oferece como serviço gerenciado, a própria documentação dele fixa a integração com o Glue no GX 0.15.50, e o conector do Glue Catalog é um walkthrough de parceiro. Nesta stack você o hospedaria, versionaria, aplicaria patches e reconstruiria o alerta que o EventBridge te dá de graça. O cálculo só muda se você precisar das mesmas suítes aplicadas em engines não AWS, e mesmo assim, o objetivo declarado do DQDL é "padronizar regras de qualidade de dados para que você possa usar as mesmas regras em diferentes bancos de dados e engines", então tente isso primeiro.
- Contra a observabilidade de terceiros: o CloudWatch já te dá logs por camada (
/aws-glue/jobs/output,/error,/logs-v2), métricas por camada (Glue Data Quality,AWS/Athena, EMF custom), alarmes emglue.data.quality.rules.failed, dashboards por camada de medalhão, e fan-out do EventBridge a $1.00 por milhão de custom events com entrega na mesma conta a $0, o plano de remediação inteiro do E6 custou cerca de $1,80/mês. Um fornecedor ganha a sua taxa com coisas que esta stack não faz fora da caixa: correlação cross-account/cross-cloud, analítica de logs de retenção longa, roteamento de alertas por ML, e analítica de taxa de queima de SLO entre serviços. Se o seu ambiente é só AWS e os seus SLOs são os quatro da Seção 6, não compre nada ainda. - O veredito de uma frase: em outubro de 2026, rode o Glue Data Quality como default nos dois caminhos, tarefas de catálogo para monitoramento agendado com recomendações,
EvaluateDataQualitydentro do job onde você precisar de quarentena de nível de linha, destine os resultados para tabelas Iceberg no Data Catalog, alerte pelo EventBridge com o checkbox de publicar métricas do CloudWatch LIGADO, alarme emglue.data.quality.rules.failedpor tabela por ruleset, coloque em quarentena em um prefixo escopado com um backfill de verdade, codifique o frescor como um SLO P95 de três relógios, mantenha os data events do CloudTrail escopados a prefixos sensíveis, e reserve Deequ, DataBrew, GX e observabilidade de terceiros para as lacunas específicas que cada um de fato preenche.
Pontos Principais (Key Takeaways):
- Quatro engines, um default: o Prescriptive Guidance da AWS mapeia checks de analista sem código para o DataBrew (sintaxe própria
CheckExpression, findings agregados, evento do EventBridge por ruleset validado), checks embutidos em job e em catálogo para o Glue Data Quality (DQDL, gerenciado, "construído sobre o framework open-source DeeQu"), lógica sob medida para código customizado, e um relatório de métricas/restrições para o Deequ. O Glue DQ avalia tabelas do Glue Catalog e views suportadas do Athena sobre S3, Redshift, JDBC compatível com o Catálogo, Iceberg/Hudi/Delta. - Contrato do DQDL:
Rules = [... ]preso a uma tabela; 32 tipos de regra; limites de 2.000 regras e 65 KB por ruleset; sem colunas aninhadas ou de lista; quatro modificadores, expressões (with thresholdapenas em ColumnValues/ColumnDataType/CustomSql),where(2024-06-26), regras dinâmicas (RowCount > avg(last(10)), GA 2024-08-07), labels (team=finance, GA 2025-11-21), mais constantes, SQL de pré-processamento e regras compostas. - Resultados de nível de linha são só de ETL: a tarefa do Data Catalog suporta recomendações (BASIC; ADVANCED via Bedrock desde 2026-09-18), predicados de partição com pushdown e mínimo de 2 DPUs, mas "Não suportado" para identificar registros com falha; apenas o
EvaluateDataQualityem um job emiteDataQualityRulesPass/Fail/SkipeDataQualityEvaluationResult. Regras de nível de conjunto (RowCount, Mean, StandardDeviation, ColumnCount, CustomSql na forma geral, AggregateMatch e companhia) nunca produzem uma linha reprovada: elas alertam, não colocam em quarentena. - Três destinos de resultado, todos explícitos: JSON no S3 + crawler + tabela externa no Athena; o service store do Glue atrás de
GetDataQualityResult/ListDataQualityResultse o snapshot das últimas 10 execuções no console; e tabelas Iceberg no Data Catalog (GA 2026-07-27): resultados de regra, de profiling, de nível de linha e de observação, cada um em opt-in via--additional-run-options, particionados porcatalog_id, database_name, table_name, day(stored_on). - O contrato de alertas tem um checkbox que sustenta o peso: EventBridge
detail-type: Data Quality Evaluation Results Available,source: aws.glue-dataquality, carregandoscore,stateerulesSucceeded/Failed/Skipped, e só funciona enquanto "Publish metrics to Amazon CloudWatch" permanecer selecionado. O gêmeo é o namespaceGlue Data Quality, métricasglue.data.quality.rules.passed/.failed, por tabela por ruleset; alarme em Sum ≥ 1 em 1 minuto → SNS. O IAM precisa deglue:PublishDataQualityecloudwatch:PutMetricDatacondicionado àquele namespace. - Quarentena é um padrão com três ações: warn / quarantine / halt do InsuranceLake em
before_transformeafter_transform; só expressões de nível de linha podem colocar em quarentena; regras de razão e limiar não podem. Quarentena = linhas filtradas →s3://lakehouse-quarantine/<table>/dt=…+ tabela de catálogo → métrica → EventBridge → SNS + Lambda → backfill que limpa a partição de quarentena e reexecuta por um bookmark rebobinado ou novotransformation_ctx(rewinds não limpam destinos). WAP é a variante nativa do Iceberg: branchstg→ audit →fast_forwardparamain, trocando latência por ausência de armazenamento duplicado. - Frescor são três relógios: tempo de evento → tempo de chegada → tempo de disponibilidade, com P95(disponibilidade − evento) ≤ meta. Exemplo resolvido: 55 + 22 + 15 + 70 = 162 min = 2,7 h contra um SLO de 3 horas = 18 minutos de folga, e a primeira alavanca é a espera de orquestração de 70 minutos. Codifique como
DataFreshness(coluna de timestamp) ouFileFreshness(hora de arquivo do S3), e pareie com um alarme de volume (RowCount = 0) e um ruleset de schema drift (SchemaMatch,ColumnExists,ColumnDataType). - Observabilidade é em camadas, e o X-Ray para em Lambda/Step Functions: log groups do Glue
/aws-glue/jobs/output,/errore/logs-v2(redirecionáveis, aptos para Logs IA), streams de causa raiz do job insights com a linha que falhou, métricasAWS/Athenado Athena (EngineExecutionTime,ProcessedBytes) com histórico de consultas de 30 dias,/aws/redshift/<namespace>/<log_type>do Redshift Serverless (Never Expire por default: defina retenção), e um dashboard do CloudWatch por camada de medalhão mais um painel de operações de dados da conta. - Data events do CloudTrail são opt-in e por evento: a primeira cópia de management events é grátis; data events do S3 custam $0.10 por 100.000: seletores escopados (bronze somente escrita $20.00 + quarentena $0.50 + PII no silver $2.00 = $22.50/mês) contra um trail de 300M events sem escopo a $300. Apenas advanced event selectors, sem curingas,
resources.ARN StartsWithcom a barra final, até 500 valores;NotEquals s3lifecycle.amazonaws.comderruba o ruído. CloudTrail é auditoria, nunca lineage. - Três planos, três ferramentas: AWS Glue Data Catalog + Lake Formation = metadados técnicos e permissões (registro é escopo de permissão, não aresta de lineage); Amazon DataZone = catálogo de negócios (ativos, termos de glossário, metadata forms, publicar/inscrever) e o grafo de lineage, captura automática de execuções de data source do Glue (S3, DynamoDB, Catalog, Delta, Iceberg, Hudi; não JDBC nem DocumentDB/MongoDB) e histórico de consultas do Redshift, mais eventos compatíveis com OpenLineage via API (opt-in), com consumidores vendo 1 nível upstream/downstream; CloudTrail = quem chamou o quê. Âncoras de caso: a Siemens centralizou logs em 800+ contas, cortou o volume de logs em 90% (5 to 7 TB/dia → 600 GB), economizou $1.3M/ano e identificou dados S3 impactados em 10 minutos vs vários dias com causas raiz 75% mais rápidas (estudo de caso da AWS, acesso em 2026-10-11); a Vanguard escapou de um "data swamp de arquivos Parquet" para produtos de dados em Iceberg com 600+ jobs do Glue (30×), 150 TB no S3 e 500.000+ consultas/mês, a escala em que regras, SLOs e dono deixam de ser opcionais (AWS Big Data Blog, 2026-03-18).