Última revisión: mayo de 2026
Crea los servicios de AWS del examen SAP-C02 con Terraform puro: bloque a bloque, cada uno vinculado a un dominio del examen. El mismo código funciona en OpenTofu.
Al final de este laboratorio, habrá aprovisionado, con Terraform simple, el andamiaje empresarial que asume cada pregunta de múltiples cuentas de SAP-C02: una estructura de OU de AWS Organizations, una política de control de servicios que aplica una barrera de regiones permitidas, un rol de IAM entre cuentas que pueden asumir las cargas de trabajo de servicios compartidos, y un registro centralizado de la organización de CloudTrail que escribe en un bucket S3 inmutable. Esta es la arquitectura de múltiples cuentas gobernada a escala que el examen evalúa más del 30% del tiempo.
Cada recurso es Terraform simple. Inserte los fragmentos en un solo main.tf, ejecute terraform init y luego terraform apply paso a paso.
>= 1.5 o OpenTofu >= 1.6.us-east-1 contra la cuenta de administración.Todos los recursos de Organizations y IAM son siempre gratuitos. Los dos elementos de pago:
La pila completa permanece inactiva con un costo de $0. Destruya los recursos cuando termine para evitar que el bucket de registros de auditoría acumule evidencia de cumplimiento que quizás no desee retener para siempre.
Inicio estándar. Organizations es un servicio global, pero sus puntos de conexión de API están en us-east-1. Siempre ejecute Terraform a nivel de organización desde us-east-1: el examen SAP-C02 evalúa este detalle exacto en Conectividad de red y entrega de contenido al calificar arquitecturas multiregión.
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 la cuenta de administración aún no es la maestra de una organización, este recurso crea la organización. La configuración feature_set = "ALL" habilita las SCP (la alternativa de solo facturación consolidada omite las SCP por completo; SAP-C02 evalúa ambos modos). La lista enabled_policy_types opta por los tres tipos de políticas que utiliza este laboratorio; debería agregar BACKUP_POLICY y AISERVICES_OPT_OUT_POLICY para esos dominios.
Las dos UO que creamos, Production y NonProduction, son la forma de referencia de SAP-C02 para el alcance de las barreras de protección. Las SCP se adjuntan a las UO; las UO contienen cuentas. La ubicación de cuenta a UO es la palanca más grande que tiene un arquitecto de múltiples cuentas, porque cada SCP se propaga desde la UO hasta cada cuenta debajo de ella.
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
}Las SCP son la primitiva de gobernanza de SAP-C02: son el único mecanismo que puede evitar que los administradores de una cuenta miembro hagan algo, punto final. El patrón de SCP más probado con diferencia es la restricción de regiones permitidas: incluso si el administrador de IAM de una cuenta miembro otorga *:* a todos, la barrera regional impuesta por la SCP aún bloquea las operaciones fuera del conjunto permitido.
La política siguiente deniega todas las acciones ec2:*, rds:* y lambda:* cuya aws:RequestedRegion no sea us-east-1 o us-west-2. Los servicios globales (IAM, Organizations, CloudFront) no se ven afectados porque no respetan la condición RequestedRegion. SAP-C02 evalúa esta excepción exacta: los estudiantes que deniegan *:* fuera de las regiones permitidas rompen accidentalmente IAM y se quedan sin acceso.
La política se adjunta a ambas UO del Paso 2. Las cuentas dentro de esas UO están gobernadas; la cuenta de administración no se ve afectada (una pregunta trampa recurrente de SAP-C02: "¿por qué la SCP no bloquea al maestro de la organización?" — porque por diseño no puede).
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 entre cuentas es la primitiva de servicios compartidos de SAP-C02. El patrón: una cuenta de carga de trabajo crea un rol con una política de confianza que nombra a la cuenta de servicios compartidos como el principal de confianza; personas o servicios en la cuenta de servicios compartidos asumen el rol (sts:AssumeRole) en la cuenta de carga de trabajo para realizar su trabajo. Así es como cada arquitectura de referencia de SAP-C02 maneja la observabilidad centralizada, la auditoría, la implementación y la plataforma de datos como servicio.
Incluimos una condición de MFA (aws:MultiFactorAuthPresent = true) — el examen evalúa esto como la diferencia entre una política de confianza segura y una simplemente funcional. La condición ExternalId es la segunda pata de la defensa del problema del delegado — recomendada para acceso de terceros, pero también comúnmente vista en accesos internos entre cuentas.
La política de permisos en línea otorga al rol asumido acceso de lectura a lo que la carga de trabajo necesite hacer; para el laboratorio, concedemos acceso de solo lectura al bucket de registros de auditoría que crearemos en el Paso 5. En producción, esto se restringiría aún más.
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.El pilar de cualquier historia de gobernanza de múltiples cuentas de SAP-C02 es el rastro de la organización (o organization trail) — un único rastro de CloudTrail, configurado en la cuenta de administración, que captura eventos de administración en cada cuenta miembro de la organización. SAP-C02 evalúa esto en contraste con el anti-patrón de un rastro por cuenta (ruidoso operativamente, auditoría incompleta, cuesta más).
El bucket de S3 necesita una política de bucket específica que otorgue a CloudTrail el permiso s3:PutObject con las convenciones de ruta correctas — cloudtrail.amazonaws.com como el principal de servicio, y el aws:SourceArn que coincida con el rastro. Las preguntas de SAP-C02 sobre por qué CloudTrail no puede escribir en un bucket centralizado casi siempre apuntan a esta política.
Con el rastro en su lugar, cada llamada a la API en cada cuenta de la organización aterriza en este bucket. El rol de IAM del Paso 4 otorga a la cuenta de servicios compartidos acceso de lectura al bucket — lo que significa que un equipo de auditoría centralizado puede revisar la actividad en toda la organización sin necesidad de acceder a las cuentas miembro individuales. Esa es la arquitectura empresarial de SAP-C02 en cinco bloques.
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 destruye todo en este laboratorio, con algunas advertencias:
terraform destroy si existen cuentas miembro. Si unió cuentas a la organización durante el laboratorio, primero debe eliminarlas a través de la consola de AWS Organizations (o mediante la API). Una cuenta de administración sin cuentas miembro puede abandonar su propia organización, pero la destrucción de Terraform fallará si la organización tiene elementos secundarios. Para un laboratorio limpio, ejecute esto solo en una cuenta nueva sin cuentas miembro unidas.force_destroy = false. CloudTrail habrá escrito al menos algunos eventos en él cuando lo destruya. Vacíe primero con aws s3 rm s3://<bucket> --recursive.SAP-C02 cubre una enorme superficie arquitectónica que este laboratorio no puede abarcar: Control Tower (no hay una forma limpia de aprovisionar con Terraform; la API de AWS requiere interacción con la consola para la configuración de la zona de aterrizaje), Service Catalog (productos de múltiples cuentas), el agregador de AWS Config para el cumplimiento en toda la organización, las políticas de bóvedas de AWS Backup en todas las cuentas, AWS RAM (Resource Access Manager), CloudFormation StackSets para IaC de múltiples cuentas, Direct Connect Gateway, Aurora Global Database, AWS Migration Hub, AWS Application Migration Service (AWS MGN), la familia Storage Gateway y los diversos servicios híbridos de AWS (Outposts, Local Zones, Wavelength).
Nos adherimos a las cuatro primitivas empresariales fundamentales porque son la base a la que se adjunta cualquier otro patrón de SAP-C02. RAM comparte recursos entre cuentas en la Organización del Paso 2. El agregador de Config extrae hallazgos de cumplimiento en la cuenta de administración que posee el rastro del Paso 5. StackSets implementa IaC en la estructura de UO del Paso 2 utilizando el patrón de rol entre cuentas del Paso 4. Primero, construya la base.
Para las superficies no aprovisionadas, las secciones Buscar, Manual y Editorial de esta página de certificación tienen cobertura conceptual. El examen SAP-C02 evalúa mucho más el reconocimiento de estos patrones que el aprovisionamiento práctico de cada uno; el laboratorio trata de integrar las cuatro formas fundamentales en la memoria muscular.