Dernière révision : mai 2026
Configurez les services AWS figurant à l'examen SAP-C02 avec Terraform simple — un bloc à la fois, chacun étant lié à un domaine de l'examen. Le même code fonctionne sur OpenTofu.
À la fin de ce labo, vous aurez provisionné, avec du Terraform simple, l'échafaudage d'entreprise que chaque question SAP-C02 multi-comptes suppose — une structure d'UO AWS Organizations, une politique de contrôle de service (SCP) qui impose une limite de régions autorisées, un rôle IAM inter-comptes que les charges de travail des services partagés peuvent assumer, et un journal CloudTrail d'organisation centralisé écrivant dans un compartiment S3 immuable. Il s'agit de l'architecture multi-comptes régie à l'échelle que l'examen teste plus de 30% du temps.
Chaque ressource est du Terraform simple. Déposez les extraits dans un seul fichier main.tf, exécutez terraform init, puis terraform apply étape par étape.
>= 1.5 ou OpenTofu >= 1.6.us-east-1 sur le compte de gestion.Toutes les ressources Organizations et IAM sont toujours gratuites. Les deux éléments payants :
L'ensemble de la pile est à l'arrêt pour 0 $. Détruisez-la une fois terminé pour éviter que le compartiment de journaux d'audit n'accumule des preuves de conformité que vous ne voudriez pas conserver indéfiniment.
Ouverture standard. Organizations est un service global, mais ses points de terminaison d'API sont à us-east-1. Exécutez toujours Terraform au niveau de l'organisation depuis us-east-1 — l'examen SAP-C02 teste ce détail précis sous Connectivité réseau et distribution de contenu lors de l'évaluation des architectures multi-régions.
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"
}Si le compte de gestion n'est pas déjà un maître d'Organisation, cette ressource crée l'Organisation. Le paramètre feature_set = "ALL" active les SCP (l'alternative facturation consolidée uniquement omet entièrement les SCP — le SAP-C02 teste les deux modes). La liste enabled_policy_types active les trois types de politiques que ce labo utilise ; vous ajouteriez BACKUP_POLICY et AISERVICES_OPT_OUT_POLICY pour ces domaines.
Les deux UO que nous créons — Production et NonProduction — sont la forme de référence SAP-C02 pour la portée des garde-fous. Les SCP s'attachent aux UO ; les UO contiennent les comptes. Le placement des comptes dans les UO est le plus grand levier dont dispose un architecte multi-comptes, car chaque SCP se répercute de l'UO vers chaque compte en dessous.
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
}Les SCP sont la primitive de gouvernance du SAP-C02 — elles sont le seul mécanisme qui peut empêcher les administrateurs d'un compte membre de faire quelque chose, point final. Le modèle de SCP le plus testé de loin est la restriction des régions autorisées : même si l'administrateur IAM d'un compte membre accorde *:* à tout le monde, le garde-fou régional imposé par le SCP bloque toujours les opérations en dehors de l'ensemble autorisé.
La politique ci-dessous refuse toute action ec2:*, rds:*, et lambda:* dont aws:RequestedRegion n'est pas us-east-1 ou us-west-2. Les services globaux (IAM, Organizations, CloudFront) ne sont pas affectés car ils n'honorent pas la condition RequestedRegion. Le SAP-C02 teste cette exception exacte — les étudiants qui refusent *:* en dehors des régions autorisées brisent accidentellement IAM et se bloquent eux-mêmes.
La politique s'attache aux deux UO de l'étape 2. Les comptes à l'intérieur de ces UO sont régis ; le compte de gestion n'est pas affecté (une question piège récurrente du SAP-C02 : "pourquoi la SCP ne bloque-t-elle pas le maître de l'organisation ?" — parce que par conception, elle ne le peut pas).
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
}L'IAM inter-comptes est la primitive services partagés du SAP-C02. Le modèle : un compte de charge de travail crée un rôle avec une politique de confiance désignant le compte de services partagés comme principal de confiance ; des personnes ou des services dans le compte de services partagés sts:AssumeRole dans le compte de charge de travail pour effectuer leur travail. C'est ainsi que chaque architecture de référence SAP-C02 gère l'observabilité, l'audit, le déploiement et la plateforme de données en tant que service centralisés.
Nous incluons une condition MFA (aws:MultiFactorAuthPresent = true) — l'examen teste cela comme la différence entre une politique de confiance sécurisée et une politique simplement fonctionnelle. La condition ExternalId est le deuxième volet de la défense contre le problème du délégué — recommandée pour l'accès tiers, mais également couramment utilisée pour les accès inter-comptes internes.
La politique de permissions en ligne donne au rôle assumé un accès en lecture à tout ce que la charge de travail doit faire ; pour le labo, nous accordons un accès en lecture seule au compartiment de journaux d'audit que nous créerons à l'étape 5. En production, vous affineriez cela davantage.
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.Le point culminant de toute histoire de gouvernance multi-comptes SAP-C02 est le journal d'organisation — un seul journal CloudTrail, configuré dans le compte de gestion, qui capture les événements de gestion de chaque compte membre de l'organisation. Le SAP-C02 teste cela par rapport à l'anti-pattern un journal par compte (bruyant opérationnellement, audit incomplet, plus coûteux).
Le compartiment S3 nécessite une politique de compartiment spécifique qui accorde à CloudTrail la permission s3:PutObject avec les bonnes conventions de chemin — cloudtrail.amazonaws.com comme principal de service, l'aws:SourceArn correspondant au journal. Les questions du SAP-C02 sur la raison pour laquelle CloudTrail ne peut pas écrire dans un compartiment centralisé pointent presque toujours vers cette politique.
Une fois le journal en place, chaque appel API de chaque compte de l'organisation atterrit dans ce compartiment. Le rôle IAM de l'étape 4 accorde au compte de services partagés un accès en lecture au compartiment — ce qui signifie qu'une équipe d'audit centralisée peut examiner l'activité de l'ensemble de l'organisation sans jamais avoir besoin d'accéder aux comptes membres individuels. C'est l'architecture d'entreprise SAP-C02 en cinq blocs.
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 démantèle tout dans ce labo, avec des mises en garde :
terraform destroy si des comptes membres existent. Si vous avez joint des comptes à l'organisation pendant le labo, vous devez d'abord les supprimer via la console AWS Organizations (ou via l'API). Un compte de gestion sans comptes membres peut quitter sa propre organisation, mais la destruction de Terraform échouera si l'organisation a des enfants. Pour un labo propre, n'exécutez ceci que sur un compte vierge sans comptes membres joints.force_destroy = false. CloudTrail y aura écrit au moins quelques événements au moment où vous le détruirez. Videz-le d'abord via aws s3 rm s3://<bucket> --recursive.Le SAP-C02 couvre une surface architecturale énorme que ce laboratoire ne peut pas inclure — Control Tower (pas de moyen propre à Terraform de provisionner ; l'API AWS nécessite une interaction avec la console pour la configuration de la zone d'atterrissage), Service Catalog (produits multi-comptes), l'agrégateur AWS Config pour la conformité à l'échelle de l'organisation, les politiques de coffre-fort AWS Backup à travers les comptes, AWS RAM (Resource Access Manager), les StackSets CloudFormation pour l'IaC multi-comptes, Direct Connect Gateway, Aurora Global Database, AWS Migration Hub, AWS Application Migration Service (AWS MGN), la famille Storage Gateway et les différents services AWS hybrides (Outposts, Local Zones, Wavelength).
Nous nous en tenons aux quatre primitives d'entreprise fondamentales car elles sont la base à laquelle tous les autres modèles SAP-C02 s'attachent. RAM partage les ressources entre les comptes de l'Organisation à partir de l'étape 2. L'agrégateur Config rassemble les résultats de conformité dans le compte de gestion qui possède le journal de l'étape 5. Les StackSets déploient l'IaC dans la structure d'UO de l'étape 2 en utilisant le modèle de rôle inter-comptes de l'étape 4. Construisez d'abord la fondation.
Pour les surfaces non provisionnées, les sections Parcourir, Guide et Editorial de cette page de certification offrent une couverture conceptuelle. L'examen SAP-C02 teste la reconnaissance de ces modèles bien plus que le provisionnement pratique de chacun — le labo vise à intégrer les quatre formes fondamentales dans la mémoire musculaire.