Последняя проверка: май 2026 г.
Разверните сервисы AWS для экзамена DVA-C02 с помощью чистого Terraform: пошаговое руководство с привязкой каждого блока к разделам экзамена. Код также совместим с OpenTofu.
К концу этой лабораторной работы вы настроите с помощью обычного Terraform канонический бессерверный микросервис AWS — таблицу DynamoDB, функцию Lambda с ролью IAM с минимальными привилегиями, HTTP API Gateway перед ней, а также CloudWatch Logs + сигнализацию об ошибках Lambda, чтобы вы знали, когда сервис выходит из строя. Это архитектура, которую DVA-C02 тестирует в каждом втором вопросе.
Каждый ресурс — это простой Terraform — тот же код работает без изменений на OpenTofu. Никаких переменных, модулей или удаленного состояния. Просто вставьте фрагменты кода в один файл main.tf, один раз запустите terraform init, затем выполняйте terraform apply шаг за шагом.
>= 1.5 или OpenTofu >= 1.6.us-east-1..zip во время планирования с помощью archive_file — отдельный шаг сборки не требуется.Все ресурсы здесь оплачиваются по мере использования, без оплаты за простой:
Вся инфраструктура в простое стоит $0. Удаляйте ресурсы по завершении работы по привычке, а не из-за паники по поводу стоимости.
Стандартное начало: закрепим aws ~> 5.60, по умолчанию используем us-east-1, пометим все тегами с именем проекта, чтобы Cost Explorer мог позже сообщить о затратах на эту лабораторную работу (~$0 ожидается, но эта привычка важна для экзамена).
terraform {
required_version = ">= 1.5"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.60"
}
archive = {
source = "hashicorp/archive"
version = "~> 2.4"
}
}
}
provider "aws" {
region = "us-east-1"
default_tags {
tags = {
Project = "certlabpro-dva-c02"
ManagedBy = "terraform"
}
}
}DynamoDB — это хранилище NoSQL, которое DVA-C02 ожидает от вас использовать в сценариях с "задержкой в однозначные миллисекунды в масштабе". Мы создаем одну таблицу с оплатой по требованию (без планирования емкости), ключом раздела и включенным TTL для автоматического истечения срока действия записей — повторяющаяся схема DVA-C02 для кэширования, хранения сессий и любой рабочей нагрузки с естественно истекающими данными.
В этой лабораторной работе нет ключа сортировки; мы будем использовать только доступ по принципу ключ-значение. Восстановление на определенный момент времени включено по умолчанию для любой производственной таблицы, которую экзамен ожидает от вас настроить; мы также включаем его здесь. И billing_mode = PAY_PER_REQUEST, и point_in_time_recovery являются часто встречающимися на экзамене атрибутами.
resource "aws_dynamodb_table" "items" {
name = "certlabpro-dva-c02-items"
billing_mode = "PAY_PER_REQUEST"
hash_key = "id"
attribute {
name = "id"
type = "S"
}
ttl {
attribute_name = "expires_at"
enabled = true
}
point_in_time_recovery {
enabled = true
}
}Lambda — это место, где находится логика нашего приложения. Мы предоставляем ей роль с минимальными привилегиями: она может записывать данные в свою группу журналов CloudWatch (управляемая политика AWSLambdaBasicExecutionRole) и вызывать ровно четыре действия DynamoDB (GetItem, PutItem, UpdateItem, Query) в отношении ровно одной таблицы — той, которую мы создали на Шаге 2.
Источник данных archive_file упаковывает встроенный обработчик Python в файл .zip во время планирования, поэтому отдельный шаг сборки не требуется. Обработчик намеренно крошечный (возвращает путь + имя таблицы в формате JSON) — DVA-C02 проверяет конфигурацию Lambda гораздо больше, чем код Lambda, и здесь представлены атрибуты, относящиеся к экзамену: runtime, handler, timeout, memory_size, переменные среды и роль.
data "archive_file" "lambda_src" {
type = "zip"
output_path = "${path.module}/build/handler.zip"
source {
filename = "index.py"
content = <<-EOT
import json, os
def handler(event, context):
return {
"statusCode": 200,
"headers": {"Content-Type": "application/json"},
"body": json.dumps({
"table": os.environ["TABLE_NAME"],
"path": event.get("rawPath", "/"),
}),
}
EOT
}
}
resource "aws_iam_role" "lambda" {
name = "certlabpro-dva-c02-lambda"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "lambda.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy_attachment" "lambda_logs" {
role = aws_iam_role.lambda.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}
resource "aws_iam_role_policy" "lambda_ddb" {
name = "ddb-table-access"
role = aws_iam_role.lambda.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = ["dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:Query"]
Resource = aws_dynamodb_table.items.arn
}]
})
}
resource "aws_lambda_function" "api" {
function_name = "certlabpro-dva-c02-api"
role = aws_iam_role.lambda.arn
runtime = "python3.12"
handler = "index.handler"
filename = data.archive_file.lambda_src.output_path
source_code_hash = data.archive_file.lambda_src.output_base64sha256
timeout = 10
memory_size = 256
environment {
variables = {
TABLE_NAME = aws_dynamodb_table.items.name
}
}
}
resource "aws_cloudwatch_log_group" "lambda" {
name = "/aws/lambda/${aws_lambda_function.api.function_name}"
retention_in_days = 7
}API Gateway превращает нашу Lambda в то, что мир может вызывать. DVA-C02 специально тестирует HTTP API (более дешевую, быструю, новую версию API Gateway) вместо REST API (старой версии) в большинстве современных вопросов — HTTP API на ~70% дешевле и на ~60% имеют меньшую задержку, и они поддерживают ту же интеграцию с Lambda, которая нам нужна.
Три ресурса связывают это воедино: сам API, интеграция, указывающая на нашу Lambda, и маршрут, который сопоставляет входящие запросы ANY / с этой интеграцией. Этап автоматического развертывания означает, что изменения в API вступают в силу немедленно после terraform apply.
aws_lambda_permission — это то, о чем забывают новички: API Gateway вызывает нашу Lambda извне собственной политики ресурсов функции, поэтому нам нужно предоставить ему разрешение на это. Без этого ресурса API примет запрос, а затем вернет ошибку 500, пытаясь вызвать Lambda, которую ему не разрешено вызывать.
resource "aws_apigatewayv2_api" "main" {
name = "certlabpro-dva-c02"
protocol_type = "HTTP"
}
resource "aws_apigatewayv2_integration" "lambda" {
api_id = aws_apigatewayv2_api.main.id
integration_type = "AWS_PROXY"
integration_uri = aws_lambda_function.api.invoke_arn
payload_format_version = "2.0"
}
resource "aws_apigatewayv2_route" "root" {
api_id = aws_apigatewayv2_api.main.id
route_key = "ANY /"
target = "integrations/${aws_apigatewayv2_integration.lambda.id}"
}
resource "aws_apigatewayv2_stage" "default" {
api_id = aws_apigatewayv2_api.main.id
name = "$default"
auto_deploy = true
}
resource "aws_lambda_permission" "apigw" {
statement_id = "AllowAPIGatewayInvoke"
action = "lambda:InvokeFunction"
function_name = aws_lambda_function.api.function_name
principal = "apigateway.amazonaws.com"
source_arn = "${aws_apigatewayv2_api.main.execution_arn}/*/*"
}
output "api_url" {
value = aws_apigatewayv2_api.main.api_endpoint
}Каждая Lambda отправляет метрику Errors в CloudWatch — количество выброшенных исключений при вызовах. Домен DVA-C02 "Мониторинг, логирование и устранение неполадок" (~12% экзамена) проверяет, используете ли вы этот инструмент с первого дня. Мы создаем сигнализацию CloudWatch по частоте ошибок Lambda и направляем уведомления через SNS на адрес электронной почты.
После terraform apply AWS отправит письмо с подтверждением на адрес, указанный в email_endpoint — нажмите "Подтвердить подписку" один раз, и сигнализация действительно будет достигать вас при всплесках ошибок.
Комбинация шагов со 2 по 5 — это полный микросервис: хранилище состояний (DynamoDB), бессерверные вычисления (Lambda), HTTPS-граница (API Gateway HTTP API) и операционная видимость (CloudWatch Logs + сигнализации). Это архитектура DVA-C02 в пяти блоках.
resource "aws_sns_topic" "alerts" {
name = "certlabpro-dva-c02-alerts"
}
resource "aws_sns_topic_subscription" "alerts_email" {
topic_arn = aws_sns_topic.alerts.arn
protocol = "email"
endpoint = "you@example.com" # replace with your real email
}
resource "aws_cloudwatch_metric_alarm" "lambda_errors" {
alarm_name = "certlabpro-dva-c02-lambda-errors"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = 1
metric_name = "Errors"
namespace = "AWS/Lambda"
period = 300
statistic = "Sum"
threshold = 5
alarm_description = "Lambda errored more than 5 times in 5 minutes."
alarm_actions = [aws_sns_topic.alerts.arn]
treat_missing_data = "notBreaching"
dimensions = {
FunctionName = aws_lambda_function.api.function_name
}
}terraform destroy чисто удаляет все ресурсы, созданные в этой лабораторной работе. Два замечания:
DVA-C02 охватывает больше сервисов для разработчиков, чем может вместить эта лабораторная работа — Step Functions для оркестровки, SQS + SNS для асинхронного обмена сообщениями, EventBridge для запланированных заданий, Kinesis Data Streams для конвейеров реального времени, X-Ray для распределенной трассировки, Secrets Manager + Parameter Store, Cognito для аутентификации пользователей, AppSync для GraphQL, ECS / EKS / Fargate для контейнеров, CodeCommit + CodeBuild + CodeDeploy + CodePipeline для CI/CD, S3 для статических ресурсов и CloudFront для пограничных узлов.
Мы придерживаемся единой наиболее часто тестируемой модели бессерверного микросервиса — Lambda + API Gateway HTTP API + DynamoDB + CloudWatch — потому что это единственная архитектура, которую каждый кандидат DVA-C02 должен уметь нарисовать и объяснить по памяти. Другие модели строятся на этих примитивах (Step Functions компонует Lambda; SQS запускает Lambda; EventBridge планирует их) и лучше всего изучаются путем добавления по одному элементу к этой основе.
Для концептуального охвата остальных сервисов см. разделы Просмотр, Справочник и Editorial этой страницы сертификации.