Amazon DVA-C02: CloudFormation 與基礎設施即程式碼 (SAM, CDK) — 學習指南

屬於 AWS Developer Associate DVA-C02 — 學習指南. 使用經過驗證的解答練習: Amazon 考試中心, 或參加限時模擬考試: ExamRoll.io.

CloudFormation 核心模式與範本最佳實踐

CloudFormation 範本應撰寫為宣告式、冪等的資源描述,對於複雜的架構,應偏好使用小而集中的堆疊 (stack) 和巢狀堆疊 (nested stacks)。使用帶有明確邏輯 ID 的 Resources 區段,並優先使用 !Ref、!GetAtt、!Sub、Fn::FindInMap 和 Fn::If 等內建函式來進行組合與重用。在建立變更集 (change sets) 之前,使用 aws cloudformation validate-template 或 SAM/CDK 的對應指令 (sam validate, cdk synth) 來驗證範本。使用 ChangeSets (CreateChangeSet / ExecuteChangeSet) 進行審查,以避免意外的資源替換;使用 DescribeChangeSet 來檢查堆疊將執行的操作。透過將大型的行內程式碼移至 S3 並以參考方式引用 (例如 CodeUri, S3Bucket/S3Key),或使用 AWS::CloudFormation::Stack 將其分解為巢狀堆疊,來讓範本主體大小保持在 CloudFormation 的限制內。使用 DetectStackDriftDescribeStackResourceDrifts 定期執行偏差偵測 (drift detection)。使用 DeletionPolicyUpdateReplacePolicy 來保護承載資料的資源,並在關鍵的堆疊上啟用終止保護 (termination protection)。將 cfn-lintcfn-guard 整合到 CI/CD 流程中,以便及早發現結構性問題和政策違規。為了快速迭代,可利用 ChangeSets 和資源層級的更新策略來最小化爆炸半徑;對於 Lambda 函數,則使用版本化部署,使更新安全且可逆。

參數化、對應、機密與敏感資料

使用 CloudFormation Parameters 和 Mappings 將環境差異參數化,並利用 AllowedValuesConstraintDescription 來達成快速失敗 (fail fast)。避免在 Parameters 中嵌入機密或明文憑證;應改用 SecureString 類型的 SSM Parameter Store 或 Secrets Manager,並透過動態參考 (例如 {{resolve:secretsmanager:mysecret:SecretString:password}}) 或使用 AWS::SSM::Parameter::Value<String> 類型來引用它們。對於敏感參數,標記 NoEcho: true 以在主控台中遮罩其值,但請注意 NoEcho 並不提供靜態加密——應使用 Secrets Manager 來進行稽核和輪換。使用 Mappings 和 Fn::FindInMap 來處理確定性的、特定於環境的值 (例如每個區域的 AMI ID),並使用 Fn::GetAZs 來計算可用區域。對於同一區域/帳戶內跨堆疊的資源參考,可匯出輸出值 (outputs) 並透過 Fn::ImportValue 匯入;請記住,匯入無法跨帳戶或區域。透過以最小權限範圍劃定角色來保護 CloudFormation 使用的 IAM 主體;優先選擇服務管理的 StackSet 權限,或明確地佈建一個範圍受限的管理角色。當將環境變數傳遞給容器或 Lambda 時,優先參考 Secrets Manager ARN 或 SSM Parameter ARN,並在程式碼中於執行階段擷取,或使用 SAM/CDK 的功能,透過 KMS 加密將安全值注入環境中。

跨帳戶/區域部署、CDK 與 SAM 的多帳戶模式

跨帳戶和跨區域的部署需要超越單一堆疊匯出 (exports) 的編排機制。對於多帳戶/多區域部署,可選擇 CloudFormation StackSets (CreateStackSet, CreateStackInstances),搭配用於 Organizations 的服務管理權限,或在目標帳戶中使用執行角色的自我管理模式。對於應用程式碼成品,可使用具備跨帳戶複寫或儲存貯體政策的集中化 S3 儲存貯體,或讓工具按區域發布資產:CDK 使用引導堆疊 (bootstrap stacks) 和透過 cdk-assets 發布的資產,並需要在每個帳戶/區域執行 cdk bootstrap;CDK Pipelines (pipelines 模組) 或帶有 --role-arnaws-cdk CLI 支援跨帳戶晉升。SAM 使用 sam package / sam deploy 將成品上傳到 S3 儲存貯體;對於多帳戶情境,可使用 CI/CD 將成品封裝並推送到目標帳戶的儲存貯體,然後使用適當的憑證執行部署。避免使用 CDK 的上下文查詢 (context lookups,如 VPC.fromLookup 等),因為它們在合成階段 (synth time) 需要特定帳戶的權限;應改為明確地將識別碼作為參數傳遞,以保持合成的可重現性。使用 AWS CodePipeline 或 GitHub Actions 搭配擔任的角色 (assumed roles,即 sts:AssumeRole) 來對目標帳戶執行部署,並確保引導堆疊和必要的服務連結角色都已存在。請記住 CloudFormation 的匯出 (exports) 是區域性的;對於跨帳戶分發,應優先選擇 StackSets 或由 pipeline 驅動的部署方式。

自訂資源、堆疊保護與本機/增量部署加速器

當 CloudFormation 缺乏原生資源類型時,請使用自訂資源,實作由 Lambda 支援的提供者,並遵循 CloudFormation 對於 Create/Update/Delete 事件的回應協定。建立冪等的處理常式,使用 cfn-response 或 CloudFormation CLI 框架來回應,並透過進度事件或將狀態儲存在 DynamoDB 中來處理長時間執行的動作。請注意自訂資源的逾時問題:CloudFormation 有一個最大的堆疊操作逾時時間,由 Lambda 支援的資源必須在此時間範圍內完成,否則會導致堆疊回滾。使用堆疊政策 (SetStackPolicy) 保護關鍵資源,以在堆疊更新期間阻止對指定邏輯 ID 的替換或更新,並對您無法承受被刪除的環境啟用終止保護。對於增量與本機開發,可使用 AWS SAM CLI (sam build, sam local invoke, sam local start-api) 和 sam sync 進行僅程式碼的快速更新,以及使用 CDK watch 或 cdk deploy 搭配資產來僅更新有變更的資源;這些工具會計算資產雜湊 (lambda asset hashing),因此只有變更過的程式碼會被重新發佈。整合 CloudFormation ChangeSets、Lambda 版本控制 (在 SAM 中為 AutoPublishAlias 或在 CDK 中為 lambda.Version) 以及 CodeDeploy 的流量轉移功能,以實現安全的部署。常見的陷阱包括超過範本或參數的限制、不正確地使用跨帳戶匯入,以及在處理常式內部初始化笨重的 SDK 用戶端導致冷啟動延遲——應優先使用全域、延遲初始化的用戶端,並具備可設定的逾時與重試行為。

實務問題:使用案例情境

情境:AcmeMedia 在 us-east-1 區域管理一個多帳戶的 AWS organization,其中包含獨立的 Dev、Staging 和 Prod 帳戶。一個無伺服器影像處理服務 (Lambda + S3 + DynamoDB) 必須一致地部署到所有帳戶,並將共用的敏感組態集中儲存。

挑戰:將相同的 CloudFormation/SAM/CDK 堆疊部署到多個帳戶,並確保 Lambda 程式碼產物能安全地在每個目標帳戶中使用,同時避免將秘密資訊寫入範本中。

建議方法:

  1. 使用具備服務管理權限的 AWS CloudFormation StackSets (aws cloudformation create-stack-set –stack-set-name ImageProcessor –template-body file://template.yaml),然後用 aws cloudformation create-stack-instances 來指定目標帳戶與區域;或者設定 CDK Pipelines,針對每個帳戶使用角色進行合成 (synth) 與部署。
  2. 使用 CDK 資產發佈功能 (在每個帳戶/區域執行 cdk bootstrap) 或 sam package 將 Lambda 資產封裝到各目標帳戶中的 S3 儲存貯體;透過 CI (使用 CodeBuild 搭配 aws s3 cp 或 S3 複寫) 自動化資產複製,並使用 cdk deploy 或 sam deploy 搭配目標帳戶的憑證進行部署。
  3. 將敏感組態儲存在每個帳戶的 AWS Secrets Manager 中,並在範本中透過動態參考 ({{resolve:secretsmanager:arn:aws:secretsmanager:us-east-1:123456789012:secret:ImageProcSecret:SecretString:apiKey}}) 來引用,或透過 Secrets Manager 的複寫功能部署一個複寫的秘密,以避免使用 NoEcho 參數。
  4. 使用 ChangeSets (create-change-set, execute-change-set),對生產環境的堆疊啟用終止保護,並使用堆疊政策來防止在更新過程中意外替換 DynamoDB 資料表或 S3 儲存貯體。

原理說明:StackSets 和由 pipeline 驅動的部署提供了安全、可稽核的多帳戶/區域傳播方式,而資產發佈與各帳戶專屬的秘密則讓憑證保持在本地且可供稽核。ChangeSets、終止保護和堆疊政策降低了迭代部署期間的風險。


Amazon DynamoDB 與 NoSQL 設計 · 所有領域 · 部署與 CI

練習這些題目 → · 在 ExamRoll.io 上限時練習 →

Pass the whole exam — not just this question

You found this answer. Get every verified question and explanation in one place, and save hours of prep. Free to start.

通過考試 →

瀏覽 Amazon →

Related guides

一站式存取

一份訂閱。所有考試。

每個方案都可無限存取答案搜尋、練習測驗、AI 解釋和完整的資源庫 — 支援 20 多種語言。

每月
24.87
Just €0.83/day
包含所有內容:
  • 無限答案搜尋
  • 無限練習測驗
  • AI 驅動的解釋
  • 完整資源庫
  • 20 多種語言
  • 每週內容更新
  • 獎勵與推薦
  • 優先支援
開始免費試用

無需信用卡*

最佳價值
12 個月
179.87
Just €0.49/daySave 40%
包含所有內容:
  • 無限答案搜尋
  • 無限練習測驗
  • AI 驅動的解釋
  • 完整資源庫
  • 20 多種語言
  • 每週內容更新
  • 獎勵與推薦
  • 優先支援
開始免費試用

無需信用卡*

✓ 包含免費方案 · ✓ 隨時取消 · ✓ 所有方案解鎖完整產品