Последняя проверка: май 2026 г.
Разверните сервисы AWS для экзамена SAP-C02 с помощью чистого Terraform: пошаговое руководство с привязкой каждого блока к разделам экзамена. Код также совместим с OpenTofu.
К концу этой лабораторной работы вы, используя обычный Terraform, развернете корпоративную инфраструктуру, которую подразумевает каждый вопрос SAP-C02 по многоаккаунтной среде — структуру организационных единиц (OU) AWS Organizations, политику управления сервисами (SCP), которая обеспечивает ограничение разрешенных регионов, кросс-аккаунтную роль IAM, которую могут использовать рабочие нагрузки общих служб, и централизованный организационный журнал CloudTrail, записывающий данные в неизменяемый бакет S3. Это архитектура «многоаккаунтной управляемой в масштабе» (multi-account governed-at-scale), которая проверяется на экзамене в более чем 30% случаев.
Каждый ресурс — это чистый Terraform. Вставьте фрагменты кода в один файл main.tf, выполните terraform init, затем terraform apply шаг за шагом.
>= 1.5 или OpenTofu >= 1.6.us-east-1 с использованием управляющей учетной записи.Все ресурсы Organizations и IAM всегда бесплатны. Два платных пункта:
Вся инфраструктура простаивает за $0. Удалите ресурсы по завершении, чтобы бакет с журналами аудита не накапливал данные о соответствии, которые вы, возможно, не захотите хранить вечно.
Стандартное начало. Organizations — это глобальный сервис, но его конечные точки API находятся в us-east-1. Всегда запускайте Terraform на уровне организации из us-east-1 — экзамен SAP-C02 проверяет эту конкретную деталь в разделе Сетевое взаимодействие и доставка контента при оценке многорегиональных архитектур.
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-sap-c02"
ManagedBy = "terraform"
}
}
}
data "aws_caller_identity" "current" {}
# Replace with the 12-digit account ID of the *shared-services* account
# we are wiring cross-account trust to in Step 4.
locals {
shared_services_account_id = "111122223333"
}Если управляющая учетная запись еще не является основной учетной записью Организации, этот ресурс создает Организацию. Параметр feature_set = "ALL" включает SCP (альтернатива только консолидированная оплата полностью исключает SCP — SAP-C02 тестирует оба режима). Список enabled_policy_types включает три типа политик, используемых в этой лабораторной работе; для соответствующих доменов вы бы добавили BACKUP_POLICY и AISERVICES_OPT_OUT_POLICY.
Две создаваемые нами OU — Production и NonProduction — являются эталонной формой SAP-C02 для определения области применения ограничений. SCPs прикрепляются к OU; OU содержат учетные записи. Размещение учетных записей в OU является самым большим рычагом для архитектора многоаккаунтной среды, потому что каждый SCP каскадируется от OU ко всем учетным записям под ней.
resource "aws_organizations_organization" "main" {
feature_set = "ALL"
enabled_policy_types = [
"SERVICE_CONTROL_POLICY",
"TAG_POLICY",
]
aws_service_access_principals = [
"cloudtrail.amazonaws.com",
]
}
resource "aws_organizations_organizational_unit" "production" {
name = "Production"
parent_id = aws_organizations_organization.main.roots[0].id
}
resource "aws_organizations_organizational_unit" "non_production" {
name = "NonProduction"
parent_id = aws_organizations_organization.main.roots[0].id
}SCP являются примитивом управления SAP-C02 — это единственный механизм, который может полностью запретить администраторам дочерней учетной записи выполнять определенные действия. Наиболее часто проверяемый шаблон SCP — это ограничение разрешенных регионов: даже если администратор IAM дочерней учетной записи предоставит *:* всем, ограничение региона, наложенное SCP, все равно блокирует операции за пределами разрешенного набора.
Политика ниже запрещает все действия ec2:*, rds:* и lambda:*, если aws:RequestedRegion не является одним из us-east-1 или us-west-2. Глобальные сервисы (IAM, Organizations, CloudFront) не затрагиваются, потому что они не учитывают условие RequestedRegion. SAP-C02 проверяет именно это исключение — студенты, которые запрещают *:* за пределами разрешенных регионов, случайно ломают IAM и блокируют себе доступ.
Политика прикрепляется к обеим OU из Шага 2. Учетные записи внутри этих OU регулируются; управляющая учетная запись не затрагивается (повторяющийся вопрос-ловушка SAP-C02: "почему SCP не блокирует основную учетную запись организации?" — потому что по замыслу она не может).
resource "aws_organizations_policy" "allowed_regions" {
name = "certlabpro-sap-c02-allowed-regions"
description = "Deny ec2/rds/lambda outside the allowed regions."
type = "SERVICE_CONTROL_POLICY"
content = jsonencode({
Version = "2012-10-17"
Statement = [{
Sid = "DenyNonAllowedRegions"
Effect = "Deny"
NotAction = [
"iam:*",
"organizations:*",
"cloudfront:*",
"route53:*",
"support:*",
"sts:*",
"waf:*",
]
Resource = "*"
Condition = {
StringNotEquals = {
"aws:RequestedRegion" = ["us-east-1", "us-west-2"]
}
}
}]
})
}
resource "aws_organizations_policy_attachment" "production" {
policy_id = aws_organizations_policy.allowed_regions.id
target_id = aws_organizations_organizational_unit.production.id
}
resource "aws_organizations_policy_attachment" "non_production" {
policy_id = aws_organizations_policy.allowed_regions.id
target_id = aws_organizations_organizational_unit.non_production.id
}Кросс-аккаунтный IAM — это примитив общих служб SAP-C02. Шаблон: учетная запись рабочей нагрузки создает роль с политикой доверия, указывающей учетную запись общих служб в качестве доверенного принципала; люди или службы в учетной записи общих служб выполняют sts:AssumeRole в учетную запись рабочей нагрузки для выполнения своей работы. Так каждая эталонная архитектура SAP-C02 обрабатывает централизованную наблюдаемость, аудит, развертывание и платформу данных как услугу.
Мы включаем условие MFA (aws:MultiFactorAuthPresent = true) — экзамен проверяет это как разницу между безопасной политикой доверия и просто функциональной. Условие ExternalId является второй частью защиты от проблемы делегирования — рекомендуется для стороннего доступа, но также часто встречается и для внутренних кросс-аккаунтных сценариев.
Встроенная политика разрешений предоставляет предполагаемой роли доступ для чтения к тому, что необходимо рабочей нагрузке; для лабораторной работы мы предоставляем доступ только для чтения к бакету для журналов аудита, который мы создадим на Шаге 5. В рабочей среде вы бы еще больше сузили эти разрешения.
resource "aws_iam_role" "shared_services_reader" {
name = "certlabpro-sap-c02-shared-services-reader"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Principal = {
AWS = "arn:aws:iam::${local.shared_services_account_id}:root"
}
Action = "sts:AssumeRole"
Condition = {
Bool = {
"aws:MultiFactorAuthPresent" = "true"
}
StringEquals = {
"sts:ExternalId" = "certlabpro-sap-c02-external-id"
}
}
}]
})
max_session_duration = 3600
}
# The reader-policy is wired in Step 5 once the audit bucket exists.Венцом любой истории управления многоаккаунтной средой SAP-C02 является организационный журнал (organization trail) — один журнал CloudTrail, настроенный в управляющей учетной записи, который фиксирует события управления для каждой дочерней учетной записи в организации. SAP-C02 проверяет это в сравнении с антипаттерном один журнал на учетную запись (операционно шумный, неполный аудит, дороже).
Бакету S3 требуется специальная политика бакета, которая предоставляет CloudTrail разрешение s3:PutObject с правильными соглашениями о путях — cloudtrail.amazonaws.com в качестве сервисного принципала, aws:SourceArn, соответствующий журналу. Вопросы SAP-C02 о том, почему CloudTrail не может записывать данные в централизованный бакет, почти всегда указывают на эту политику.
При наличии журнала каждый вызов API из каждой учетной записи в организации попадает в этот бакет. Роль IAM из Шага 4 предоставляет учетной записи общих служб доступ для чтения к бакету — это означает, что централизованная группа аудита может просматривать активность по всей организации, не требуя доступа к отдельным дочерним учетным записям. Это корпоративная архитектура SAP-C02 в пяти блоках.
resource "aws_s3_bucket" "audit_logs" {
bucket_prefix = "certlabpro-sap-c02-audit-"
}
resource "aws_s3_bucket_public_access_block" "audit_logs" {
bucket = aws_s3_bucket.audit_logs.id
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
resource "aws_s3_bucket_versioning" "audit_logs" {
bucket = aws_s3_bucket.audit_logs.id
versioning_configuration {
status = "Enabled"
}
}
resource "aws_s3_bucket_policy" "audit_logs_cloudtrail" {
bucket = aws_s3_bucket.audit_logs.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Sid = "AWSCloudTrailAclCheck"
Effect = "Allow"
Principal = { Service = "cloudtrail.amazonaws.com" }
Action = "s3:GetBucketAcl"
Resource = aws_s3_bucket.audit_logs.arn
},
{
Sid = "AWSCloudTrailWrite"
Effect = "Allow"
Principal = { Service = "cloudtrail.amazonaws.com" }
Action = "s3:PutObject"
Resource = "${aws_s3_bucket.audit_logs.arn}/AWSLogs/*"
Condition = {
StringEquals = {
"s3:x-amz-acl" = "bucket-owner-full-control"
}
}
},
]
})
}
resource "aws_cloudtrail" "org_trail" {
name = "certlabpro-sap-c02-org-trail"
s3_bucket_name = aws_s3_bucket.audit_logs.bucket
is_multi_region_trail = true
is_organization_trail = true
include_global_service_events = true
enable_log_file_validation = true
depends_on = [
aws_s3_bucket_policy.audit_logs_cloudtrail,
aws_organizations_organization.main,
]
}
# Cross-account IAM permissions (continued from Step 4): the role we
# created earlier now gets read access to the audit bucket so a
# shared-services audit team can query CloudTrail across the org.
resource "aws_iam_role_policy" "shared_services_audit_read" {
name = "read-audit-logs"
role = aws_iam_role.shared_services_reader.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Allow"
Action = ["s3:GetObject", "s3:ListBucket"]
Resource = [aws_s3_bucket.audit_logs.arn, "${aws_s3_bucket.audit_logs.arn}/*"]
}]
})
}terraform destroy удаляет все в этой лабораторной работе, с оговорками:
terraform destroy, если существуют дочерние учетные записи. Если вы присоединили учетные записи к организации во время лабораторной работы, вы должны сначала удалить их через консоль AWS Organizations (или через API). Управляющая учетная запись без дочерних учетных записей может покинуть свою организацию, но удаление Terraform завершится неудачей, если у организации есть дочерние элементы. Для чистой лабораторной работы запускайте это только для новой учетной записи, к которой не присоединены дочерние учетные записи.force_destroy = false. К моменту удаления CloudTrail запишет в него как минимум несколько событий. Сначала очистите его с помощью aws s3 rm s3://<bucket> --recursive.SAP-C02 охватывает огромную архитектурную поверхность, которую невозможно вместить в эту лабораторную работу — Control Tower (нет чистого способа развертывания с помощью Terraform; API AWS требует взаимодействия с консолью для настройки целевой зоны), Service Catalog (продукты для нескольких учетных записей), агрегатор AWS Config для соблюдения требований в масштабах организации, политики хранилища AWS Backup для нескольких учетных записей, AWS RAM (Resource Access Manager), CloudFormation StackSets для IaC в многоаккаунтной среде, Direct Connect Gateway, Aurora Global Database, AWS Migration Hub, AWS Application Migration Service (AWS MGN), семейство Storage Gateway и различные гибридные сервисы AWS (Outposts, Local Zones, Wavelength).
Мы придерживаемся четырех основных корпоративных примитивов, потому что они являются основой, к которой привязываются все остальные шаблоны SAP-C02. RAM совместно использует ресурсы между учетными записями в Организации из Шага 2. Агрегатор Config собирает результаты соответствия в управляющую учетную запись, которой принадлежит журнал из Шага 5. StackSets развертывают IaC в структуру OU из Шага 2, используя шаблон кросс-аккаунтной роли из Шага 4. Сначала заложите основу.
Для непровизионированных поверхностей разделы Просмотр, Справочник и Editorial этой страницы сертификации содержат концептуальное описание. Экзамен SAP-C02 проверяет распознавание этих шаблонов гораздо больше, чем практическое развертывание каждого из них — лабораторная работа направлена на закрепление этих четырех основополагающих форм в мышечной памяти.