अंतिम समीक्षा: मई 2026
साधारण Terraform के साथ SAP-C02 परीक्षा के AWS संसाधनों को बनाएं — एक समय में एक ब्लॉक, प्रत्येक परीक्षा डोमेन से जुड़ा हुआ। यही कोड OpenTofu पर भी काम करता है।
इस लैब के अंत तक, आप साधारण Terraform का उपयोग करके, उस एंटरप्राइज़ स्केफ़ोल्डिंग को प्रोविज़न कर लेंगे जिसकी हर SAP-C02 मल्टी-अकाउंट प्रश्न में कल्पना की जाती है — एक AWS Organizations OU संरचना, एक सर्विस कंट्रोल पॉलिसी जो अनुमत-क्षेत्रों के गार्डरेल को लागू करती है, एक क्रॉस-अकाउंट IAM भूमिका जिसे साझा-सेवा वर्कलोड मान सकते हैं, और एक केंद्रीकृत CloudTrail संगठन ट्रेल जो एक अपरिवर्तनीय S3 बकेट में लिखता है। यह वह मल्टी-अकाउंट शासित-एट-स्केल आर्किटेक्चर है जिसका परीक्षा 30% से अधिक समय तक परीक्षण करती है।
प्रत्येक संसाधन साधारण Terraform है। स्निपेट्स को एक ही main.tf में डालें, terraform init चलाएँ, फिर terraform apply को चरण-दर-चरण चलाएँ।
>= 1.5 या OpenTofu >= 1.6।us-east-1 के विरुद्ध AWS CLI प्रमाणित।सभी Organizations और IAM संसाधन हमेशा निःशुल्क हैं। दो सशुल्क आइटम:
पूरा स्टैक $0 पर निष्क्रिय रहता है। पूरा होने पर नष्ट कर दें ताकि ऑडिट-लॉग बकेट में ऐसे अनुपालन साक्ष्य जमा न हों जिन्हें आप हमेशा के लिए बनाए नहीं रखना चाहते।
मानक शुरुआत। Organizations एक वैश्विक सेवा है, लेकिन इसके API एंडपॉइंट us-east-1 में हैं। हमेशा us-east-1 से संगठन-स्तरीय Terraform चलाएँ — 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"
}यदि प्रबंधन अकाउंट पहले से Org मास्टर नहीं है, तो यह संसाधन Organization बनाता है। feature_set = "ALL" सेटिंग SCPs को सक्षम करती है (केवल समेकित बिलिंग विकल्प SCPs को पूरी तरह से छोड़ देता है — SAP-C02 दोनों मोड्स का परीक्षण करता है)। enabled_policy_types सूची उन तीन पॉलिसी प्रकारों में शामिल होती है जिनका यह लैब उपयोग करती है; आप उन डोमेन के लिए BACKUP_POLICY और AISERVICES_OPT_OUT_POLICY जोड़ेंगे।
हम जो दो OUs बनाते हैं — Production और NonProduction — वे गार्डरेल स्कोपिंग के लिए SAP-C02 संदर्भ आकार हैं। SCPs OUs से जुड़ते हैं; OUs अकाउंट्स रखते हैं। अकाउंट-से-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
}SCPs SAP-C02 के शासन के आदिम रूप हैं — वे एकमात्र तंत्र हैं जो किसी सदस्य अकाउंट के प्रशासकों को कुछ भी करने से पूरी तरह रोक सकते हैं। अब तक का सबसे अधिक परीक्षण किया गया SCP पैटर्न अनुमत-क्षेत्र प्रतिबंध है: भले ही किसी सदस्य अकाउंट का IAM प्रशासक सभी को *:* प्रदान करता है, SCP-लागू क्षेत्र गार्डरेल फिर भी अनुमत सेट के बाहर के ऑपरेशंस को ब्लॉक कर देता है।
नीचे दी गई पॉलिसी उन सभी ec2:*, rds:*, और lambda:* कार्यों को अस्वीकार करती है जिनकी aws:RequestedRegion us-east-1 या us-west-2 में से एक नहीं है। वैश्विक सेवाएँ (IAM, Organizations, CloudFront) अप्रभावित रहती हैं क्योंकि वे RequestedRegion शर्त का सम्मान नहीं करती हैं। SAP-C02 इस सटीक अपवाद का परीक्षण करता है — जो छात्र अनुमत क्षेत्रों के बाहर *:* को अस्वीकार करते हैं, वे गलती से IAM को तोड़ देते हैं और खुद को बाहर कर देते हैं।
यह पॉलिसी चरण 2 से दोनों OUs से जुड़ती है। उन OUs के अंदर के अकाउंट शासित होते हैं; प्रबंधन अकाउंट अप्रभावित रहता है (एक आवर्ती 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 मल्टी-अकाउंट गवर्नेंस स्टोरी का मुख्य बिंदु संगठन ट्रेल है — प्रबंधन अकाउंट में कॉन्फ़िगर किया गया एक CloudTrail ट्रेल, जो संगठन के प्रत्येक सदस्य अकाउंट में प्रबंधन इवेंट्स को कैप्चर करता है। SAP-C02 इसका परीक्षण प्रति अकाउंट एक ट्रेल एंटी-पैटर्न के विरुद्ध करता है (परिचालन रूप से शोरगुल वाला, ऑडिट-अधूरा, अधिक लागत वाला)।
S3 बकेट को एक विशिष्ट बकेट पॉलिसी की आवश्यकता होती है जो CloudTrail को सही पाथ कन्वेंशंस के साथ s3:PutObject अनुमति प्रदान करती है — सेवा प्रिंसिपल के रूप में cloudtrail.amazonaws.com, ट्रेल से मेल खाते हुए aws:SourceArn। SAP-C02 के प्रश्न कि CloudTrail केंद्रीकृत बकेट में क्यों नहीं लिख सकता, लगभग हमेशा इसी पॉलिसी पर इशारा करते हैं।
ट्रेल के स्थान पर होने से, संगठन के हर अकाउंट में हर API कॉल इस बकेट में आता है। चरण 4 से IAM भूमिका साझा-सेवा अकाउंट को बकेट तक पढ़ने की पहुँच प्रदान करती है — जिसका अर्थ है कि एक केंद्रीकृत ऑडिट टीम व्यक्तिगत सदस्य अकाउंटों तक पहुँच की आवश्यकता के बिना पूरे संगठन में गतिविधि की समीक्षा कर सकती है। यही पाँच ब्लॉकों में 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-स्वच्छ तरीका नहीं; लैंडिंग-ज़ोन सेटअप के लिए AWS API को कंसोल इंटरैक्शन की आवश्यकता होती है), Service Catalog (मल्टी-अकाउंट उत्पाद), संगठन-व्यापी अनुपालन के लिए AWS Config aggregator, अकाउंटों में AWS Backup वॉल्ट नीतियां, AWS RAM (Resource Access Manager), मल्टी-अकाउंट IaC के लिए CloudFormation StackSets, 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 से Organization में अकाउंटों के बीच संसाधनों को साझा करता है। Config aggregator अनुपालन निष्कर्षों को प्रबंधन अकाउंट में खींचता है जो चरण 5 से ट्रेल का मालिक है। StackSets चरण 4 से क्रॉस-अकाउंट भूमिका पैटर्न का उपयोग करके चरण 2 से OU संरचना में IaC को रोल आउट करते हैं। पहले नींव बनाएँ।
जिन सतहों को प्रोविजन नहीं किया गया है, उनके लिए इस प्रमाणन पृष्ठ के ब्राउज़, मार्गदर्शिका, और Editorial अनुभागों में वैचारिक कवरेज है। SAP-C02 परीक्षा इन पैटर्नों की पहचान का कहीं अधिक परीक्षण करती है बजाय इसके कि प्रत्येक के हाथों-हाथ प्रोविजनिंग का — लैब चार मूलभूत आकृतियों को मांसपेशी स्मृति में लाने के बारे में है।