Última revisión: mayo de 2026
Crea los servicios de AWS del examen DEA-C01 con Terraform puro: bloque a bloque, cada uno vinculado a un dominio del examen. El mismo código funciona en OpenTofu.
Al finalizar este laboratorio, habrás aprovisionado, con Terraform simple, la base que todo data lake de AWS comparte — un bucket S3 con una política de ciclo de vida por niveles, una base de datos del Catálogo de datos de Glue, un rastreador de Glue que descubre esquemas a partir de objetos que llegan a S3, y un grupo de trabajo de Athena que te permite consultar el lake sin aprovisionar servidores. Esta es la arquitectura que DEA-C01 llama data-lake-on-S3, y aparece en aproximadamente una cuarta parte de las preguntas del examen.
Cada recurso es Terraform simple — el mismo código funciona sin modificaciones en OpenTofu. Suelta los fragmentos en un solo main.tf, ejecuta terraform init, luego terraform apply paso a paso.
>= 1.5 o OpenTofu >= 1.6.us-east-1 (cualquier región funciona; por defecto usamos us-east-1).Todos los recursos aquí tienen un costo de $0 en inactividad:
Una advertencia sobre la factura es dejar el rastreador de Glue con una programación. Si estableces schedule en una expresión cron en el Paso 4 y olvidas destruirlo, el rastreador se ejecutará para siempre — todavía centavos por ejecución, pero se acumula si es diario durante un año. Destruye cuando termines.
Introducción estándar. Glue y Athena son servicios regionales — elige la región donde ya residen tus datos sin procesar, porque los cargos por transferencia de datos entre regiones se acumulan rápidamente a escala de petabytes. Por defecto, usamos us-east-1.
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"
}
}
}El bucket S3 es el sustrato completo de un data lake. DEA-C01 prueba específicamente el ciclo de vida de la clase de almacenamiento — puedes ahorrar más del 80% en datos fríos al transicionarlos a través de Standard → Standard-IA → Glacier Flexible → Glacier Deep Archive a medida que envejecen. Activamos el cifrado, restringimos el acceso público y establecemos una regla de ciclo de vida de tres niveles que refleja el patrón de costos de DEA-C01 más frecuentemente evaluado.
Las transiciones son 30 días → IA, 90 días → Glacier Flexible Retrieval, 180 días → Deep Archive. Esos números son mínimos del examen (no puedes transicionar a IA antes de los 30 días — ese es un límite estricto de S3, y DEA-C01 lo evalúa). Para un data lake que mezcla datos recientes y de archivo, este ciclo de vida ahorra entre un 60 y un 90% en almacenamiento sin cambios en la aplicación.
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"
}
}
}El Catálogo de datos de Glue es el almacén central de metadatos del que leen todos los demás servicios de análisis de AWS — Athena, EMR, Redshift Spectrum, Lake Formation y SageMaker Feature Store comparten este único catálogo. DEA-C01 prueba este modelo de catálogo central implacablemente: aprovisionas el catálogo una vez, y cada superficie de análisis en tu cuenta lo recoge automáticamente.
Una database en Glue es un espacio de nombres (piensa en schema en PostgreSQL); una table es el metadato que describe cómo leer objetos en S3 como datos estructurados. Aquí creamos la base de datos; el rastreador en el Paso 4 poblará las tablas debajo de ella.
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/"
}Un rastreador de Glue recorre una ruta de S3, infiere los nombres y tipos de columnas del contenido de los archivos y escribe el esquema en la base de datos del catálogo del Paso 3. Cada vez que llegan nuevos archivos, vuelves a ejecutar el rastreador y la tabla detecta automáticamente nuevas particiones o la evolución del esquema. DEA-C01 evalúa este patrón de descubrimiento bajo el dominio de Almacenamiento y Gestión de Datos — es la diferencia entre un ingeniero de datos que escribe DDL manualmente y un ingeniero de datos que deja que Glue lo haga.
El rol de IAM que adjuntamos le da al rastreador permiso para leer del bucket del Paso 2 y escribir en el catálogo del Paso 3. AWS publica una política administrada AWSGlueServiceRole que cubre la mayor parte de esto; la adjuntamos y agregamos acceso de lectura en línea a S3 para nuestro bucket específico. Deliberadamente no establecemos un schedule aquí — puedes agregar schedule = "cron(0 5 * * ? *)" más tarde si deseas una actualización diaria del 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"
}
}Athena consulta el catálogo de los Pasos 3–4 con SQL — sin servidores, pago por TB escaneado. El dominio Operaciones de Datos de DEA-C01 evalúa fuertemente dos atributos específicos de Athena: el límite de datos escaneados por consulta (aquí limitado a 1 GB para que una consulta descontrolada no pueda escanear accidentalmente 100 TB), y el bucket de resultados separado (Athena escribe la salida de la consulta de nuevo en S3; mezclar los resultados en el bucket de origen es el anti-patrón recurrente del examen).
El grupo de trabajo es la unidad de gobernanza — puedes tener un grupo de trabajo production con límites de escaneo estrictos y un grupo de trabajo analytics-power-users con límites más altos, luego adjuntar principales de IAM al que mejor se adapte. Con esta pieza final en su lugar, la base del data lake está completa: los datos llegan a s3://<bucket>/raw/, el rastreador del Paso 4 los cataloga, Athena los consulta dentro de los límites de costo que establece este grupo de trabajo.
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 destruye todo en este laboratorio. Dos notas:
force_destroy = false (el valor predeterminado seguro), por lo que destroy fallará si alguno contiene objetos (el bucket del data lake del Paso 2 recolectará archivos sin procesar; Athena escribe resultados en el bucket del Paso 5). Vacía ambos a través de la consola (o aws s3 rm s3://<bucket> --recursive) antes de destruir.DEA-C01 cubre más terreno de análisis de lo que este laboratorio puede mostrar en cinco pasos simples de Terraform — Kinesis Data Streams + Kinesis Data Firehose para ingesta por streaming, Amazon EMR para Spark distribuido, AWS Lambda para transformación sin servidor, Step Functions para orquestación de pipelines, Redshift para data warehousing, MSK para Kafka administrado, OpenSearch para análisis de registros, QuickSight para paneles de BI, AWS DMS para migración de bases de datos, y Lake Formation para permisos detallados de data lake.
Nos ceñimos a la base única más evaluada — S3 + Catálogo de Glue + Rastreador de Glue + Athena — porque es el sustrato sobre el que se construyen todos los demás patrones de DEA-C01. Kinesis Firehose escribe a este bucket S3; EMR lee de este Catálogo de Glue; Lake Formation controla este grupo de trabajo de Athena. Una vez que puedes construir esta base limpiamente, el resto son complementos.
Un segundo laboratorio práctico que cubra Kinesis Firehose → S3 → Glue → Athena (la variante de streaming de la misma cadena) sería una continuación natural. La cobertura conceptual del resto se encuentra en las secciones Buscar, Manual y Editorial de esta página de certificación.