अंतिम समीक्षा: मई 2026
साधारण Terraform के साथ SAA-C03 परीक्षा के AWS संसाधनों को बनाएं — एक समय में एक ब्लॉक, प्रत्येक परीक्षा डोमेन से जुड़ा हुआ। यही कोड OpenTofu पर भी काम करता है।
इस लैब के अंत तक आप एक टेक्स्टबुक मल्टी-AZ हाई-अवेलेबिलिटी वेब स्टैक को प्लेन टेराफॉर्म के साथ प्रोविज़न कर चुके होंगे — जिसमें दो AZs में पब्लिक और प्राइवेट सबनेट के साथ एक कस्टम VPC, एक इंटरनेट-फेसिंग एप्लिकेशन लोड बैलेंसर, प्राइवेट टियर में EC2 इंस्टेंसेस का एक ऑटो स्केलिंग ग्रुप, और ऐप के बातचीत के लिए एक मल्टी-AZ RDS डेटाबेस शामिल होगा। पांच चरणों में पांच परीक्षा के मुख्य स्तंभ।
प्रत्येक संसाधन प्लेन टेराफॉर्म है — वही कोड बिना किसी संशोधन के ओपनटोफू पर काम करता है। कोई वैरिएबल नहीं, कोई मॉड्यूल नहीं, कोई रिमोट स्टेट नहीं। स्निपेट्स को एक ही main.tf में डालें, एक बार terraform init चलाएँ, फिर terraform apply को चरण-दर-चरण चलाएँ।
>= 1.5 या OpenTofu >= 1.6।us-east-1 के लिए AWS CLI प्रामाणिक (इस लैब के लिए डिफ़ॉल्ट क्षेत्र — आप जो चाहें चुन सकते हैं, लेकिन चरण 3 में AMI लुकअप मानता है कि क्षेत्र में Amazon Linux 2023 है)।skip_final_snapshot = true है इसलिए डिस्ट्रॉय क्लीन है — इस सेटिंग का उपयोग कभी भी उत्पादन में न करें।इस लैब का अधिकांश भाग फ्री टियर या उसके करीब है: VPC, ALB, ASG, सिक्योरिटी ग्रुप, IAM, और क्लाउडवॉच मॉनिटरिंग मुफ्त हैं। निष्क्रिय रहने पर बिल करने वाली दो लाइन आइटम:
यदि आप लागत-संवेदनशील हैं, तो लैब के लिए db_instance.multi_az = false सेट करें और मल्टी-AZ डॉक्स को अलग से पढ़ें। यदि आप पूर्ण HA पैटर्न नहीं चलाते हैं तब भी परीक्षा एट्रीब्यूट को जानने के लिए पुरस्कृत करती है। समाप्त होने पर नष्ट कर दें।
हम AWS प्रदाता ~> 5.60 को पिन करते हैं और us-east-1 का चयन करते हैं (कम से कम दो AZ वाले कोई भी क्षेत्र काम करता है)। data ब्लॉक योजना समय पर उपलब्ध AZ सूची को प्राप्त करता है - AZ नाम जैसे us-east-1a को हार्डकोड करना SAA-C03 विरोधी पैटर्न है क्योंकि AZ-नाम-से-भौतिक-क्षेत्र मैपिंग खाता-विशिष्ट है (आपका us-east-1a मेरे से अलग भौतिक AZ हो सकता है)।
हमारे द्वारा बनाए गए सभी संसाधन 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 उच्च-उपलब्धता प्रश्न यह मानता है कि आप कार्यभार को कम से कम दो उपलब्धता क्षेत्रों में फैलाएंगे। हम एक /16 VPC बनाते हैं और चार /20 सबनेट निकालते हैं — दो पब्लिक (ALB के लिए), दो प्राइवेट (EC2 इंस्टेंसेस और RDS के लिए)। इंटरनेट गेटवे VPC से जुड़ता है; पब्लिक रूट टेबल 0.0.0.0/0 इसके माध्यम से भेजता है।
इस लैब में प्राइवेट सबनेट में जानबूझकर NAT गेटवे नहीं है — NAT GWs निष्क्रिय होने पर (~$32/माह प्रति AZ) बिल करते हैं और SAA-C03 लागत प्रश्नों में इस व्यापार-बंद का स्पष्ट रूप से परीक्षण करता है। यदि आपके ऐप को उत्पादन में प्राइवेट सबनेट से आउटबाउंड इंटरनेट की आवश्यकता होती, तो आप एक NAT (या एक NAT इंस्टेंस, SAA-C03 का सस्ता विकल्प) जोड़ते।
इस चरण से VPC + सबनेट + IGW + रूट टेबल आगे आने वाली हर चीज़ के लिए कैनवास हैं — ALB पब्लिक सबनेट में प्लग करता है, ASG इंस्टेंसेस प्राइवेट वाले में रहते हैं, और चरण 5 में RDS सबनेट समूह दोनों प्राइवेट 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
}एक एप्लिकेशन लोड बैलेंसर वह लोड बैलेंसर है जिसकी SAA-C03 आपसे उम्मीद करता है जब भी प्रश्न कहता है "HTTP / HTTPS" या "पाथ-आधारित रूटिंग" या "एक विशिष्ट सेवा को लक्षित करें"। नेटवर्क लोड बैलेंसर TCP/UDP और अति-कम-लेटेंसी को संभालते हैं; क्लासिक विरासत है। ALB ही है।
ALB चरण 2 से दो पब्लिक सबनेट में रहता है — संरचनात्मक रूप से "मल्टी-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
}
}ऑटो स्केलिंग AWS वेल-आर्किटेक्टेड का "लोच" स्तंभ है और मल्टी-AZ के बाद SAA-C03 पर दूसरा सबसे अधिक परीक्षण किया जाने वाला विषय है। चरण 3 से ALB के साथ संयुक्त, एक ASG आपको दोष सहिष्णुता (जब इंस्टेंस विफल होते हैं तो उन्हें प्रतिस्थापित किया जाता है) और स्केलेबिलिटी (इंस्टेंस की संख्या मांग को ट्रैक करती है) दोनों देता है — दो परिणाम जिनके बारे में SAA-C03 लगातार पूछता रहता है।
लॉन्च टेम्प्लेट परिभाषित करता है कि प्रत्येक नया इंस्टेंस कैसा दिखता है। हम नवीनतम Amazon Linux 2023 AMI, एक t3.micro, चरण 2-बराबर से SG का उपयोग करते हैं जो केवल ALB SG से ट्रैफ़िक स्वीकार करता है (नेटवर्क परत पर न्यूनतम विशेषाधिकार), और एक न्यूनतम उपयोगकर्ता-डेटा जो nginx शुरू करता है ताकि हेल्थ चेक पास हो सके।
ASG तीन चीजों को एक साथ जोड़ता है: जहां इंस्टेंस चलते हैं (vpc_zone_identifier = हमारे प्राइवेट सबनेट, दोनों AZs), कितने मौजूद होने चाहिए (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"
}
}किसी भी SAA-C03 मल्टी-AZ कहानी का मुकुट रत्न एक मल्टी-AZ RDS डेटाबेस है। multi_az = true सेटिंग पूरे परीक्षा में सबसे अधिक परीक्षण किए गए गुणों में से एक है: यह RDS को दूसरे AZ में एक सिंक्रोनस स्टैंडबाय प्रतिकृति प्रदान करने के लिए कहता है। जब प्राइमरी विफल होता है, तो RDS स्वचालित रूप से स्टैंडबाय को बढ़ावा देता है — विशिष्ट फेलओवर में ~60 सेकंड लगते हैं और कोई डेटा हानि नहीं होती है। दो सिंगल-AZ डेटाबेस आपको वह नहीं देंगे; मैनुअल प्रतिकृति आपको वह नहीं देगी। मल्टी-AZ किसी भी "एक मिनट से कम फेलओवर, शून्य डेटा हानि" प्रश्न का उत्तर है।
DB सबनेट समूह को कम से कम दो AZs में सबनेट की आवश्यकता होती है — हम इसे चरण 2 से प्राइवेट सबनेट प्रदान करते हैं। सिक्योरिटी ग्रुप ऐप SG से ही डेटाबेस पोर्ट (PostgreSQL के लिए 5432) स्वीकार करता है, जो चरण 4 से स्तरित-सुरक्षा पैटर्न को दर्शाता है।
इस अंतिम भाग के साथ, स्टैक पूरा हो गया है: ट्रैफ़िक किसी भी पब्लिक AZ में ALB में प्रवेश करता है, किसी भी प्राइवेट AZ में ASG इंस्टेंसेस तक फैलता है, और वे इंस्टेंसेस RDS प्राइमरी से बात करते हैं (जिसमें दूसरे AZ में एक हॉट स्टैंडबाय प्रतीक्षा कर रहा होता है)। कुल क्षेत्र विफलता को छोड़कर किसी भी चीज़ में एक पुनर्प्राप्ति पथ होता है।
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 तब तक पूरा नहीं होता जब तक हर इंस्टेंस चला नहीं जाता, जिसमें 2-3 मिनट लग सकते हैं। धैर्य रखें।Ctrl-C को बीच में ही नष्ट न करें — इसे पूरा होने दें।SAA-C03 किसी भी एक लैब की तुलना में अधिक आर्किटेक्चरल पैटर्न को कवर करता है — वैश्विक सामग्री वितरण के लिए CloudFront, DNS-आधारित फेलओवर के लिए Route 53, S3 क्रॉस-रीजन रेप्लिकेशन, Aurora ग्लोबल डेटाबेस, Direct Connect, VPC पियरिंग, Transit Gateway, ElastiCache, EFS, FSx, और कई अन्य।
हम जानबूझकर परीक्षा में सबसे अधिक परीक्षण किए गए पैटर्न पर टिके रहते हैं: एक क्षेत्र के भीतर मल्टी-AZ HA। यह वह आर्किटेक्चर है जो हर सॉल्यूशंस-आर्किटेक्ट इंटरव्यू और SAA-C03 प्रश्नों के ~30% में आता है। शेष 70% — वैश्विक पैटर्न, कैशिंग, उन्नत नेटवर्किंग, हाइब्रिड क्लाउड — इस प्रमाणन पृष्ठ के ब्राउज़ और Editorial अनुभागों पर वैचारिक रूप से कवर किए गए हैं। प्रत्येक क्रॉस-रीजन या उन्नत-नेटवर्किंग विषय अपनी खुद की लैब के योग्य है; एक मेगा-स्टैक बनाने से बिल्ड-स्टोरी अनुशासन पतला हो जाएगा जिस पर यह प्रारूप निर्भर करता है।
यदि आप क्रॉस-रीजन पैटर्न (S3 CRR, Aurora ग्लोबल, Route 53 हेल्थ चेक) के साथ हैंड्स-ऑन अभ्यास चाहते हैं, तो वे समान प्लेन-टेराफॉर्म आकार में साफ-सुथरे ढंग से मैप करते हैं और फॉलो-अप लैब के लिए अच्छे उम्मीदवार हैं।