Последняя проверка: май 2026 г.
Разверните сервисы AWS для экзамена SAA-C03 с помощью чистого Terraform: пошаговое руководство с привязкой каждого блока к разделам экзамена. Код также совместим с OpenTofu.
К концу этой лабораторной работы вы развернете с помощью простого Terraform эталонный высокодоступный веб-стек с несколькими зонами доступности (Multi-AZ) — пользовательскую VPC с публичными и приватными подсетями в двух AZ, ориентированный на интернет Application Load Balancer, группу 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 отдельно. Экзамен по-прежнему ценит знание атрибута, даже если вы не используете полный шаблон высокой доступности. Уничтожьте ресурсы по завершении.
Мы закрепляем провайдер 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 GW тарифицируются примерно в 32 доллара в месяц в режиме простоя (за каждую AZ), и SAA-C03 явно проверяет этот компромисс в вопросах о стоимости. Если бы вашему приложению требовался исходящий интернет из приватных подсетей в production, вы бы добавили NAT (или NAT-инстанс, более дешевую альтернативу SAA-C03).
VPC + подсети + IGW + таблица маршрутизации из этого шага являются основой для всего последующего — ALB подключается к публичным подсетям, инстансы ASG находятся в приватных, а группа подсетей RDS в Шаге 5 охватывает обе приватные AZ.
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 — это балансировщик нагрузки, который 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-имя, что является двумя дополнительными сервисами, которые нам не нужны для демонстрации шаблона высокой доступности. Добавьте ACM в production.
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, SG, эквивалентную Шагу 2, которая принимает трафик только от SG ALB (минимальные привилегии на сетевом уровне), и минимальные пользовательские данные, которые запускают nginx, чтобы проверка состояния здоровья проходила успешно.
ASG объединяет три вещи: где запускаются инстансы (vpc_zone_identifier = наши приватные подсети, обе AZ), сколько их должно быть (min_size = 2, max_size = 4 — два для высокой доступности, запас для масштабирования) и как новые инстансы присоединяются к балансировщику нагрузки (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 о Multi-AZ является база данных RDS Multi-AZ. Настройка multi_az = true — один из наиболее часто проверяемых атрибутов на всем экзамене: она указывает RDS предоставить синхронную резервную реплику во второй зоне доступности. Когда основной инстанс выходит из строя, RDS автоматически продвигает резервный — типичное переключение занимает около 60 секунд без потери данных. Две однозональные базы данных НЕ дадут вам этого; ручная репликация НЕ даст вам этого. Multi-AZ — это ответ на любой вопрос о «переключении менее чем за минуту, с нулевой потерей данных».
Группа подсетей БД нуждается в подсетях как минимум в двух AZ — мы предоставляем ей приватные подсети из Шага 2. Группа безопасности принимает трафик по порту базы данных (5432 для PostgreSQL) только от SG приложения, отражая многоуровневую модель безопасности из Шага 4.
С этим последним компонентом стек завершен: трафик поступает в ALB в любой публичной AZ, распределяется на инстансы ASG in any private AZ, and these instances interact with the primary RDS (which has a hot standby waiting in another AZ). Any failure other than a full regional outage has a path to recovery.
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 минуты. Будьте терпеливы.destroy с помощью Ctrl-C — дайте ему завершиться.SAA-C03 охватывает больше архитектурных шаблонов, чем может продемонстрировать любая отдельная лабораторная работа — CloudFront для глобального распределения контента, Route 53 для отказоустойчивости на основе DNS, репликация S3 между регионами, Aurora Global Database, Direct Connect, пиринг VPC, Transit Gateway, ElastiCache, EFS, FSx и многие другие.
Мы намеренно придерживаемся единственного наиболее часто проверяемого шаблона на экзамене: Multi-AZ высокой доступности в пределах одного региона. Именно эта архитектура встречается на каждом собеседовании на должность Solutions Architect и примерно в 30% вопросов SAA-C03. Остальные 70% — глобальные шаблоны, кэширование, расширенные сетевые возможности, гибридное облако — концептуально охватываются в разделах Просмотр и Editorial этой страницы сертификации. Каждая тема, связанная с межрегиональными или расширенными сетевыми возможностями, заслуживает отдельной лабораторной работы; создание одного мега-стека размыло бы дисциплину построения истории, от которой зависит этот формат.
Если вы хотите получить практический опыт работы с межрегиональными шаблонами (S3 CRR, Aurora Global, проверки работоспособности Route 53), они легко вписываются в ту же форму чистого Terraform и являются хорошими кандидатами для последующих лабораторных работ.