נבדק לאחרונה: מאי 2026
בנו את שירותי AWS של בחינת DVA-C02 עם Terraform פשוט — בלוק אחד בכל פעם, כאשר כל אחד מהם מקושר בחזרה לתחום במבחן. אותו הקוד עובד גם ב-OpenTofu.
בסיום מעבדת זו תפרוס, באמצעות Terraform רגיל, את המיקרו-שירות הסרברלס הקנוני של AWS — טבלת DynamoDB, פונקציית Lambda עם תפקיד IAM בעל הרשאות מינימליות, API Gateway מסוג HTTP בחזיתה, ויומני CloudWatch + אזעקת שגיאות 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 אורז את ה-handler של Python המוטמע לקובץ .zip בזמן התכנון, כך שאין שלב בנייה נפרד. ה-handler קטן בכוונה (מחזיר את הנתיב + שם הטבלה כ-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 APIs (הגרסה הזולה, המהירה והחדשה יותר של API Gateway) על פני REST APIs (הגרסה הישנה יותר) ברוב השאלות המודרניות — HTTP APIs זולים בכ-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 — לחץ על 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 לאימות משתמשים, AppSync עבור GraphQL, ECS / EKS / Fargate עבור קונטיינרים, CodeCommit + CodeBuild + CodeDeploy + CodePipeline עבור CI/CD, S3 עבור נכסים סטטיים, ו-CloudFront עבור הקצה.
אנו נצמדים לתבנית המיקרו-שירות הסרברלס הנפוצה ביותר בבחינה — Lambda + API Gateway HTTP API + DynamoDB + CloudWatch — מכיוון שזוהי הארכיטקטורה שכל מועמד ל-DVA-C02 צריך להיות מסוגל לצייר ולהסביר מהזיכרון. התבניות האחרות נבנות על גבי יסודות אלה (Step Functions מרכיב Lambdas; SQS מפעיל Lambdas; EventBridge מתזמן אותם) והן נלמדות בצורה הטובה ביותר על ידי הוספת חלק אחד בכל פעם לבסיס זה.
לכיסוי קונספטואלי של שאר השירותים, ראה את מדורי עיון, מדריך ו-Editorial בדף הסמכה זה.