最后审核时间:2026年5月
使用原生 Terraform 构建 DVA-C02 考试中的 AWS 服务——每次构建一个代码块,并紧扣考试领域。相同的代码可在 OpenTofu 上运行。
完成此实验后,您将使用纯粹的 Terraform 预置一个典型的 AWS 无服务器微服务——它包括一个 DynamoDB 表、一个具有最小权限 IAM 角色的 Lambda 函数、一个位于其前端的 HTTP API Gateway,以及 CloudWatch Logs 和一个 Lambda 错误告警,以便您在服务中断时及时了解。这是 DVA-C02 认证考试中反复出现的架构模式。
所有资源都是纯粹的 Terraform——相同的代码在 OpenTofu 上无需修改即可运行。没有变量,没有模块,没有远程状态。将这些代码片段放入一个 main.tf 文件中,运行一次 terraform init,然后逐步运行 terraform apply。
>= 1.5 或 OpenTofu >= 1.6。us-east-1 区域配置认证的 AWS CLI。apply 后您需要点击一次 Confirm subscription)。archive_file 在计划时内联打包成 .zip 文件——无需单独的构建步骤。此处所有资源均按使用量付费,无空闲计费:
整个堆栈空闲时费用为 $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 是 DVA-C02 认证考试期望您在任何“大规模个位数毫秒延迟”场景中选择的 NoSQL 存储。我们将创建一个表,采用按需计费(无需容量规划),设置分区键,并开启 TTL 以实现记录自动过期——这是 DVA-C02 认证中用于缓存、会话存储和任何具有自然过期数据工作负载的常见模式。
此实验中没有排序键;我们只进行键值访问。对于考试期望您预置的任何生产表,时间点恢复 (Point-in-time recovery) 默认开启;我们在此处也启用它。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 托管策略),并对一个表(我们在步骤 2 中创建的表)执行精确的四个 DynamoDB 操作(GetItem、PutItem、UpdateItem、Query)。
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 将接受请求,但在尝试调用不允许调用的 Lambda 时返回 500 错误。
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 都会向 CloudWatch 发送一个 Errors 指标——即抛出错误的调用次数。DVA-C02 认证的“监控、日志记录和故障排除”领域(约占考试的 12%)旨在测试您是否从一开始就对此进行监控。我们会在 Lambda 的错误率上创建 CloudWatch 告警,并通过 SNS 将通知路由到指定的电子邮件地址。
terraform apply 后,AWS 会向 email_endpoint 中的地址发送一封确认电子邮件——点击一次 Confirm subscription,当错误激增时,告警就会真正发送给您。
步骤 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、用于 GraphQL 的 AppSync、用于容器的 ECS / EKS / Fargate、用于 CI/CD 的 CodeCommit + CodeBuild + CodeDeploy + CodePipeline、用于静态资源的 S3 以及用于边缘服务的 CloudFront。
我们专注于最常考的单一无服务器微服务模式——Lambda + API Gateway HTTP API + DynamoDB + CloudWatch——因为这是每个 DVA-C02 考生都必须能够熟练绘制和解释的架构。其他模式都是基于这些基本组件构建的(Step Functions 组合 Lambda;SQS 触发 Lambda;EventBridge 调度 Lambda),最好通过在此基础上一次添加一个组件来学习。
要了解其余服务的逐个概念性覆盖,请参阅此认证页面的 浏览、手册 和 Editorial 部分。