נבדק לאחרונה: מאי 2026
בנו את שירותי AWS של בחינת DOP-C02 עם Terraform פשוט — בלוק אחד בכל פעם, כאשר כל אחד מהם מקושר בחזרה לתחום במבחן. אותו הקוד עובד גם ב-OpenTofu.
בסיום מעבדה זו תספק, באמצעות Terraform פשוט, צינור עבודה מלא מקוד לייצור — מאגר Git של CodeCommit, פרויקט CodeBuild המריץ את חבילת הבדיקות שלך ואורז חפצים, יישום CodeDeploy שפורס ליעד, צינור CodePipeline המחבר מקור → בנייה → פריסה, וקנרית CloudWatch Synthetics שבודקת את נקודת הקצה הפרוסה ומפעילה אזעקה כשהיא מפסיקה להגיב. זוהי ארכיטקטורת הייחוס של DOP-C02 בחמישה בלוקים.
כל משאב הוא Terraform פשוט. זרוק את הקטעים לקובץ main.tf יחיד, הרץ terraform init, ואז terraform apply צעד אחר צעד.
>= 1.5 או OpenTofu >= 1.6.us-east-1.https://example.com; בייצור, זו תהיה נקודת הקצה לבדיקת תקינות של היישום שלך.aws_s3_bucket כמקור הצינור (CodePipeline תומך במקור S3).בעיקר תשלום לפי שימוש, ללא חיוב משמעותי בזמן סרק:
BUILD_GENERAL1_SMALL; בניית מעבדה עולה סנטים בודדים.הערימה כולה היא פחות מ-5$ לחודש כשהיא פועלת. הרס בסיום.
פתח דבר סטנדרטי. שירותי Code* הם אזוריים — בחר את האזור שהמאגרים המקור וסביבות היעד שלך חולקים. ברירת המחדל היא 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-dop-c02"
ManagedBy = "terraform"
}
}
}
resource "aws_s3_bucket" "artifacts" {
bucket_prefix = "certlabpro-dop-c02-artifacts-"
}
resource "aws_s3_bucket_public_access_block" "artifacts" {
bucket = aws_s3_bucket.artifacts.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}CodeCommit הוא מארח ה-Git של AWS. DOP-C02 בודק את חבילת Code* מקצה לקצה כסיפור משולב היטב — השאלות הנפוצות ביותר במבחן שואלות איזו שילוב של שירותים מובנים של AWS משיג תוצאה נתונה, והתשובה כמעט תמיד מתחילה ב-CodeCommit.
ה-default_branch = "main" תואם את ברירות המחדל המודרניות של Git (CodeCommit יצר בעבר master). המאגר שאנו יוצרים ריק לאחר apply; בשימוש אמיתי היית דוחף את הקומיט הראשון שלך עם buildspec.yml ו-appspec.yml בשורש — אלו הם הקבצים ש-CodeBuild (שלב 3) ו-CodeDeploy (שלב 4) קוראים בכל הפעלת צינור.
resource "aws_codecommit_repository" "app" {
repository_name = "certlabpro-dop-c02-app"
description = "Application source for the DOP-C02 lab pipeline."
default_branch = "main"
}CodeBuild מריץ את שלבי הבנייה והבדיקה מתוך buildspec.yml שלך. DOP-C02 בודק כאן את הוויתור בין תמונה מנוהלת לעומת תמונה מותאמת אישית — תמונות מנוהלות הן ללא תחזוקה אך איטיות יותר להתחלה; תמונות מותאמות אישית נותנות לך הפעלה קרה מהירה יותר ושרשרות כלים ניתנות לשחזור. המעבדה משתמשת בתמונה המנוהלת aws/codebuild/standard:7.0, המכסה Node, Python, Java, Go, .NET, Ruby היישר מהקופסה.
תפקיד ה-IAM מעניק ל-CodeBuild הרשאה לכתוב ליומני CloudWatch (לפלט בנייה), לקרוא את המקור מ-CodeCommit, ולכתוב חפצים לדלי ה-S3 משלב 1. LINUX_CONTAINER + BUILD_GENERAL1_SMALL היא הרמה הזולה ביותר ב-$0.005 לדקת בנייה.
resource "aws_iam_role" "codebuild" {
name = "certlabpro-dop-c02-codebuild"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "codebuild.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy" "codebuild" {
name = "build-permissions"
role = aws_iam_role.codebuild.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"]
Resource = "*"
},
{
Effect = "Allow"
Action = ["s3:GetObject", "s3:PutObject", "s3:ListBucket"]
Resource = [aws_s3_bucket.artifacts.arn, "${aws_s3_bucket.artifacts.arn}/*"]
},
{
Effect = "Allow"
Action = "codecommit:GitPull"
Resource = aws_codecommit_repository.app.arn
},
]
})
}
resource "aws_codebuild_project" "build" {
name = "certlabpro-dop-c02-build"
service_role = aws_iam_role.codebuild.arn
source {
type = "CODEPIPELINE"
buildspec = "buildspec.yml"
}
artifacts {
type = "CODEPIPELINE"
}
environment {
type = "LINUX_CONTAINER"
image = "aws/codebuild/standard:7.0"
compute_type = "BUILD_GENERAL1_SMALL"
privileged_mode = false
}
}CodeDeploy מטפל בפריסה בפועל — על EC2, Lambda או ECS. DOP-C02 בודק שוב ושוב את ציר אסטרטגיית הפריסה: AllAtOnce (הזולה ביותר, המפחידה ביותר), HalfAtATime, OneAtATime, CodeDeployDefault.LambdaCanary10Percent5Minutes (תבנית הקנרית של Lambda), ו-CodeDeployDefault.ECSAllAtOnce. אנו בוחרים בפלטפורמת המחשוב Lambda עבור המעבדה מכיוון שהיא אינה דורשת שמופעי EC2 יתקיימו בפועל — זה שומר על המעבדה זולה ומוגבלת היטב בהיקפה.
תצורת הפריסה CodeDeployDefault.LambdaAllAtOnce היא הפשוטה ביותר מבין אסטרטגיות Lambda. בייצור, LambdaCanary10Percent5Minutes היא התשובה המומלצת ביותר ב-DOP-C02 לפריסות עם הפחתת סיכונים: היא מעבירה 10% מהתעבורה לגרסה החדשה, ממתינה 5 דקות לאזעקות CloudWatch, ואז מעבירה את היתרה אם שום דבר לא מופעל.
resource "aws_iam_role" "codedeploy" {
name = "certlabpro-dop-c02-codedeploy"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "codedeploy.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy_attachment" "codedeploy_lambda" {
role = aws_iam_role.codedeploy.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSCodeDeployRoleForLambda"
}
resource "aws_codedeploy_app" "app" {
name = "certlabpro-dop-c02-app"
compute_platform = "Lambda"
}
resource "aws_codedeploy_deployment_group" "lambda" {
app_name = aws_codedeploy_app.app.name
deployment_group_name = "default"
service_role_arn = aws_iam_role.codedeploy.arn
deployment_config_name = "CodeDeployDefault.LambdaAllAtOnce"
deployment_style {
deployment_option = "WITH_TRAFFIC_CONTROL"
deployment_type = "BLUE_GREEN"
}
auto_rollback_configuration {
enabled = true
events = ["DEPLOYMENT_FAILURE"]
}
}CodePipeline הוא המארגן שקושר את שלושת השלבים הקודמים לגרף יחיד: מקור מ-CodeCommit, בנייה עם CodeBuild, פריסה עם CodeDeploy. כל מעבר הוא נקודת חיבור — ניתן להוסיף אישורים ידניים, שלבי בדיקה מקבילים והתראות בין כל שני שלבים. תחום ניהול תצורה ו-IaC של DOP-C02 בודק שוב ושוב את מבנה השלב והפעולה הזה.
ברגע שהצינור קיים, יש לך CI/CD. החלק האחרון — CloudWatch Synthetics — סוגר את הלולאה על יכולת התבוננות בפריסה: קנרית היא סקריפט דפדפן מנוהל ללא ממשק משתמש (מבוסס Puppeteer) שרץ בלוח זמנים ומדווח הצלחה/כישלון ל-CloudWatch. תחום ניטור ורישום של DOP-C02 נשען רבות על תבנית זו: פרוס שינוי ← קנרית תופסת את הרגרסיה תוך דקות ← מנגנון השחזור האוטומטי של CodeDeploy (שאותו חיברנו בשלב 4) מופעל מהאזעקה של CloudWatch של הקנרית.
סקריפט הקנרית שלהלן סוקר את https://example.com כל 5 דקות; בייצור היית מפנה אותו לנקודת הקצה לבדיקת תקינות של היישום שלך, עם אישורים על גוף התגובה וכותרות, לא רק HTTP 200.
# ── CodePipeline ──────────────────────────────────────────────
resource "aws_iam_role" "codepipeline" {
name = "certlabpro-dop-c02-codepipeline"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "codepipeline.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy" "codepipeline" {
name = "pipeline-permissions"
role = aws_iam_role.codepipeline.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = [
"codecommit:*",
"codebuild:*",
"codedeploy:*",
"s3:*",
"iam:PassRole",
]
Resource = "*"
}]
})
}
resource "aws_codepipeline" "main" {
name = "certlabpro-dop-c02"
role_arn = aws_iam_role.codepipeline.arn
artifact_store {
location = aws_s3_bucket.artifacts.bucket
type = "S3"
}
stage {
name = "Source"
action {
name = "Source"
category = "Source"
owner = "AWS"
provider = "CodeCommit"
version = "1"
output_artifacts = ["source"]
configuration = {
RepositoryName = aws_codecommit_repository.app.repository_name
BranchName = "main"
}
}
}
stage {
name = "Build"
action {
name = "Build"
category = "Build"
owner = "AWS"
provider = "CodeBuild"
version = "1"
input_artifacts = ["source"]
output_artifacts = ["build"]
configuration = {
ProjectName = aws_codebuild_project.build.name
}
}
}
}
# ── Synthetics canary ─────────────────────────────────────────
resource "aws_iam_role" "canary" {
name = "certlabpro-dop-c02-canary"
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" "canary_logs" {
role = aws_iam_role.canary.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}
data "archive_file" "canary_src" {
type = "zip"
output_path = "${path.module}/build/canary.zip"
source {
filename = "nodejs/node_modules/index.js"
content = <<-EOT
const synthetics = require("Synthetics");
exports.handler = async () => {
const page = await synthetics.getPage();
const res = await page.goto("https://example.com", { waitUntil: "domcontentloaded" });
if (!res.ok()) throw new Error("Status code " + res.status());
};
EOT
}
}
resource "aws_synthetics_canary" "endpoint" {
name = "certlabpro-dop-c02-endpoint"
artifact_s3_location = "s3://${aws_s3_bucket.artifacts.bucket}/canary/"
execution_role_arn = aws_iam_role.canary.arn
handler = "index.handler"
zip_file = data.archive_file.canary_src.output_path
runtime_version = "syn-nodejs-puppeteer-9.0"
start_canary = true
schedule {
expression = "rate(5 minutes)"
}
}terraform destroy מפרק את כל מה שיש במעבדה זו. שתי הערות:
aws s3 rm s3://<bucket> --recursive) לפני destroy או השתמש ב-force_destroy = true במשאב הדלי והפעל מחדש פעם אחת לפני ההרס.start_canary = true — היא פועלת ברציפות במרווחי זמן של 5 דקות מרגע ה-apply. כל הרצה עולה כ-0.0012$; קנרית מעבדה שנשכחה ורצה במשך שבוע עולה כ-0.25$. זול, אבל אמיתי. הרס בסיום.DOP-C02 מכסה מגוון רחב של נושאים מקצועיים — CloudFormation StackSets עבור IaC מרובה חשבונות / מרובה אזורים, Service Catalog, כללי AWS Config + תיקון, Systems Manager OpsCenter + Patch Manager, אוטומציה של AWS Health Dashboard, בדיקות Trusted Advisor, AWS Backup, EventBridge Pipes, Step Functions לתזמור בין שירותים, ו-X-Ray למעקב מבוזר.
אנו נצמדים לצינור ה-CI/CD מקצה לקצה מכיוון שזו הארכיטקטורה היחידה שנבחנת הכי הרבה במבחן — כל תבנית אחרת של DOP-C02 (כללי Config המזינים תיקון, זימון Synthetics באמצעות SNS, פריסת StackSets באמצעות CodePipeline) נבנית על בסיס זה. קבל את שרשרת המקור-לפריסה לידיך תחילה; הוסף StackSets מרובי חשבונות ותזמור חוצה אזורים ברגע שהיסודות ירגישו מכניים.
עבור הנושאים שלא סופקו כאן, קטעי העיון, המדריך והEditorial בדף הסמכה זה מכילים כיסוי קונספטואלי. מעבדה המשכית שתוסיף CloudFormation StackSets + Config Rules + Systems Manager Patch Manager תשלים את תחום ניהול פעולות בקנה מידה.