最終確認: 2026年5月
DVA-C02 試験の対象となる AWS サービスを、プレーンな Terraform を使用して構築します。1 ブロックずつ、それぞれ試験ドメインに関連付けられています。同じコードが OpenTofu でも動作します。
このラボの終了までに、プレーンなTerraformを使用して、典型的なAWSサーバーレスマイクロサービス、すなわちDynamoDBテーブル、最小権限のIAMロールを持つLambda関数、その前面にあるHTTP API Gateway、そしてサービスが停止したときにわかるようにCloudWatch LogsとLambdaエラーアラームをプロビジョニングできるようになります。これは、DVA-C02で頻繁に問われるアーキテクチャです。
すべてのリソースはプレーンなTerraformであり、同じコードはOpenTofuでも変更なく動作します。変数、モジュール、リモートステートは使用しません。スニペットを1つの main.tf にドロップし、一度 terraform init を実行してから、 terraform apply をステップバイステップで実行します。
>= 1.5 または OpenTofu >= 1.6。us-east-1 で認証された AWS CLI。apply 後に一度 サブスクリプションの確認 をクリックする必要があります)。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を有効にしたテーブルを1つ作成します。これは、キャッシュ、セッションストレージ、および自然に期限切れになるデータを扱うあらゆるワークロードで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 管理ポリシー)と、ステップ2で作成したテーブルに対する正確に4つの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は、ほとんどの現代的な問題で、REST API(古いタイプ)よりも HTTP API(安価で高速な新しいAPI Gatewayタイプ)を特にテストします。HTTP APIは、約70%安価で約60%低レイテンシーであり、必要なLambda統合もサポートしています。
3つのリソースがこれを連携させます: 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は、スローされた呼び出しの数を表す Errors メトリックをCloudWatchに送信します。DVA-C02の モニタリング、ロギング、トラブルシューティング ドメイン(試験の約12%)は、これを最初から計測しているかをテストします。ここでは、Lambdaのエラー率に基づいてCloudWatchアラームを作成し、SNSを介してEメールアドレスに通知をルーティングします。
terraform apply の後、AWSは email_endpoint のアドレスに確認メールを送信します。一度 サブスクリプションの確認 をクリックすると、エラーが急増したときに実際にアラームが届くようになります。
ステップ2から5までの組み合わせは、ステートフルなストア(DynamoDB)、ステートレスなコンピューティング(Lambda)、HTTPSエッジ(API Gateway HTTP API)、および運用上の可視性(CloudWatch Logs + アラーム)からなるマイクロサービス全体です。これがDVA-C02アーキテクチャの5つのブロックです。
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 を実行すると、このラボのすべてがクリーンに破棄されます。2点注意してください:
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などです。
私たちは、DVA-C02のすべての受験者が記憶して説明できる必要がある唯一のアーキテクチャであるため、最も頻繁にテストされる単一のサーバーレスマイクロサービスパターン — Lambda + API Gateway HTTP API + DynamoDB + CloudWatch —に焦点を当てています。他のパターンはこれらのプリミティブ(Step FunctionsはLambdaを構成し、SQSはLambdaをトリガーし、EventBridgeはLambdaをスケジュールします)の上に構築されており、このベースに一度に1つずつ要素を追加することで最もよく学習できます。
その他のサービスごとの概念的な内容は、この認定試験ページの 閲覧、プレイブック、および Editorial セクションを参照してください。