Última revisão: maio de 2026
Construa os serviços da AWS do exame DEA-C01 com Terraform puro — um bloco de cada vez, cada um vinculado a um domínio do exame. O mesmo código funciona no OpenTofu.
Ao final deste laboratório, você terá provisionado, com Terraform simples, a base que todo data lake AWS compartilha — um bucket S3 com uma política de ciclo de vida em camadas, um banco de dados do Catálogo de Dados do Glue, um crawler do Glue que descobre o esquema de objetos que chegam no S3, e um grupo de trabalho do Athena que permite consultar o lake sem provisionar servidores. Esta é a arquitetura que o DEA-C01 chama de data-lake-on-S3, e ela aparece em aproximadamente um quarto das questões do exame.
Cada recurso é Terraform puro — o mesmo código funciona sem modificações no OpenTofu. Solte os trechos em um único main.tf, execute terraform init, e então terraform apply passo a passo.
>= 1.5 ou OpenTofu >= 1.6.us-east-1 (qualquer região funciona; usamos us-east-1 por padrão).Todos os recursos aqui ociosos custam $0:
O único alerta na fatura é deixar o crawler do Glue em um agendamento. Se você definir schedule para uma expressão cron na Etapa 4 e esquecer de destruir, o crawler será executado indefinidamente — ainda centavos por execução, mas acumula se for diariamente por um ano. Destrua quando terminar.
Abertura padrão. Glue e Athena são serviços regionais — escolha a região onde seus dados brutos já residem, pois as taxas de transferência de dados entre regiões se acumulam rapidamente em escala de petabytes. Usamos us-east-1 por padrão.
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.60"
}
}
}
provider "aws" {
region = "us-east-1"
default_tags {
tags = {
Project = "certlabpro-dea-c01"
ManagedBy = "terraform"
}
}
}O bucket S3 é o substrato completo de um data lake. O DEA-C01 testa especificamente o ciclo de vida das classes de armazenamento — você pode economizar mais de 80% em dados frios ao fazer a transição deles por Standard → Standard-IA → Glacier Flexible → Glacier Deep Archive à medida que envelhecem. Ativamos a criptografia, bloqueamos o acesso público e definimos uma regra de ciclo de vida de três níveis que reflete o padrão de custo do DEA-C01 mais frequentemente testado.
As transições são 30 dias → IA, 90 dias → Glacier Flexible Retrieval, 180 dias → Deep Archive. Esses números são mínimos para o exame (você não pode fazer a transição para IA antes de 30 dias — esse é um limite rígido do S3, e o DEA-C01 o testa). Para um data lake que mistura dados recentes e de arquivo, este ciclo de vida economiza 60–90% no armazenamento sem nenhuma alteração na aplicação.
resource "aws_s3_bucket" "lake" {
bucket_prefix = "certlabpro-dea-c01-"
}
resource "aws_s3_bucket_public_access_block" "lake" {
bucket = aws_s3_bucket.lake.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
resource "aws_s3_bucket_server_side_encryption_configuration" "lake" {
bucket = aws_s3_bucket.lake.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "AES256"
}
}
}
resource "aws_s3_bucket_lifecycle_configuration" "lake" {
bucket = aws_s3_bucket.lake.id
rule {
id = "tier-cold-data"
status = "Enabled"
filter { prefix = "raw/" }
transition {
days = 30
storage_class = "STANDARD_IA"
}
transition {
days = 90
storage_class = "GLACIER"
}
transition {
days = 180
storage_class = "DEEP_ARCHIVE"
}
}
}O Catálogo de Dados do Glue é o repositório central de metadados do qual todos os outros serviços de análise da AWS leem — Athena, EMR, Redshift Spectrum, Lake Formation e SageMaker Feature Store compartilham este único catálogo. O DEA-C01 testa implacavelmente este modelo de catálogo central: você provisiona o catálogo uma vez, e cada superfície de análise em sua conta o utiliza automaticamente.
Um database no Glue é um namespace (pense em schema no PostgreSQL); uma table é os metadados que descrevem como ler objetos no S3 como dados estruturados. Criamos o banco de dados aqui; o crawler na Etapa 4 irá popular as tabelas abaixo dele.
resource "aws_glue_catalog_database" "main" {
name = "certlabpro_dea_c01"
description = "Glue Catalog database for the certlabpro DEA-C01 lab."
location_uri = "s3://${aws_s3_bucket.lake.bucket}/raw/"
}Um crawler do Glue percorre um caminho S3, infere nomes e tipos de colunas a partir do conteúdo dos arquivos e escreve o esquema no banco de dados do catálogo da Etapa 3. Sempre que novos arquivos chegam, você reexecuta o crawler e a tabela automaticamente incorpora novas partições ou evoluções de esquema. O DEA-C01 testa este padrão de descoberta sob o domínio de Armazenamento e Gerenciamento de Dados — é a diferença entre um engenheiro de dados escrever DDL manualmente e um engenheiro de dados deixar o Glue fazer isso.
O perfil IAM que anexamos concede ao crawler permissão para ler do bucket da Etapa 2 e escrever no catálogo da Etapa 3. A AWS publica uma política gerenciada AWSGlueServiceRole que cobre a maior parte disso; nós a anexamos e adicionamos acesso de leitura S3 inline ao nosso bucket específico. Deliberadamente não definimos um schedule aqui — insira schedule = "cron(0 5 * * ? *)" mais tarde se desejar uma atualização diária do catálogo.
resource "aws_iam_role" "glue_crawler" {
name = "certlabpro-dea-c01-glue-crawler"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "glue.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy_attachment" "glue_service" {
role = aws_iam_role.glue_crawler.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole"
}
resource "aws_iam_role_policy" "glue_lake_read" {
name = "read-lake-bucket"
role = aws_iam_role.glue_crawler.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = ["s3:GetObject", "s3:ListBucket"]
Resource = [aws_s3_bucket.lake.arn, "${aws_s3_bucket.lake.arn}/*"]
}]
})
}
resource "aws_glue_crawler" "raw_data" {
name = "certlabpro-dea-c01-raw-data"
database_name = aws_glue_catalog_database.main.name
role = aws_iam_role.glue_crawler.arn
s3_target {
path = "s3://${aws_s3_bucket.lake.bucket}/raw/"
}
schema_change_policy {
update_behavior = "UPDATE_IN_DATABASE"
delete_behavior = "LOG"
}
}O Athena consulta o catálogo das Etapas 3–4 com SQL — sem servidores, pagamento por TB escaneado. O domínio Operações de Dados do DEA-C01 testa dois atributos específicos do Athena de forma rigorosa: o limite de dados escaneados por consulta (limitado aqui a 1 GB para que uma consulta descontrolada não escaneie acidentalmente 100 TB) e o bucket de resultados separado (o Athena grava a saída da consulta de volta no S3; misturar resultados no bucket de origem é o antipadrão recorrente do exame).
O grupo de trabalho é a unidade de governança — você pode ter um grupo de trabalho production com limites de escaneamento rígidos e um grupo de trabalho analytics-power-users com limites mais altos, e então anexar entidades IAM a qualquer um que se encaixe. Com esta peça final em vigor, a base do data lake está completa: os dados chegam em s3://<bucket>/raw/, o crawler da Etapa 4 os cataloga, o Athena os consulta dentro das restrições de custo que este grupo de trabalho define.
resource "aws_s3_bucket" "athena_results" {
bucket_prefix = "certlabpro-dea-c01-athena-results-"
}
resource "aws_s3_bucket_public_access_block" "athena_results" {
bucket = aws_s3_bucket.athena_results.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
resource "aws_athena_workgroup" "main" {
name = "certlabpro-dea-c01"
state = "ENABLED"
configuration {
enforce_workgroup_configuration = true
publish_cloudwatch_metrics_enabled = true
bytes_scanned_cutoff_per_query = 1073741824 # 1 GB per query — runaway-query guardrail
result_configuration {
output_location = "s3://${aws_s3_bucket.athena_results.bucket}/output/"
encryption_configuration {
encryption_option = "SSE_S3"
}
}
}
}terraform destroy desmonta tudo neste laboratório. Duas observações:
force_destroy = false (o padrão seguro), então destroy falhará se qualquer um contiver objetos (o bucket do data lake da Etapa 2 coletará arquivos brutos; o Athena escreve resultados no bucket da Etapa 5). Esvazie ambos via console (ou aws s3 rm s3://<bucket> --recursive) antes de destruir.O DEA-C01 cobre mais áreas de análise do que este laboratório pode mostrar em cinco etapas simples com Terraform — Kinesis Data Streams + Kinesis Data Firehose para ingestão de streaming, Amazon EMR para Spark distribuído, AWS Lambda para transformação serverless, Step Functions para orquestração de pipeline, Redshift para armazenamento de dados, MSK para Kafka gerenciado, OpenSearch para análise de logs, QuickSight para dashboards de BI, AWS DMS para migração de banco de dados e Lake Formation para permissões granulares de data lake.
Nós nos concentramos na única fundação mais testada — S3 + Catálogo do Glue + Crawler do Glue + Athena — porque é o substrato sobre o qual todos os outros padrões do DEA-C01 são construídos. O Kinesis Firehose escreve neste bucket S3; o EMR lê deste Catálogo do Glue; o Lake Formation controla este grupo de trabalho do Athena. Uma vez que você consiga construir esta fundação de forma limpa, o resto são adicionais.
Um segundo laboratório prático cobrindo Kinesis Firehose → S3 → Glue → Athena (a variante de streaming da mesma cadeia) seria uma continuação natural. A cobertura conceitual do restante está nas seções Navegar, Guia e Editorial desta página de certificação.