נבדק לאחרונה: מאי 2026
בנו את שירותי AWS של בחינת SAA-C03 עם Terraform פשוט — בלוק אחד בכל פעם, כאשר כל אחד מהם מקושר בחזרה לתחום במבחן. אותו הקוד עובד גם ב-OpenTofu.
עד סוף מעבדה זו תגדיר, באמצעות Terraform רגיל, ערימת אינטרנט זמינה גבוהה ורב-אזורית (Multi-AZ) מובהקת — VPC מותאם אישית עם תתי-רשת ציבוריים ופרטיים הפרוסים על פני שני אזורי זמינות (AZs), איזון עומסים של יישומים (ALB) הפונה לאינטרנט, קבוצת Auto Scaling של מופעי EC2 בשכבה הפרטית, ובסיס נתונים RDS רב-אזורי (Multi-AZ) שהיישום יוכל לתקשר איתו. חמישה עמודי בחינה בחמישה שלבים.
כל משאב הוא Terraform רגיל — אותו קוד עובד ללא שינוי ב-OpenTofu. אין משתנים, אין מודולים, אין מצב מרוחק. זרוק את הקטעים לקובץ main.tf אחד, הפעל terraform init פעם אחת, ואז terraform apply שלב אחר שלב.
>= 1.5 או OpenTofu >= 1.6.us-east-1 (אזור ברירת המחדל למעבדה זו — בחר כל אזור שתרצה, אך חיפוש ה-AMI בשלב 3 מניח שלאזור יש Amazon Linux 2023).skip_final_snapshot = true כך שההריסה נקייה — לעולם אל תשתמש בהגדרה זו בייצור.רוב מעבדה זו נמצאת בשכבת החינם או קרוב אליה: ה-VPC, ה-ALB, ה-ASG, קבוצות האבטחה, IAM וניטור CloudWatch הם בחינם. שני הפריטים שיחויבו במצב סרק:
אם אתם רגישים לעלויות, הגדירו db_instance.multi_az = false למעבדה וקראו את תיעוד ה-Multi-AZ בנפרד. הבחינה עדיין מתגמלת ידיעה על התכונה גם אם אינכם מפעילים את תבנית ה-HA המלאה. השמדו כשתסיימו.
אנו מצמידים את ספק AWS ל-~> 5.60 ובוחרים ב-us-east-1 (כל אזור עם לפחות שני אזורי זמינות יעבוד). בלוק ה-data מאחזר את רשימת אזורי הזמינות הזמינים בזמן התכנון — קידוד שמות אזורי זמינות כמו us-east-1a הוא אנטי-תבנית ב-SAA-C03 מכיוון שמיפוי שם אזור זמינות לאזור פיזי הוא ספציפי לחשבון (ה-us-east-1a שלכם עשוי להיות אזור פיזי שונה משלי).
כל המשאבים שאנו יוצרים בהמשך מתויגים חזרה לשם פרויקט יחיד באמצעות default_tags — גם Cost Explorer וגם חוקי AWS Config פועלים על תגים, והבחינה מצפה שתתייגו הכל.
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-saa-c03"
ManagedBy = "terraform"
}
}
}
data "aws_availability_zones" "available" {
state = "available"
}כל שאלת זמינות גבוהה ב-SAA-C03 מניחה שתפרסו את העומס על פני לפחות שני אזורי זמינות. אנו יוצרים VPC בנפח /16 וחותכים ארבעה תתי-רשת בנפח /20 — שניים ציבוריים (עבור ה-ALB), ושניים פרטיים (עבור מופעי ה-EC2 וה-RDS). שער האינטרנט מתחבר ל-VPC; טבלת הניתוב הציבורית שולחת 0.0.0.0/0 דרכו.
התתי-רשתות הפרטיות בכוונה אינן מכילות שער NAT במעבדה זו — שערי NAT מחייבים כ-$32 לחודש במצב סרק (לכל AZ) ו-SAA-C03 בודק במפורש את הוויתור הזה בשאלות על עלויות. אם היישום שלכם היה זקוק לאינטרנט יוצא מתתי-רשתות פרטיות בייצור, הייתם מוסיפים NAT (או מופע NAT, החלופה הזולה יותר ב-SAA-C03).
ה-VPC + תתי-רשתות + IGW + טבלת ניתוב משלב זה הם הבסיס לכל מה שיבוא אחר כך — ה-ALB מתחבר לתתי-הרשתות הציבוריות, מופעי ה-ASG חיים בתתי-הרשתות הפרטיות, וקבוצת תתי-הרשתות של RDS בשלב 5 מתפרסת על פני שני ה-AZs הפרטיים.
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
tags = { Name = "certlabpro-saa-c03-vpc" }
}
resource "aws_subnet" "public" {
count = 2
vpc_id = aws_vpc.main.id
cidr_block = "10.0.${count.index}.0/24"
availability_zone = data.aws_availability_zones.available.names[count.index]
map_public_ip_on_launch = true
tags = { Name = "certlabpro-saa-c03-public-${count.index}" }
}
resource "aws_subnet" "private" {
count = 2
vpc_id = aws_vpc.main.id
cidr_block = "10.0.${count.index + 10}.0/24"
availability_zone = data.aws_availability_zones.available.names[count.index]
tags = { Name = "certlabpro-saa-c03-private-${count.index}" }
}
resource "aws_internet_gateway" "main" {
vpc_id = aws_vpc.main.id
}
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.main.id
}
}
resource "aws_route_table_association" "public" {
count = 2
subnet_id = aws_subnet.public[count.index].id
route_table_id = aws_route_table.public.id
}Application Load Balancer (ALB) הוא איזון העומסים ש-SAA-C03 מצפה מכם לבחור בכל פעם שהשאלה מציינת "HTTP / HTTPS" או "ניתוב מבוסס נתיב" או "מיקוד שירות ספציפי". Network Load Balancers מטפלים ב-TCP/UDP ובזמני השהיה נמוכים במיוחד; Classic הוא מורשת. ALB הוא הפתרון.
ה-ALB שוכן בשני התתי-רשתות הציבוריות משלב 2 — זו המשמעות המבנית של "רב-אזורי" (multi-AZ). קבוצת האבטחה שלו מקבלת HTTP (פורט 80) מכל מקום; קבוצת היעד תקבל את חבריה מה-ASG שאנו יוצרים בשלב 4. בדיקת התקינות היא החוזה בין ה-ALB ליעד — אם / מחזיר משהו שאינו 200, ה-ALB מפסיק לשלוח תעבורה למופע זה.
אין HTTPS במעבדה זו — זה דורש תעודת ACM ושם DNS, שהם שני שירותים נוספים שאינם נחוצים לנו כדי להציג את תבנית ה-HA. הוסיפו ACM בייצור.
resource "aws_security_group" "alb" {
name = "certlabpro-saa-c03-alb"
description = "ALB ingress on port 80 from the internet"
vpc_id = aws_vpc.main.id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_lb" "web" {
name = "certlabpro-saa-c03-alb"
load_balancer_type = "application"
internal = false
subnets = aws_subnet.public[*].id
security_groups = [aws_security_group.alb.id]
}
resource "aws_lb_target_group" "web" {
name = "certlabpro-saa-c03-tg"
port = 80
protocol = "HTTP"
target_type = "instance"
vpc_id = aws_vpc.main.id
health_check {
path = "/"
matcher = "200-299"
interval = 30
timeout = 5
healthy_threshold = 2
unhealthy_threshold = 3
}
}
resource "aws_lb_listener" "http" {
load_balancer_arn = aws_lb.web.arn
port = 80
protocol = "HTTP"
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.web.arn
}
}Auto Scaling הוא עמוד ה"גמישות" של AWS Well-Architected והנושא השני הנבחן ביותר ב-SAA-C03 אחרי Multi-AZ. בשילוב עם ה-ALB משלב 3, ASG נותן לכם גם סבילות לתקלות (מופעים מוחלפים כשהם נכשלים) וגם סקלאביליות (מספר המופעים עוקב אחר הביקוש) — שתי התוצאות ש-SAA-C03 ממשיך לשאול עליהן.
תבנית ההשקה מגדירה איך נראה כל מופע חדש. אנו משתמשים ב-AMI העדכני ביותר של Amazon Linux 2023, במופע t3.micro, בקבוצת האבטחה המקבילה לשלב 2 שמקבלת תעבורה רק מקבוצת האבטחה של ה-ALB (הרשאה מינימלית בשכבת הרשת), ובנתוני משתמש מינימליים שמפעילים את nginx כדי שבדיקת התקינות תעבור.
ה-ASG קושר שלושה דברים יחד: היכן מופעים פועלים (vpc_zone_identifier = תתי-הרשתות הפרטיות שלנו, שני אזורי הזמינות), כמה מופעים צריכים להתקיים (min_size = 2, max_size = 4 — שניים ל-HA, מרווח לסקייל), וכיצד מופעים חדשים מצטרפים לאיזון העומסים (target_group_arns). כאשר ה-ASG משיק מופע, הוא נרשם אוטומטית בקבוצת היעד משלב 3.
resource "aws_security_group" "app" {
name = "certlabpro-saa-c03-app"
description = "App instances accept traffic only from the ALB SG"
vpc_id = aws_vpc.main.id
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
security_groups = [aws_security_group.alb.id]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
data "aws_ami" "al2023" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["al2023-ami-*-kernel-6.1-x86_64"]
}
}
resource "aws_launch_template" "app" {
name_prefix = "certlabpro-saa-c03-app-"
image_id = data.aws_ami.al2023.id
instance_type = "t3.micro"
vpc_security_group_ids = [aws_security_group.app.id]
metadata_options {
http_tokens = "required"
}
user_data = base64encode(<<-EOT
#!/bin/bash
dnf install -y nginx
systemctl enable --now nginx
EOT
)
}
resource "aws_autoscaling_group" "app" {
name = "certlabpro-saa-c03-app-asg"
vpc_zone_identifier = aws_subnet.private[*].id
target_group_arns = [aws_lb_target_group.web.arn]
health_check_type = "ELB"
min_size = 2
max_size = 4
desired_capacity = 2
launch_template {
id = aws_launch_template.app.id
version = "$Latest"
}
}גולת הכותרת של כל סיפור Multi-AZ ב-SAA-C03 היא בסיס נתונים Multi-AZ RDS. ההגדרה multi_az = true היא אחת התכונות הנבחנות ביותר בכל הבחינה: היא אומרת ל-RDS לספק רפליקת המתנה סינכרונית באזור זמינות שני. כאשר הראשי נכשל, RDS מקדם אוטומטית את מופע ההמתנה — מעבר כשל טיפוסי לוקח כ-60 שניות ללא אובדן נתונים. שני בסיסי נתונים של Single-AZ לא יתנו לכם זאת; שכפול ידני לא יתנו לכם זאת. Multi-AZ היא התשובה לכל שאלה על "מעבר כשל בפחות מדקה, אפס אובדן נתונים".
קבוצת תתי-הרשת של בסיס הנתונים צריכה תתי-רשתות בלפחות שני אזורי זמינות — אנו מזינים לה את התתי-רשתות הפרטיות משלב 2. קבוצת האבטחה מקבלת את פורט בסיס הנתונים (5432 עבור PostgreSQL) רק מקבוצת האבטחה של היישום, מה שמשקף את תבנית האבטחה השכבתית משלב 4.
עם השלמה זו, הערימה מוכנה: התעבורה נכנסת ל-ALB באחד מאזורי הזמינות הציבוריים, מתפשטת למופעי ה-ASG באחד מאזורי הזמינות הפרטיים, ומופעים אלו מדברים עם ה-RDS הראשי (שלו יש מופע המתנה חם הממתין באזור הזמינות השני). לכל דבר מלבד כשל אזורי מלא יש נתיב התאוששות.
resource "aws_db_subnet_group" "main" {
name = "certlabpro-saa-c03"
subnet_ids = aws_subnet.private[*].id
}
resource "aws_security_group" "db" {
name = "certlabpro-saa-c03-db"
description = "DB accepts traffic only from the app SG"
vpc_id = aws_vpc.main.id
ingress {
from_port = 5432
to_port = 5432
protocol = "tcp"
security_groups = [aws_security_group.app.id]
}
}
resource "aws_db_instance" "main" {
identifier = "certlabpro-saa-c03"
engine = "postgres"
engine_version = "16"
instance_class = "db.t3.micro"
allocated_storage = 20
storage_encrypted = true
multi_az = true # the SAA-C03 headline
db_subnet_group_name = aws_db_subnet_group.main.name
vpc_security_group_ids = [aws_security_group.db.id]
username = "appuser"
password = "ChangeMe-Not-For-Prod-1234" # use Secrets Manager in production
skip_final_snapshot = true # lab-only setting; never use on prod
apply_immediately = true
}terraform destroy מפרק את כל מה שנבנה במעבדה זו. שתי הערות:
skip_final_snapshot = true, כך שה-destroy יסתיים תוך מספר דקות מבלי להשאיר תמונת מצב. לעולם אל תגדירו דגל זה בבסיס נתונים בייצור — איבוד תמונת המצב האחרונה הוא אובדן נתונים קבוע.destroy עבור ה-ASG עצמו לא יסתיים עד שכל מופע יוסר, מה שיכול לקחת 2–3 דקות. היו סבלניים.Ctrl-C להריסה באמצע הדרך — תנו לה להסתיים.SAA-C03 מכסה יותר תבניות ארכיטקטוניות ממה שמעבדה אחת יכולה להדגים — CloudFront להפצת תוכן גלובלית, Route 53 למעבר כשל מבוסס DNS, שכפול S3 בין אזורים, Aurora Global Database, Direct Connect, VPC peering, Transit Gateway, ElastiCache, EFS, FSx, ועוד רבים.
אנו בוחרים במכוון להתמקד בתבנית הנבחנת ביותר בבחינה: HA רב-אזורי (Multi-AZ) בתוך אזור אחד. זוהי הארכיטקטורה שעולה בכל ראיון למהנדס פתרונות וכ-30% משאלות SAA-C03. ה-70% הנותרים — תבניות גלובליות, שמירה במטמון, רשתות מתקדמות, ענן היברידי — מכוסים באופן רעיוני במדורי עיון ו-Editorial בדף הסמכה זה. כל נושא של בין-אזורים או רשתות מתקדמות ראוי למעבדה משלו; בניית ערימת-על אחת תדלל את משמעת סיפור הבנייה שפורמט זה תלוי בה.
אם אתם רוצים תרגול מעשי עם תבניות בין-אזורים (S3 CRR, Aurora Global, בדיקות תקינות של Route 53), אלו מתאימות היטב לאותה צורת Terraform רגילה והן מועמדות טובות למעבדות המשך.