Последняя проверка: май 2026 г.
Разверните сервисы AWS для экзамена DEA-C01 с помощью чистого Terraform: пошаговое руководство с привязкой каждого блока к разделам экзамена. Код также совместим с OpenTofu.
К концу этой лабораторной работы вы настроите с помощью чистого Terraform основу каждого озера данных AWS — бакет S3 с многоуровневой политикой жизненного цикла, базу данных Glue Data Catalog, краулер Glue, который обнаруживает схему объектов, поступающих в S3, и рабочую группу Athena, которая позволяет запрашивать озеро без выделения серверов. Это архитектура, которую DEA-C01 называет озером данных на S3, и она встречается примерно в четверти вопросов экзамена.
Каждый ресурс — это чистый Terraform; тот же код работает без изменений в OpenTofu. Поместите фрагменты в один файл main.tf, запустите terraform init, затем terraform apply шаг за шагом.
>= 1.5 или OpenTofu >= 1.6.us-east-1 (любой регион работает; по умолчанию мы используем us-east-1).Все ресурсы здесь простаивают по цене $0:
Единственное, на что стоит обратить внимание, — это оставление краулера Glue по расписанию. Если вы установите schedule на cron-выражение на Шаге 4 и забудете уничтожить, краулер будет работать вечно — по-прежнему копейки за каждый запуск, но это накапливается, если он запускается ежедневно в течение года. Уничтожьте ресурсы после завершения.
Стандартное начало. Glue и Athena — это региональные сервисы — выберите регион, в котором уже находятся ваши исходные данные, потому что плата за передачу данных между регионами быстро накапливается при масштабе петабайт. Мы по умолчанию используем 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"
}
}
}Бакет S3 — это весь субстрат озера данных. DEA-C01 специально проверяет жизненный цикл классов хранения — вы можете сэкономить 80%+ на холодных данных, переводя их через Standard → Standard-IA → Glacier Flexible → Glacier Deep Archive по мере их старения. Мы включаем шифрование, блокируем публичный доступ и устанавливаем трехуровневое правило жизненного цикла, которое отражает наиболее часто проверяемую схему затрат DEA-C01.
Переходы: 30 дней → IA, 90 дней → Glacier Flexible Retrieval, 180 дней → Deep Archive. Эти числа являются экзаменационными минимумами (вы не можете перейти на IA раньше 30 дней — это жесткое ограничение S3, и DEA-C01 проверяет его). Для озера данных, которое смешивает недавние и архивные данные, этот жизненный цикл экономит 60–90% на хранении без изменения приложения.
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"
}
}
}Glue Data Catalog — это центральное хранилище метаданных, которое читают все остальные аналитические сервисы AWS — Athena, EMR, Redshift Spectrum, Lake Formation и SageMaker Feature Store используют один и тот же каталог. DEA-C01 неустанно проверяет эту модель центрального каталога: вы один раз предоставляете каталог, и каждая аналитическая поверхность в вашей учетной записи автоматически его подхватывает.
database в Glue — это пространство имен (думайте о схеме в PostgreSQL); table — это метаданные, описывающие, как читать объекты в S3 как структурированные данные. Мы создаем базу данных здесь; краулер на Шаге 4 заполнит таблицы под ней.
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/"
}Краулер Glue проходит по пути S3, выводит имена и типы столбцов из содержимого файла и записывает схему в базу данных каталога из Шага 3. Всякий раз, когда появляются новые файлы, вы повторно запускаете краулер, и таблица автоматически получает новые разделы или эволюцию схемы. DEA-C01 проверяет этот шаблон обнаружения в домене Хранение и управление данными — это разница между инженером данных, вручную пишущим DDL, и инженером данных, позволяющим Glue делать это.
Роль IAM, которую мы присоединяем, дает краулеру разрешение на чтение из бакета из Шага 2 и запись в каталог из Шага 3. AWS публикует управляемую политику AWSGlueServiceRole, которая охватывает большую часть этого; мы присоединяем ее и добавляем встроенный доступ для чтения S3 к нашему конкретному бакету. Мы намеренно не устанавливаем schedule здесь — добавьте schedule = "cron(0 5 * * ? *)" позже, если вам нужно ежедневное обновление каталога.
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 запрашивает каталог из Шагов 3–4 с помощью SQL — без серверов, оплата за сканированный ТБ. Домен Операции с данными DEA-C01 тщательно проверяет два конкретных атрибута Athena: лимит сканированных данных на запрос (ограниченный здесь 1 ГБ, чтобы неуправляемый запрос случайно не просканировал 100 ТБ) и отдельный бакет для результатов (Athena записывает результаты запроса обратно в S3; смешивание результатов с исходным бакетом является повторяющимся антипаттерном экзамена).
Рабочая группа является единицей управления — у вас может быть рабочая группа production со строгими лимитами сканирования и рабочая группа analytics-power-users с более высокими лимитами, затем вы можете присоединить принципы IAM к любой из них. С этим последним элементом основа озера данных завершена: данные поступают в s3://<bucket>/raw/, краулер из Шага 4 каталогизирует их, Athena запрашивает их в рамках ограничений по стоимости, установленных этой рабочей группой.
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 удаляет все ресурсы в этой лабораторной работе. Два замечания:
force_destroy = false (безопасный параметр по умолчанию), поэтому destroy завершится ошибкой, если какой-либо из них содержит объекты (бакет озера из Шага 2 будет собирать необработанные файлы; Athena записывает результаты в бакет Шага 5). Очистите оба бакета через консоль (или aws s3 rm s3://<bucket> --recursive) перед уничтожением.DEA-C01 охватывает больше аналитических областей, чем может показать эта лабораторная работа за пять простых шагов Terraform — Kinesis Data Streams + Kinesis Data Firehose для потоковой загрузки, Amazon EMR для распределенного Spark, AWS Lambda для бессерверной трансформации, Step Functions для оркестрации пайплайнов, Redshift для хранилищ данных, MSK для управляемого Kafka, OpenSearch для анализа логов, QuickSight для BI-дашбордов, AWS DMS для миграции баз данных и Lake Formation для детальных разрешений озера данных.
Мы придерживаемся единственной наиболее часто проверяемой основы — S3 + Glue Catalog + Glue Crawler + Athena — потому что это субстрат, на котором строятся все остальные шаблоны DEA-C01. Kinesis Firehose записывает данные в этот бакет S3; EMR читает из этого Glue Catalog; Lake Formation управляет доступом к этой рабочей группе Athena. Как только вы сможете чисто построить эту основу, остальное — это надстройки.
Вторая практическая лабораторная работа, охватывающая Kinesis Firehose → S3 → Glue → Athena (потоковый вариант той же цепочки), была бы естественным продолжением. Концептуальное освещение остального содержится в разделах Просмотр, Справочник и Editorial этой страницы сертификации.