Последняя проверка: май 2026 г.
Разверните сервисы AWS для экзамена ANS-C01 с помощью чистого Terraform: пошаговое руководство с привязкой каждого блока к разделам экзамена. Код также совместим с OpenTofu.
К концу этой лабораторной работы вы настроите с помощью чистого Terraform каноническую многосетевую архитектуру AWS (multi-VPC backbone) — две двухстековые (IPv4 + IPv6) VPC в одном регионе, соединенные через Transit Gateway с явными ассоциациями таблиц маршрутизации, и VPC Flow Logs, поддерживаемые CloudWatch, на основной VPC, чтобы вы могли видеть, что именно проходит через вашу сеть. Это архитектура, которая предполагается в каждом вопросе ANS-C01, касающемся нескольких VPC.
Каждый ресурс — это чистый Terraform. Вставьте фрагменты кода в один файл main.tf, запустите terraform init, затем terraform apply пошагово.
>= 1.5 или OpenTofu >= 1.6.us-east-1.Большая часть этой лабораторной работы дешева или бесплатна, но Transit Gateway — нет:
Почасовая плата за TGW — это основные расходы этой лабораторной работы. Два подключения × $0,05/час × 24 часа × 30 дней ≈ $72/месяц во время работы. Уничтожьте ресурсы сразу после изучения — TGW — самая большая ловушка по стоимости в любой лабораторной работе ANS-C01.
Стандартное начало. Transit Gateway является региональным — все подключения должны находиться в том же регионе, где находится TGW. Для межрегионального подключения вы бы добавили пиринг TGW (выходит за рамки v1). Мы по умолчанию используем 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-ans-c01"
ManagedBy = "terraform"
}
}
}
data "aws_availability_zones" "available" {
state = "available"
}ANS-C01 специально тестирует двухстековые VPC — AWS теперь по умолчанию назначает IPv6 /56 каждой новой VPC, если вы установите assign_generated_ipv6_cidr_block = true. Область Network Design экзамена проверяет как математику планирования IPv4 CIDR (неперекрывающиеся /16, если вы хотите выполнить пиринг или подключение TGW), так и вывод подсетей IPv6 (каждая подсеть получает /64, выделенную из /56 VPC).
Мы назначаем IPv4 10.0.0.0/16 и автоматически сгенерированный AWS IPv6 /56. Единственная подсеть здесь использует блок IPv4 /24 и блок IPv6 /64, выделенный из /56 VPC — cidrsubnet — это встроенная функция Terraform для этой математики. Интернет-шлюз по умолчанию является двухстековым в современных регионах AWS.
resource "aws_vpc" "primary" {
cidr_block = "10.0.0.0/16"
assign_generated_ipv6_cidr_block = true
enable_dns_hostnames = true
tags = { Name = "certlabpro-ans-c01-primary" }
}
resource "aws_subnet" "primary_a" {
vpc_id = aws_vpc.primary.id
cidr_block = "10.0.1.0/24"
ipv6_cidr_block = cidrsubnet(aws_vpc.primary.ipv6_cidr_block, 8, 1)
availability_zone = data.aws_availability_zones.available.names[0]
assign_ipv6_address_on_creation = true
tags = { Name = "certlabpro-ans-c01-primary-a" }
}
resource "aws_internet_gateway" "primary" {
vpc_id = aws_vpc.primary.id
}Мы создаем вторую VPC с 10.1.0.0/16 — намеренно непересекающуюся с 10.0.0.0/16 VPC #1. ANS-C01 акцентирует внимание на этом правиле проектирования, потому что в тот момент, когда вы хотите соединить две VPC (пиринг, TGW, что угодно), перекрывающиеся CIDR запрещают это на уровне API AWS. Вы не можете маршрутизировать к CIDR, который также заявлен локально.
VPC #2 также получает свой собственный автоматически сгенерированный AWS IPv6 /56 (каждая VPC получает глобально уникальный блок, поэтому по умолчанию нет риска перекрытия IPv6). Математика выделения подсетей имеет ту же форму, что и в Шаге 2.
resource "aws_vpc" "secondary" {
cidr_block = "10.1.0.0/16"
assign_generated_ipv6_cidr_block = true
enable_dns_hostnames = true
tags = { Name = "certlabpro-ans-c01-secondary" }
}
resource "aws_subnet" "secondary_a" {
vpc_id = aws_vpc.secondary.id
cidr_block = "10.1.1.0/24"
ipv6_cidr_block = cidrsubnet(aws_vpc.secondary.ipv6_cidr_block, 8, 1)
availability_zone = data.aws_availability_zones.available.names[0]
assign_ipv6_address_on_creation = true
tags = { Name = "certlabpro-ans-c01-secondary-a" }
}Transit Gateway — это хаб. Он масштабируется до тысяч подключений VPC, поддерживает совместное использование между учетными записями через AWS Resource Access Manager (RAM) и предоставляет вам единую таблицу маршрутизации для работы вместо N² пиринговых соединений. ANS-C01 тестирует выбор архитектуры "звезда" вместо пиринга VPC всякий раз, когда вопрос упоминает "более трех VPC" или "по мере роста нашей сети".
Мы создаем TGW с отключенными ассоциацией и распространением таблиц маршрутизации по умолчанию — это более проверяемый шаблон ANS-C01, потому что он заставляет вас быть явными в отношении того, какие подключения заполняют какие таблицы маршрутизации. Автоматическая ассоциация — это настройка для удобства; ручная — для аудита.
Ресурс-присоединение — это мост для каждой VPC. Когда обе VPC присоединены, TGW знает об их CIDR; нам все еще нужно добавить маршруты из основной таблицы маршрутизации каждой VPC, указывающие на TGW (Шаг 5).
resource "aws_ec2_transit_gateway" "hub" {
description = "certlabpro-ans-c01 hub"
default_route_table_association = "disable"
default_route_table_propagation = "disable"
multicast_support = "disable"
tags = { Name = "certlabpro-ans-c01-tgw" }
}
resource "aws_ec2_transit_gateway_route_table" "main" {
transit_gateway_id = aws_ec2_transit_gateway.hub.id
tags = { Name = "certlabpro-ans-c01-tgw-rt" }
}
resource "aws_ec2_transit_gateway_vpc_attachment" "primary" {
transit_gateway_id = aws_ec2_transit_gateway.hub.id
vpc_id = aws_vpc.primary.id
subnet_ids = [aws_subnet.primary_a.id]
transit_gateway_default_route_table_association = false
transit_gateway_default_route_table_propagation = false
}
resource "aws_ec2_transit_gateway_vpc_attachment" "secondary" {
transit_gateway_id = aws_ec2_transit_gateway.hub.id
vpc_id = aws_vpc.secondary.id
subnet_ids = [aws_subnet.secondary_a.id]
transit_gateway_default_route_table_association = false
transit_gateway_default_route_table_propagation = false
}
resource "aws_ec2_transit_gateway_route_table_association" "primary" {
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.primary.id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.main.id
}
resource "aws_ec2_transit_gateway_route_table_association" "secondary" {
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.secondary.id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.main.id
}
resource "aws_ec2_transit_gateway_route_table_propagation" "primary" {
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.primary.id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.main.id
}
resource "aws_ec2_transit_gateway_route_table_propagation" "secondary" {
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.secondary.id
transit_gateway_route_table_id = aws_ec2_transit_gateway_route_table.main.id
}TGW из Шага 4 знает об обеих VPC, но собственная таблица маршрутизации каждой VPC до сих пор не знает, как достичь другой. Мы добавляем явные маршруты в обоих направлениях: таблица маршрутизации VPC #1 отправляет трафик 10.1.0.0/16 в TGW, и наоборот. Экзамен неоднократно проверяет это требование двусторонней связи — вопрос "Я подключил обе к TGW, почему они не пингуются?" почти всегда связан с отсутствующим маршрутом обратного пути.
Наконец, VPC Flow Logs. Область Network Monitoring ANS-C01 тестирует их как единственный способ увидеть, какие пакеты фактически проходят через вашу сеть — принятые, отклоненные и только метаданные (кортеж из 5 элементов + байты + пакеты + результат). Мы включаем их для основной VPC, при этом логи направляются в выделенную группу логов CloudWatch. Роль IAM, которую мы прикрепляем, — это роль, которую Flow Logs принимает для записи в группу логов.
С установленными маршрутами и работающими Flow Logs магистраль завершена. Две двухстековые VPC, соединенные через TGW с явной (удобной для аудита) маршрутизацией, с видимостью на уровне пакетов на основной стороне. Каждый дополнительный шаблон ANS-C01 (Direct Connect Gateway, TGW peering, NAT, PrivateLink, конечные точки VPC) прикрепляется к этой базе.
resource "aws_route" "primary_to_secondary" {
route_table_id = aws_vpc.primary.main_route_table_id
destination_cidr_block = "10.1.0.0/16"
transit_gateway_id = aws_ec2_transit_gateway.hub.id
depends_on = [aws_ec2_transit_gateway_vpc_attachment.primary]
}
resource "aws_route" "secondary_to_primary" {
route_table_id = aws_vpc.secondary.main_route_table_id
destination_cidr_block = "10.0.0.0/16"
transit_gateway_id = aws_ec2_transit_gateway.hub.id
depends_on = [aws_ec2_transit_gateway_vpc_attachment.secondary]
}
# ── VPC Flow Logs ─────────────────────────────────────────────
resource "aws_cloudwatch_log_group" "vpc_flow" {
name = "/aws/vpc-flow/certlabpro-ans-c01-primary"
retention_in_days = 30
}
resource "aws_iam_role" "vpc_flow" {
name = "certlabpro-ans-c01-vpc-flow"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = { Service = "vpc-flow-logs.amazonaws.com" }
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy" "vpc_flow" {
name = "write-flow-logs"
role = aws_iam_role.vpc_flow.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogGroups",
"logs:DescribeLogStreams",
]
Resource = aws_cloudwatch_log_group.vpc_flow.arn
}]
})
}
resource "aws_flow_log" "primary" {
vpc_id = aws_vpc.primary.id
traffic_type = "ALL"
log_destination_type = "cloud-watch-logs"
log_destination = aws_cloudwatch_log_group.vpc_flow.arn
iam_role_arn = aws_iam_role.vpc_flow.arn
max_aggregation_interval = 60
}terraform destroy удаляет все ресурсы в этой лабораторной работе, но будьте осторожны с порядком — отсоединение подключений Transit Gateway занимает 5–10 минут, и сам TGW не может быть удален, пока оба подключения полностью не исчезнут. terraform destroy корректно обрабатывает граф зависимостей, но операция не быстрая. Не нажимайте Ctrl-C в середине процесса удаления, иначе вы получите наполовину отсоединенные подключения, которые придется удалять через консоль.
Главная причина оперативно удалить ресурсы — это почасовая плата за TGW — два подключения по $0,05/час каждое = $72/месяц суммарно. Затраты на лабораторную работу быстро накапливаются, если вы забудете, что она запущена.
ANS-C01 охватывает сетевые аспекты, которые не помещаются в эту лабораторную работу — Direct Connect (нет тестовой среды без физического порта), AWS Site-to-Site VPN (требуется конечная точка на стороне клиента), входящие/исходящие конечные точки Route 53 Resolver для гибридного DNS, службы PrivateLink + VPC endpoint, AWS Network Firewall, AWS Global Accelerator, проверки работоспособности Route 53 + переключение при сбое, Network Access Analyzer, Reachability Analyzer, пиринг Transit Gateway (межрегиональный), Cloud WAN, AWS App Mesh и сценарии, специфичные для BGP (фильтрация маршрутов, prepend, манипуляция AS-PATH).
Мы придерживаемся архитектуры многосетевой магистрали (multi-VPC backbone), потому что это единственная наиболее часто тестируемая архитектура на экзамене — подключения Direct Connect, VPN-туннели, гибридный DNS и PrivateLink — все они основываются на таком типе хаба TGW. Правильно настройте архитектуру "звезда"; типы "лучей" являются ее расширениями.
Для аспектов, которые не были настроены, разделы Просмотр, Справочник и Editorial этой страницы сертификации содержат концептуальное описание. Последующая лабораторная работа, добавляющая Route 53 Resolver + VPN-подключение + PrivateLink, завершила бы историю гибридной сети.