examlab .net 用最有效率的方法,考取最有價值的認證
Vol. I
本篇導覽 約 32 分鐘

用 SAM 與 CloudFormation 做 IaC

6,400 字 · 約 32 分鐘閱讀 ·

全面掌握 DVA-C02 Task 3.1 的基礎設施即程式碼:AWS CloudFormation 模板結構、內建函式(Ref、Fn::GetAtt、Fn::Sub、Fn::ImportValue)、偽參數、資源屬性(DependsOn、DeletionPolicy、UpdateReplacePolicy、CreationPolicy、UpdatePolicy)、巢狀堆疊與跨堆疊匯出、變更集、偏移偵測、AWS SAM 轉換搭配 sam local、SAM Pipelines、AWS CDK…

立即做 20 題練習 → 免費 · 不用註冊 · DVA-C02

在 AWS 上實踐基礎設施即程式碼(Infrastructure as Code,IaC),意味著將雲端基礎設施以宣告式文字撰寫,交由 AWS CloudFormation、AWS SAM 或 AWS CDK 反覆部署、更新與拆除。對於 AWS Certified Developer Associate(DVA-C02)考試,Task Statement 3.1 要求考生能流暢閱讀 CloudFormation 模板、在特定情境中選用正確的內建函式、理解 SAM 簡寫巨集如何展開為原始 CloudFormation、除錯變更集(change set)與偏移(drift),以及推理跨帳號 StackSets 和 Lambda 支援的自訂資源。本指南涵蓋 CloudFormation 每個章節、每個內建函式、每個資源屬性,以及 DVA-C02 考試範圍內所有 SAM 與 CDK 工作流程。

什麼是 CloudFormation 與 AWS SAM?

AWS CloudFormation 是 AWS 的宣告式基礎設施即程式碼服務。你以 YAML 或 JSON 撰寫 CloudFormation 模板,描述 AWS 資源的預期終態,CloudFormation 就會以單一不可分割的單位(稱為堆疊,stack)佈建、更新或刪除這些資源。AWS SAM(Serverless Application Model)是 CloudFormation 的擴充套件,提供無伺服器應用程式的簡寫資源類型——AWS Lambda 函式、Amazon API Gateway API、Amazon DynamoDB 資料表,以及 AWS Step Functions 狀態機——在部署時透過 Transform: AWS::Serverless-2016-10-31 巨集展開為原始 CloudFormation。

DVA-C02 考試圍繞基礎設施即程式碼提出五個核心問題:

  1. CloudFormation 模板的結構為何(Resources、Parameters、Outputs、Mappings、Conditions、Rules、Metadata、Transform)?
  2. 要連接兩個資源,應呼叫哪個內建函式(Ref、Fn::GetAtt、Fn::Sub、Fn::Join、Fn::ImportValue、Fn::If、Fn::FindInMap、Fn::GetAZs、Fn::Transform)?
  3. 如何控制重要資源的生命週期行為(DependsOn、DeletionPolicy、UpdateReplacePolicy、CreationPolicy、UpdatePolicy)?
  4. 如何安全預覽並推出變更(變更集、偏移偵測、回滾、巢狀堆疊、跨堆疊匯出、StackSets)?
  5. AWS SAM 如何加速 Lambda + API Gateway + DynamoDB 的部署,以及何時 AWS CDK 是更好的選擇?

本主題以 DVA-C02 要求的深度回答以上五個問題。每個章節都緊扣 Task 3.1 的動作動詞:準備應用程式產出物、定義基礎設施即程式碼、將應用程式產出物部署至 AWS。

AWS CloudFormation 是一項基礎設施即程式碼服務,讓你使用以 YAML 或 JSON 撰寫的宣告式模板來建模、佈建和管理 AWS 及第三方資源。CloudFormation 模板描述一組資源的預期狀態;CloudFormation 負責判斷正確的 API 呼叫順序、在失敗時處理回滾,並將產生的堆疊作為單一生命週期單位進行追蹤。AWS SAM 透過 AWS::Serverless-2016-10-31 轉換,以無伺服器專屬的簡寫語法擴充 CloudFormation。See: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html

白話文解釋 CloudFormation and SAM

要真正掌握 Infrastructure as Code 的 CloudFormation 世界,先用幾個白話類比把核心觀念裝進腦袋。

類比一:蓋房子的藍圖(工地類比) CloudFormation template 就像一張建築藍圖。藍圖上畫的是「三間臥室、兩間浴室、北向採光」——這是宣告式(declarative)描述:你只說「要什麼」,不說「怎麼蓋」。把藍圖交給營造廠(CloudFormation engine),它會算出鋼筋先綁、水電後接的施工順序,幫你把整棟房子蓋起來。CloudFormation 的 stack 就是這棟蓋好的房子;同一張藍圖蓋兩次,兩棟房子完全一樣。這就是 CloudFormation 最核心的保證:每次 deploy 同一份 template,結果都 reproducible。

類比二:開書考試的參考答案區(開書考試類比) CloudFormation intrinsic functions 就像開書考試允許你翻書抄的那一區。你不用把每個 VPC ID、每個 Security Group ID、每個 Region 名稱死記在 template 裡——你用 RefFn::GetAtt!Sub ${AWS::Region} 這些函式去「翻書查值」,CloudFormation 在 deploy 當下幫你填空。Pseudo parameters 如 AWS::RegionAWS::AccountIdAWS::StackName 更是 AWS 幫你預先填好的官方答案,直接引用就好,寫死反而扣分。

類比三:瑞士刀 vs 專用刀(瑞士刀類比) AWS CDK 像瑞士刀——一把工具裡藏著好幾層(L1/L2/L3 constructs),低層(L1)是原始 CloudFormation resource 的一對一映射,中層(L2)幫你補好合理預設(例如 S3 Bucket 預設開啟 SSE-S3),高層(L3)是整套 pattern(例如 API Gateway + Lambda + DynamoDB 一次生成)。AWS SAM 反而像專用削皮刀——只做一件事:把 Lambda、API Gateway、DynamoDB、Step Functions 的樣板寫得極短。SAM 用 AWS::Serverless::Function 一行取代 CloudFormation 裡十幾行 Lambda + IAM Role + Log Group。選工具就看場景:純 serverless 選 SAM,混合型或需要多語言程式邏輯選 CDK,跨服務大型 infra 選純 CloudFormation。

類比四:保險的解約條款(保險類比) DeletionPolicy 和 UpdateReplacePolicy 就像保險的解約條款。預設是 Delete——stack 刪了,所有 resource 一起消失,包括你的 RDS 資料庫。把 DeletionPolicy 改成 Retain 就等於跟 CloudFormation 簽了「刪 stack 時這個 resource 保留下來」的保單;改成 Snapshot 則是「先拍快照再刪」。考 DVA-C02 時只要看到題目提「production database」「must not lose data」「stack deletion」這些關鍵字,答案幾乎就是 DeletionPolicy: Retain 或 Snapshot。UpdateReplacePolicy 則是另一條保單:當 update 觸發 replacement(例如改了 DB 名稱)時要怎麼處理舊的那顆。

把這四個類比串起來:template 是藍圖、intrinsic functions 是開書抄寫、CDK/SAM 是不同抽象層級的工具、resource attributes 是保單條款。DVA-C02 Task 3.1 的每一題都能拆回這四個軸線其中之一。

CloudFormation 模板結構——全部九個章節

CloudFormation 模板是一份 YAML(或 JSON)文件,最多包含九個頂層章節。只有 Resources 是必填項目。全面理解每個章節是 DVA-C02 Task 3.1 的基礎。

AWSTemplateFormatVersion

AWSTemplateFormatVersion 宣告 CloudFormation 模板的 schema 版本。目前唯一有效的值是 2010-09-09。CloudFormation 向下相容,省略此欄位在語法上合法,但每份正式環境的 CloudFormation 模板都應包含它,以確保清晰度與未來版本鎖定。

AWSTemplateFormatVersion: "2010-09-09"

Description

Description 是最長 1024 個字元的自由格式字串。它會顯示在 AWS Management Console 的堆疊清單中,以及 aws cloudformation describe-stacks 的輸出裡。模板裡寫好 Description,能讓趕時間的工程師一眼看懂用途。

Metadata

Metadata 存放與資源佈建無關的結構化資訊。最常見的用途是 AWS::CloudFormation::Interface,用於在 AWS Management Console 中對 Parameters 進行分組和排序。SAM 也使用 Metadata 為 AWS::Serverless::Function 資源附加額外屬性。

Parameters

Parameters 讓 CloudFormation 模板可以重複使用。你宣告輸入項目(執行個體類型、VPC ID、環境名稱),並在部署時透過 AWS CLI 的 --parameters 旗標、CloudFormation 主控台提示,或 CI/CD 管道提供它們。每個參數都有 Type(String、Number、List、CommaDelimitedList,或 AWS 特定類型如 AWS::EC2::VPC::Id)、可選的 DefaultAllowedValuesAllowedPatternMinLength/MaxLengthMinValue/MaxValueNoEcho(用於遮罩密語),以及 Description

Parameters:
  EnvName:
    Type: String
    AllowedValues: [dev, staging, prod]
    Default: dev
    Description: "Deployment environment"
  DBPassword:
    Type: String
    NoEcho: true
    MinLength: 12

Mappings

Mappings 是 CloudFormation 模板內的靜態查找表。典型用途是依 Region 選擇 AMI ID:

Mappings:
  RegionAMI:
    us-east-1: { AMI: ami-0abcdef1234567890 }
    us-west-2: { AMI: ami-0fedcba0987654321 }

透過 !FindInMap [ RegionAMI, !Ref AWS::Region, AMI ] 存取。Mappings 讓 CloudFormation 模板無需將每個值參數化,就能跨 Region 移植。

Conditions

Conditions 定義在部署時求值的具名布林運算式。你通常將 Parameter 值與常數比較,然後以 Condition: 屬性將條件附加到資源或輸出。

Conditions:
  IsProd: !Equals [ !Ref EnvName, prod ]
Resources:
  ProdOnlyBucket:
    Type: AWS::S3::Bucket
    Condition: IsProd

受 false 條件保護的資源會被完全跳過——CloudFormation 不會建立它們,對其使用 Ref/GetAtt 會回傳 AWS::NoValue

Transform

Transform 宣告一或多個巨集,在建立資源之前展開 CloudFormation 模板。最常見的 Transform 是 AWS::Serverless-2016-10-31——即 AWS SAM 轉換——它將 SAM 簡寫展開為原始 CloudFormation。AWS::Include 是另一個內建轉換,用於從 S3 注入程式碼片段。自訂巨集是被註冊為 CloudFormation 巨集的 Lambda 函式。

Transform: AWS::Serverless-2016-10-31

Resources(必填)

Resources 是 CloudFormation 模板中唯一必填的頂層章節。每個項目都有 Type(例如 AWS::S3::BucketAWS::Lambda::FunctionAWS::DynamoDB::Table)和符合該類型 schema 的 Properties 區塊。資源的邏輯 ID(Resources 下的鍵名)必須是英數字元、在模板內唯一,並在其他資源使用 RefGetAtt 時被引用。

Outputs

Outputs 將堆疊中的值暴露給使用者、自動化系統或其他堆疊。每個輸出都有 Value(通常是 RefFn::GetAtt),以及可選的 Export 名稱——這是透過 Fn::ImportValue 啟用跨堆疊引用的鍵。Outputs 會顯示在 AWS Management Console 中,並由 describe-stacks 回傳。

Outputs:
  ApiUrl:
    Value: !Sub "https://${RestApi}.execute-api.${AWS::Region}.amazonaws.com/prod"
    Export:
      Name: !Sub "${AWS::StackName}-ApiUrl"

Rules

Rules 在堆疊建立或更新時驗證參數組合。例如,一條 Rule 可以要求只有當 EnvName 為 prod 時才允許使用特定 InstanceType。Rules 在 DVA-C02 中較少出現,但值得認識。

最小有效的 CloudFormation 模板只包含一個章節:Resources。其他所有章節(AWSTemplateFormatVersion、Description、Metadata、Parameters、Mappings、Conditions、Transform、Outputs、Rules)皆為選填。DVA-C02 題目若展示一個沒有 AWSTemplateFormatVersion 的最小模板,該模板仍然有效——不要把「缺少 schema 版本」選為失敗原因。唯一的強制錯誤是缺少 Resources 章節。See: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html

內建函式——CloudFormation 的連接工具箱

內建函式(intrinsic functions)是 CloudFormation 模板在撰寫時未知的值的引用方式。每位 DVA-C02 考生都必須熟練掌握九個標準內建函式。

Ref

Ref 回傳資源或參數的預設識別碼。對於 AWS::S3::BucketRef 回傳儲存貯體名稱。對於 AWS::Lambda::FunctionRef 回傳函式名稱。對於 AWS::EC2::InstanceRef 回傳執行個體 ID。對於 ParameterRef 回傳該參數的值。簡寫形式為 !Ref ResourceLogicalId

Fn::GetAtt

Fn::GetAtt 取得資源的特定屬性——通常是 ARN、端點或 Ref 不會回傳的計算值。Fn::GetAtt 接受兩個引數:資源邏輯 ID 和屬性名稱。每種資源類型的 GetAtt 屬性都記載在 CloudFormation User Guide 中。

MyFunctionArn: !GetAtt MyFunction.Arn
DbEndpoint:   !GetAtt Database.Endpoint.Address

Fn::Sub

Fn::Sub 將變數代入字串,類似 JavaScript 的模板字面量。它是最靈活的字串建構內建函式。Fn::Sub 會自動解析 ${AWS::Region}${AWS::AccountId} 及其他偽參數,以及任何本地 ParameterResource 邏輯 ID。

ApiUrl: !Sub "https://${RestApi}.execute-api.${AWS::Region}.amazonaws.com/prod"
LambdaName: !Sub "${AWS::StackName}-handler"

Fn::Join

Fn::Join 以分隔符號串接字串清單:!Join [ "-", [ !Ref EnvName, "bucket", !Ref AWS::AccountId ] ]Fn::Sub 幾乎總是比 Fn::Join 更簡潔,但 Fn::Join 在較舊的 CloudFormation 模板中仍很常見,也會出現在 DVA-C02 考題中。

Fn::ImportValue

Fn::ImportValue 從同一 Region 和帳號中的另一個堆疊讀取匯出的輸出值。它是跨堆疊引用的基本原語:一個堆疊 Export,另一個堆疊 ImportValue。只要有匯入堆疊仍在引用匯出值,匯出堆疊就無法被刪除——CloudFormation 強制執行此依賴關係。

VpcId: !ImportValue NetworkStack-VpcId

Fn::If

Fn::If 是以具名條件為鍵的三元運算子。它接受三個引數:條件名稱、為 true 時回傳的值,以及為 false 時回傳的值。AWS::NoValue 是一個特殊值,告知 CloudFormation 完全省略該屬性。

BucketName: !If [ IsProd, "prod-data", !Ref AWS::NoValue ]

Fn::GetAZs

Fn::GetAZs 回傳指定 Region 中可用的可用區域清單。傳入空字串以取得目前 Region 的可用區域:!GetAZs ""。搭配 Fn::Select 可選取特定的可用區域索引。

Fn::FindInMap

Fn::FindInMap 以三鍵路徑(頂層鍵、第二層鍵、屬性名稱)在 Mappings 章節中查找值。最典型的用途是依 Region 查找 AMI。

ImageId: !FindInMap [ RegionAMI, !Ref AWS::Region, AMI ]

Fn::Transform

Fn::Transform 在 CloudFormation 模板的特定位置呼叫巨集。與頂層 Transform 章節(執行一次)不同,Fn::Transform 可在 Resources 區塊中間注入已處理的輸出。它是讓自訂巨集和 AWS::Include 能在模板中間使用的逃生口。

在 CloudFormation 模板中建構插值字串時,優先選用 Fn::Sub!Sub)而非 Fn::Join!Join)。!Sub "${MyResource.Arn}" 讀起來就像 shell 變數;!Join [ "", [ !GetAtt MyResource.Arn ] ] 則冗長且容易出錯。Fn::Sub 也能原生解析偽參數,如 ${AWS::Region}${AWS::StackName},無需額外操作。保留 Fn::Join 的場合是當分隔符號本身具有意義時(以冒號建構 ARN、CSV 字串)。See: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html

偽參數——AWS 為你預先填好的值

偽參數(pseudo parameters)是 CloudFormation 在部署時預先填入並解析的值。你無需宣告它們,只需像引用其他參數一樣引用即可。DVA-C02 考試中會大量測試以下偽參數:

  • AWS::Region — 堆疊部署所在的 Region(例如 us-east-1)。
  • AWS::AccountId — 託管堆疊的 12 位 AWS 帳號 ID。
  • AWS::StackName — 正在部署的堆疊名稱,適合用於為資源加上名稱前綴。
  • AWS::StackId — 堆疊的完整 ARN。
  • AWS::Partition — AWS 分割區(awsaws-cnaws-us-gov),對於多分割區部署中的 ARN 建構至關重要。
  • AWS::URLSuffix — 分割區的 DNS 後綴(amazonaws.comamazonaws.com.cn)。
  • AWS::NoValue — 一個告知 CloudFormation 省略屬性的哨兵值,最常從 Fn::If 分支回傳。
  • AWS::NotificationARNs — 與堆疊關聯的 SNS 主題 ARN 清單。

在 CloudFormation 模板中硬式編碼 Region 字串(如 us-east-1)是 DVA-C02 的典型反模式。正確的做法始終是 !Ref AWS::Region 或在 Fn::Sub 中使用 ${AWS::Region}

資源屬性——DependsOn、DeletionPolicy、UpdateReplacePolicy、CreationPolicy、UpdatePolicy

資源屬性與任何 CloudFormation 資源的 TypeProperties 並列,用於控制生命週期行為。它們是 DVA-C02 最常被忽略的考試重點。

DependsOn

DependsOn 新增明確的排序依賴關係。CloudFormation 已從 RefFn::GetAtt 推斷出大多數依賴關係,但某些關係(IAM 政策傳播、VPC 閘道連接、跨服務的最終一致性)需要手動提示。DependsOn 接受單一邏輯 ID 或清單。

MyFunction:
  Type: AWS::Lambda::Function
  DependsOn: [ LoggingPolicy, NetworkInterfaces ]

DeletionPolicy

DeletionPolicy 控制當包含它的堆疊被刪除,或資源本身從模板中移除時,該資源的處置方式。三個可選值:

  • Delete(預設)——堆疊刪除時移除資源。
  • Retain——保留資源;CloudFormation 放棄對其的所有權。
  • Snapshot——刪除前先建立最終快照(支援 RDS DB 執行個體、RDS DB 叢集、EBS 磁碟區、ElastiCache 叢集、Redshift 叢集和 Neptune 叢集)。

對於正式環境的 CloudFormation 模板,含有重要資料的 S3 儲存貯體設定 DeletionPolicy: Retain,資料庫設定 DeletionPolicy: Snapshot,是首選的防禦性預設值。

UpdateReplacePolicy

UpdateReplacePolicy 控制當堆疊更新觸發替換時——即屬性變更迫使 CloudFormation 刪除目前資源並建立新資源時——舊資源的處置方式。同樣的三個值:DeleteRetainSnapshot。DeletionPolicy 管理堆疊刪除;UpdateReplacePolicy 管理更新期間的替換。兩者通常在有狀態資源上同時設定。

Database:
  Type: AWS::RDS::DBInstance
  DeletionPolicy: Snapshot
  UpdateReplacePolicy: Snapshot
  Properties: { ... }

CreationPolicy

CreationPolicy 強制 CloudFormation 等待明確的成功訊號,才將資源標記為 CREATE_COMPLETE。典型用途是等待 EC2 bootstrap 腳本(cfn-init 加上 cfn-signal)或 Auto Scaling 群組的執行個體完成啟動。CreationPolicy 接受 ResourceSignal.CountResourceSignal.Timeout(ISO 8601 期間格式)。

WebServer:
  Type: AWS::EC2::Instance
  CreationPolicy:
    ResourceSignal:
      Count: 1
      Timeout: PT15M

UpdatePolicy

UpdatePolicy 控制 CloudFormation 如何更新特定資源(Auto Scaling 群組、Lambda 別名、ElastiCache 複寫群組)。對於 AWS::AutoScaling::AutoScalingGroup,兩個子政策在 DVA-C02 中最為重要:

  • AutoScalingRollingUpdate——以批次方式輪換執行個體,同時保持最低的服務中執行個體數量;參數包括 MinInstancesInServiceMaxBatchSizePauseTimeWaitOnResourceSignals
  • AutoScalingReplacingUpdate——建立一個全新的 Auto Scaling 群組,切換後再刪除舊群組。回滾更安全,但在更新期間資源數量會加倍。
AppASG:
  Type: AWS::AutoScaling::AutoScalingGroup
  UpdatePolicy:
    AutoScalingRollingUpdate:
      MinInstancesInService: 2
      MaxBatchSize: 1
      PauseTime: PT5M
      WaitOnResourceSignals: true

DVA-C02 常考的區分點:DeletionPolicy 在堆疊本身被刪除(或資源從模板中移除)時觸發;UpdateReplacePolicy 在堆疊更新觸發資源替換時觸發。在 RDS 執行個體上只設定 DeletionPolicy: Retain,若你變更了一個會觸發替換的屬性,更新仍會悄悄替換並刪除原始執行個體。對於真正不可替換的正式環境狀態,應同時設定:DeletionPolicy: Snapshot 以及 UpdateReplacePolicy: Snapshot。See: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-updatereplacepolicy.html

變更集——執行前先預覽

CloudFormation 變更集(change set)是預覽 CloudFormation 在下次更新堆疊時將執行哪些動作的工具。你以 aws cloudformation create-change-set --stack-name ... --template-body file://template.yaml --change-set-name preview1 產生變更集。CloudFormation 計算目前堆疊狀態與新模板之間的差異,產生一份包含 AddModifyRemove 動作的清單。對於每個 Modify,它將替換行為分類為 True(資源將被替換)、False(就地更新)或 Conditional(取決於其他屬性)。然後你審查變更集,再決定執行 aws cloudformation execute-change-set 或將其刪除。

變更集是 DVA-C02 針對正式環境 CloudFormation 更新所推薦的安全機制。它能在你點擊執行前揭露隱藏的替換操作(例如典型的 RDS DBInstanceIdentifier 變更)。SAM 部署預設在背後使用變更集——sam deploy 會執行 create-change-set 再執行 execute-change-set

偏移偵測——偵測帶外變更

偏移偵測(drift detection)比較堆疊的預期狀態(CloudFormation 根據上次部署所記錄的狀態)與 AWS 中的實際目前狀態。你可透過 aws cloudformation detect-stack-drift 或 AWS Management Console 觸發偏移偵測。每個資源會被分類為 IN_SYNCMODIFIEDDELETEDNOT_CHECKED

當操作人員繞過 CloudFormation 時就會發生偏移——例如在 AWS Management Console 中編輯 Security Group、用 AWS CLI 刪除 S3 儲存貯體,或在模板之外調整 IAM 政策。DVA-C02 考試要求你了解:

  • 偏移偵測是唯讀的,它不會修復偏移。
  • 並非所有資源類型都支援偏移偵測,不支援的類型會回報 NOT_CHECKED
  • 修復偏移通常意味著更新模板以符合實際狀態,或重新部署堆疊以覆蓋帶外變更。

巢狀堆疊 vs 跨堆疊引用

CloudFormation 提供兩種模組化模式:巢狀堆疊(nested stacks)和跨堆疊引用(cross-stack references)。兩者都會出現在 DVA-C02 考試中。

巢狀堆疊

巢狀堆疊是使用 AWS::CloudFormation::Stack 在另一個堆疊內部建立為資源的 CloudFormation 堆疊。父堆疊的 Properties.TemplateURL 指向一個 S3 URL,其中存有子模板。巢狀堆疊由父堆疊擁有——刪除父堆疊會串聯刪除所有巢狀子堆疊。它們非常適合封裝可重複使用的元件(標準 VPC 模組、標準日誌模組),供多個父堆疊實例化。

NetworkStack:
  Type: AWS::CloudFormation::Stack
  Properties:
    TemplateURL: https://s3.amazonaws.com/my-bucket/network.yaml
    Parameters:
      VpcCidr: 10.0.0.0/16

透過 Export + Fn::ImportValue 實現跨堆疊引用

跨堆疊引用解耦了各個堆疊。堆疊 A Export 一個輸出;堆疊 B 以 Fn::ImportValue 引用它。兩個堆疊擁有獨立的生命週期——但一旦被匯入,在匯入堆疊仍在使用的情況下,匯出堆疊就不能被刪除,也不能以移除該匯出的方式進行修改。每個 Region 每個帳號的匯出名稱必須唯一。

# 堆疊 A(網路)
Outputs:
  VpcId:
    Value: !Ref Vpc
    Export: { Name: NetworkStack-VpcId }

# 堆疊 B(應用程式)
Resources:
  AppSG:
    Properties:
      VpcId: !ImportValue NetworkStack-VpcId

巢狀堆疊 vs 跨堆疊引用——決策矩陣

維度 巢狀堆疊 跨堆疊引用
耦合度 緊密(父堆疊擁有子堆疊) 鬆散(獨立堆疊)
生命週期 隨父堆疊一起刪除 獨立;匯入方存在時刪除受阻
資料傳遞 透過 Parameters 傳遞給巢狀堆疊 透過 Export/ImportValue
最適用於 每個父堆疊實例化的可重用模組 供多個應用程式使用的共享基礎設施
DVA-C02 訊號 「可重複使用的模板片段」 「共享 VPC ID 的獨立堆疊」

AWS SAM——CloudFormation 的無伺服器簡寫

AWS SAM(Serverless Application Model)是一個 CloudFormation Transform 加上 CLI 工具。模板頂部的 Transform: AWS::Serverless-2016-10-31 宣告告知 CloudFormation,在部署前先將 SAM 資源類型展開為完整的 CloudFormation。

SAM 資源類型

DVA-C02 要求你了解的 SAM 專屬資源類型:

  • AWS::Serverless::Function — 展開為 AWS::Lambda::FunctionAWS::IAM::RoleAWS::Lambda::Permission、CloudWatch Logs 群組,以及事件來源映射。Events 屬性可自動產生 API Gateway 路由、EventBridge 規則、SQS 觸發器和 S3 通知。
  • AWS::Serverless::Api — 展開為 AWS::ApiGateway::RestApiAWS::ApiGateway::StageAWS::ApiGateway::Deployment。SAM 也可透過 AWS::Serverless::HttpApi 產生 HTTP API。
  • AWS::Serverless::StateMachine — 展開為 AWS::StepFunctions::StateMachine 及其 IAM 角色。
  • AWS::Serverless::SimpleTable — 展開為具有簡單主鍵 schema 的 AWS::DynamoDB::Table
  • AWS::Serverless::LayerVersion — 展開為 AWS::Lambda::LayerVersion
  • AWS::Serverless::Application — 從 Serverless Application Repository 或 S3 拉取的巢狀 SAM 應用程式。

SAM Globals

Globals 是 SAM 專屬章節,你可在其中設定套用於模板中每個函式或 API 的預設值。常見的全域設定包括 Function.RuntimeFunction.TimeoutFunction.Environment.VariablesFunction.TracingApi.Cors。Globals 可大幅縮短含有多個相似 Lambda 函式的模板。

Globals:
  Function:
    Runtime: python3.12
    Timeout: 30
    Tracing: Active
    Environment:
      Variables:
        TABLE_NAME: !Ref DataTable

SAM CLI——sam build、sam deploy、sam local invoke、sam local start-api

SAM CLI 是 SAM 模板的本地伴侶工具。DVA-C02 要求你能辨識的指令:

  • sam init — 從模板(zip 或容器、執行環境、hello-world 入門)建立新的 SAM 專案架構。
  • sam build — 將原始碼和相依套件編譯為 .aws-sam/build/ 下可部署的產出物。使用對應執行環境的建構工具(pip、npm、mvn、go mod)。
  • sam deploy — 將產出物上傳至 S3、產生 CloudFormation 變更集,並可選擇執行它。--guided 以互動方式引導你設定參數。
  • sam local invoke — 在模擬 AWS Lambda 執行環境的 Docker 容器中,本地執行特定的 Lambda 函式。透過 --event event.json 傳入事件 JSON 酬載。非常適合單元測試風格的單一函式除錯。
  • sam local start-api — 啟動一個模擬 Amazon API Gateway 的本地 HTTP 伺服器,將請求路由至本地 Docker 容器中的 Lambda 函式。無需部署即可測試完整的 API 介面。
  • sam local start-lambda — 啟動一個模擬 AWS Lambda Invoke API 的本地 Lambda 端點,讓指向 http://127.0.0.1:3001 的 SDK 用戶端能呼叫本地函式。
  • sam logs — 為已部署函式串流 CloudWatch Logs;--tail 可即時串流。
  • sam sync — 僅針對程式碼變更執行的快速內部循環部署,跳過完整的 CloudFormation 變更集。
  • sam validate — 對 SAM 模板進行語法檢查。
  • sam delete — 刪除由 sam deploy 建立的 CloudFormation 堆疊。

SAM Pipelines

sam pipeline init 可建立 CI/CD 管道架構(CodePipeline、GitHub Actions、GitLab CI、Jenkins 或 Bitbucket Pipelines),將 SAM 應用程式跨多個階段和 AWS 帳號進行部署。它會為每個階段產生具有最小權限的 IAM 角色,以及管道設定檔。對於 DVA-C02 詢問「如何自動化無伺服器部署?」的情境,SAM Pipelines 是從「我有一個 SAM 模板」到「我有多環境 CI/CD」的最快路徑。

DVA-C02 最常考的兩個 SAM 本地指令:

  1. sam local invoke — 以事件 JSON 在 Docker 中本地執行單一 Lambda。用於以特定輸入測試單一函式時選用。
  2. sam local start-api — 啟動本地 API Gateway + Lambda Docker 環境。用於端對端測試完整 HTTP 介面時選用。

題目若說「以特定事件酬載測試單一 Lambda」,答案是 sam local invoke。題目若說「以 curl 或 Postman 在本地測試 REST API」,答案是 sam local start-api。See: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-local-invoke.html

AWS CDK——以真實程式語言定義基礎設施

AWS CDK(Cloud Development Kit)v2 讓你以 TypeScript、JavaScript、Python、Java、C# 和 Go 定義 CloudFormation 堆疊。CDK 程式碼透過 synth(合成)轉換為 CloudFormation 模板,並以 CloudFormation 作為部署引擎。CDK 相較於原始 CloudFormation 的價值主張:迴圈、條件式、類別、單元測試,以及豐富的預建構件程式庫(含合理預設值)。

Construct 層級——L1、L2、L3

CDK 將構建積木組織為三個層級:

  • L1 constructs(Cfn 類別)* — CloudFormation 資源類型的一對一映射。CfnBucket 映射到具有完全相同屬性的 AWS::S3::Bucket。當你需要逃生口回到原始 CloudFormation 時選用。
  • L2 constructs — 帶有合理預設值和輔助方法的精心設計包裝器。s3.Bucket 新增了 grantReadgrantWrite、自動加密和版本控制旗標——在背後產生正確的 CloudFormation。L2 是大多數 CDK 程式碼的慣用層。
  • L3 constructs(patterns) — 多資源組合。aws_ecs_patterns.ApplicationLoadBalancedFargateService 一次呼叫即可佈建 ECS Fargate 服務、Application Load Balancer、自動擴展和 CloudWatch 警報。L3 constructs 大幅縮減常見架構的模板大小。

CDK CLI 指令

  • cdk init — 建立新的 CDK 專案。
  • cdk synth — 從 CDK 程式碼合成 CloudFormation 模板。輸出位於 cdk.out/ 下。
  • cdk diff — 比較合成的模板與目前部署的堆疊;回報 [+][-][~] 變更。
  • cdk deploy — 合成加上 CloudFormation 部署,建立或更新堆疊。
  • cdk destroy — 拆除堆疊。
  • cdk bootstrap — 在目標帳號和 Region 建立 CDK 首次部署所需的暫存資源(S3 儲存貯體、IAM 角色)。

CDK Context 與 Aspects

  • Context — CDK 透過 cdk.json 或 CLI 上的 -c key=value 傳遞執行期設定的機制。Context 值在首次查找後會被快取以確保可重現性。常見用途:特定環境的功能旗標。
  • Aspects — 跨切面的訪客模式,走訪 construct 樹並統一套用變更。典型用途:強制執行標籤政策、要求每個 S3 儲存貯體加密、為每個有狀態資源新增移除政策。Aspects 是 CDK 對「將此規則套用至應用程式中所有資源」的解答。

SAM vs CDK vs 原始 CloudFormation

維度 原始 CloudFormation AWS SAM AWS CDK
語言 YAML / JSON 帶 Transform 的 YAML / JSON TypeScript、Python、Java、C#、Go
最適用於 任何 AWS 資源、以 YAML 審查文化為主的大型組織 Lambda + API Gateway + DynamoDB 無伺服器堆疊 需要程式化組合的多服務應用程式
迴圈與條件式 僅 Mappings + Conditions 繼承 CloudFormation + Globals 原生語言支援
本地測試 無原生支援 sam local invoke + sam local start-api 單元測試 + cdk synth
輸出 直接 CloudFormation 展開後的 CloudFormation 合成後的 CloudFormation
DVA-C02 重點 模板結構 + 內建函式 Transform + SAM CLI + 無伺服器資源 Construct 層級 + cdk 指令

參數覆寫、變更集與部署時控制

aws cloudformation deploy --parameter-overridessam deploy --parameter-overrides 讓你無需編輯 CloudFormation 模板就能傳入 Parameter 值。搭配 --capabilities CAPABILITY_IAMCAPABILITY_NAMED_IAM(當模板建立或命名 IAM 資源時必填),以及 --no-execute-changeset(產生但不執行),參數覆寫是在 CI/CD 管道中,讓單一可重用模板對應多個環境的黏著劑。

StackSets——跨帳號、跨 Region 部署

AWS CloudFormation StackSets 讓單一管理員帳號在一次操作中,將相同的 CloudFormation 模板部署至多個目標帳號和 Region。DVA-C02 重點考察兩種權限模型:

  • 自我管理權限(Self-managed permissions) — 你手動在管理員帳號中建立信任 IAM 角色(AWSCloudFormationStackSetAdministrationRole),並在每個目標帳號中建立 AWSCloudFormationStackSetExecutionRole。提供最大控制權;當目標帳號不在 AWS Organizations 中時為必要條件。
  • 服務管理權限(Service-managed permissions) — StackSets 在 AWS Organizations 中自動管理 IAM 信任關係。可對加入 OU 的新帳號啟用自動部署。對於已使用 AWS Organizations 的組織而言最為簡便。

StackSet 操作參數,如 MaxConcurrentCountFailureToleranceCountRegionConcurrencyType,可控制推出期間的影響範圍。當 DVA-C02 情境說「將同一模板部署至多個帳號」或「在整個組織中推出基準堆疊」時,選用 StackSets。

cfn-init 與 cfn-signal——從模板 Bootstrap EC2

對於以 EC2 為基礎的工作負載,CloudFormation 在 Amazon Linux AMI 上預先安裝了輔助腳本:

  • cfn-init — 讀取 EC2 執行個體資源上的 AWS::CloudFormation::Init 中繼資料並套用:安裝套件、建立檔案、啟動服務、執行指令。這是 CloudFormation 在執行個體啟動時進行設定管理的解決方案。
  • cfn-signal — 從執行個體內部向 CloudFormation 發送「我已就緒」(或「我失敗了」)的訊號。搭配 CreationPolicy.ResourceSignal,使 CloudFormation 在執行個體完成 bootstrap 之前等待,再將資源標記為 CREATE_COMPLETE
  • cfn-get-metadata — 在執行期取得中繼資料。
  • cfn-hup — 一個常駐程式,當堆疊中繼資料變更時重新執行 cfn-init,實現就地重新設定。

CloudFormation 模板中的標準 EC2 bootstrap 範例:

WebServer:
  Type: AWS::EC2::Instance
  CreationPolicy:
    ResourceSignal: { Count: 1, Timeout: PT10M }
  Metadata:
    AWS::CloudFormation::Init:
      config:
        packages: { yum: { httpd: [] } }
        services: { sysvinit: { httpd: { enabled: true, ensureRunning: true } } }
  Properties:
    UserData:
      Fn::Base64: !Sub |
        #!/bin/bash -xe
        yum update -y aws-cfn-bootstrap
        /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServer --region ${AWS::Region}
        /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource WebServer --region ${AWS::Region}

自訂資源——以 Lambda 擴充 CloudFormation

自訂資源(custom resources)讓你在 CloudFormation 堆疊操作期間執行任意邏輯。你宣告 AWS::CloudFormation::CustomResource 或較短的 Custom::<Name>,並以 ServiceToken 指向一個 Lambda 函式(或 SNS 主題)。CloudFormation 以 CreateUpdateDeleteRequestType 呼叫 Lambda,並等待函式將已簽署的回應傳送至預先簽署的 S3 URL。

DVA-C02 考試測試的使用案例:

  • 在部署時產生隨機值(隨機 S3 儲存貯體後綴)。
  • 呼叫第三方 API(在堆疊部署期間建立 Auth0 租戶)。
  • 設定目前尚無原生 CloudFormation 資源類型的 AWS 服務。
  • 部署後初始化(為 DynamoDB 資料表播種預設資料列)。

自訂資源必須在逾時前回應 CloudFormation,否則堆疊會卡在 CREATE_IN_PROGRESS,直到最終失敗。最佳實踐:Lambda 處理常式必須將所有邏輯包在 try/except 中,並始終發送回應——無論成功(SUCCESS)或失敗(FAILED)——即使邏輯失敗也不例外。

DVA-C02 常考的失敗模式:自訂資源 Lambda 拋出未處理的例外,從未向預先簽署的 S3 URL 發送回應。CloudFormation 無法得知 Lambda 失敗——它會等待最多 1 小時才放棄,使堆疊卡在 CREATE_IN_PROGRESSDELETE_IN_PROGRESS。修復方式:始終將自訂資源處理常式包在 try/except/finally 中,並始終以 { "Status": "SUCCESS" | "FAILED", ...} POST 至 event.ResponseURL。許多 SDK 輔助工具(Python 的 cfnresponse、CDK 的 aws-cdk-lib/custom-resources)已正確實作此模式。See: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html

CloudFormation 回滾與堆疊失敗行為

當 CloudFormation 堆疊操作失敗時,CloudFormation 預設會自動回滾。DVA-C02 考試測試的關鍵行為:

  • CREATE_FAILED → ROLLBACK_IN_PROGRESS → ROLLBACK_COMPLETE — 建立失敗時回滾;堆疊最終狀態為 ROLLBACK_COMPLETE。處於 ROLLBACK_COMPLETE 狀態的堆疊無法更新——你必須刪除後重新建立。
  • UPDATE_FAILED → UPDATE_ROLLBACK_IN_PROGRESS → UPDATE_ROLLBACK_COMPLETE — 更新失敗時回滾至上一個已知良好狀態。
  • DisableRollback — 在 create-stackupdate-stack 上傳入 --disable-rollback 以跳過自動回滾。對除錯有用:資源會保持在它們到達的任何狀態。
  • ContinueUpdateRollback — 恢復因資源無法回滾而卡住的回滾(例如,在部分成功後手動刪除了 S3 儲存貯體)。

DVA-C02 常見考試陷阱

陷阱 1:Ref vs Fn::GetAtt

Ref 回傳預設識別碼(儲存貯體名稱、函式名稱、執行個體 ID)。Fn::GetAtt 回傳特定屬性(ARN、端點、Hosted Zone ID)。當題目詢問「這個 Lambda 的 ARN」時,答案是 !GetAtt MyFunction.Arn,而非 !Ref MyFunction

陷阱 2:Fn::ImportValue vs 巢狀堆疊 Parameters

Fn::ImportValue 透過 Export 跨越堆疊邊界。巢狀堆疊透過 AWS::CloudFormation::Stack 上的 Parameters 傳遞資料。若題目顯示兩個獨立堆疊共享 VPC ID,答案是 Export + Fn::ImportValue。若題目顯示一個父模板實例化可重用子模板,答案是巢狀堆疊 parameters。

陷阱 3:DeletionPolicy 無法防範更新時的替換

設定 DeletionPolicy: Retain 可防範堆疊刪除,但無法防範更新期間的就地替換。為此,需同時新增 UpdateReplacePolicy: Retain

陷阱 4:SAM Transform 必須在頂部

沒有 Transform: AWS::Serverless-2016-10-31 的 SAM 模板只是一個損壞的 CloudFormation 模板。CloudFormation 會將 AWS::Serverless::Function 視為未知的資源類型而拒絕。Transform 這一行對 SAM 而言是必填的。

陷阱 5:CDK 首次部署前需要 Bootstrap

在未先執行 cdk bootstrap 的新帳號/Region 中執行 cdk deploy,會因缺少 CDKToolkit 堆疊而失敗。Bootstrap 會建立 CDK 暫存資產所需的 S3 儲存貯體和 IAM 角色。

陷阱 6:sam local invoke 需要 Docker

sam local invokesam local start-api 在 Docker 容器中啟動 Lambda 執行環境模擬器。沒有安裝並執行 Docker,兩個指令都會失敗。Linux、macOS 和 Windows 都需要 Docker daemon。

陷阱 7:變更集不會自動執行

建立變更集只是預覽。在你呼叫 execute-change-set 之前,什麼都不會部署。忘記執行步驟是 DVA-C02 常見的干擾選項。

陷阱 8:StackSets 自我管理 vs 服務管理權限

服務管理權限需要 AWS Organizations。自我管理權限適用於任意帳號,但需要在每個目標帳號中手動設定 IAM 角色。當情境說「組織中的所有帳號」時選服務管理;當情境說「這些特定帳號」或明確排除 Organizations 時選自我管理。

陷阱 9:偏移偵測是唯讀的

偏移偵測回報差異,但不修復它們。修復偏移意味著重新部署堆疊以覆蓋帶外變更,或更新模板以反映實際狀態。

陷阱 10:自訂資源靜默掛起

靜默失敗的自訂資源 Lambda 會使堆疊卡在 IN_PROGRESS 長達一小時。始終在 finally 區塊中發送回應。

關鍵數字與必背事實

DVA-C02 問精確數字的頻率低於 CLF-C02,但有幾個 CloudFormation 和 SAM 的限制會出現在情境題中:

  • CloudFormation 模板大小:直接上傳 1 MB,S3 託管模板 1 MB(自推出以來未變更)。
  • 每個堆疊的資源數:500(軟限制;可調整)。
  • 每個模板的 Parameters 數:200。
  • 每個模板的 Outputs 數:200。
  • 每個模板的 Mappings 數:200。
  • StackSet 操作:預設 10 個並行帳號,可透過 MaxConcurrentCount 設定。
  • 自訂資源 Lambda 回應等待視窗:最多 1 小時後 CloudFormation 逾時。
  • CreationPolicy 逾時:ISO 8601 期間格式,EC2 bootstrap 通常為 PT15M,可依資源設定。
  • SAM Transform 版本AWS::Serverless-2016-10-31(是的,日期就是版本——不要更改它)。
  • CDK v2 支援語言:TypeScript、JavaScript、Python、Java、C#、Go。
  • CDK bootstrap 堆疊名稱CDKToolkit
  • CloudFormation 輔助腳本:cfn-init、cfn-signal、cfn-get-metadata、cfn-hup。

DVA-C02 的基礎設施即程式碼決策樹

當 DVA-C02 題目詢問「選用哪個工具?」時,按此決策樹走:

  1. 工作負載是純無伺服器(Lambda + API Gateway + DynamoDB + Step Functions)?→ AWS SAM
  2. 團隊習慣以 TypeScript、Python、Java、C# 或 Go 撰寫,並需要迴圈、單元測試和 patterns?→ AWS CDK
  3. 團隊以企業規模運作,採用以 YAML 為中心的審查流程,且需要完全控制權?→ 原始 AWS CloudFormation
  4. 需要將同一個堆疊部署至多個帳號或 Region?→ 在上述任一工具上使用 CloudFormation StackSets
  5. 需要注入 CloudFormation 無法原生表達的部署時邏輯?→ 由 Lambda 支援的自訂資源
  6. 需要快速在本地對 Lambda 函式進行迭代?→ sam local invokesam local start-api
  7. 需要預覽堆疊更新的影響範圍?→ 透過 create-change-set 建立變更集
  8. 懷疑有人在你的 CloudFormation 模板之外進行了變更?→ 偏移偵測

FAQ——IaC 搭配 SAM 與 CloudFormation

Q1:AWS CloudFormation、AWS SAM 和 AWS CDK 有什麼不同? A:AWS CloudFormation 是底層的宣告式基礎設施即程式碼引擎,使用 YAML 或 JSON。AWS SAM 是一個 CloudFormation Transform 加上 CLI,可縮短無伺服器模板——AWS::Serverless::Function 在部署期間展開為完整的 Lambda + IAM 角色 + Log 群組 + 事件來源。AWS CDK 讓你以 TypeScript、Python、Java、C# 或 Go 撰寫 CloudFormation 堆疊;它合成 CloudFormation 模板並部署它們。三者最終都呼叫 CloudFormation——差異在於撰寫時的使用體驗。

Q2:何時使用 Fn::ImportValue,何時使用巢狀堆疊 Parameters? A:當兩個堆疊有獨立的生命週期且共享一個長期存在的資源 ID(如 VPC ID 或共享 KMS 金鑰 ARN)時,使用 Fn::ImportValue。當一個父模板擁有並實例化可重用的子模板時,使用巢狀堆疊 Parameters——子模板僅作為父堆疊的一部分存在,並隨父堆疊一起消亡。ImportValue 會強制執行強耦合:只要任何堆疊仍在匯入,匯出堆疊就無法刪除該匯出。

Q3:DeletionPolicy: Retain 是什麼?它與 UpdateReplacePolicy: Retain 有何不同? A:DeletionPolicy: Retain 告知 CloudFormation 在堆疊本身被刪除(或資源從模板中移除)時,保留資源原地不動。UpdateReplacePolicy: Retain 告知 CloudFormation 在堆疊更新觸發替換時(例如重新命名 RDS 執行個體),保留舊資源原地不動。對於不可替換的正式環境狀態,兩者需同時設定。兩者支援的值:DeleteRetainSnapshot(最後一項僅適用於有狀態資源,如 RDS、EBS、ElastiCache、Redshift、Neptune)。

Q4:何時使用 sam local invoke,何時使用 sam local start-api? A:使用 sam local invoke 以特定事件 JSON 測試單一 Lambda 函式——非常適合以特定輸入進行單元測試風格的執行。使用 sam local start-api 啟動模擬 API Gateway 並將傳入請求路由至 Lambda 的本地 HTTP 伺服器——非常適合以 curl、Postman 或瀏覽器進行端對端 REST API 測試。兩者都需要 Docker。

Q5:CDK L1、L2 和 L3 constructs 是什麼,各層分別在何時選用? A:L1 constructs(Cfn* 類別)是原始 CloudFormation 資源類型的一對一映射——當 L2 construct 未暴露某個屬性時,作為逃生口使用。L2 constructs 是帶有合理預設值、輔助方法(grantReadgrantWrite)和安全預設值的精心設計包裝器——是大多數 CDK 程式碼的慣用層。L3 constructs(patterns)是多資源藍圖,如 ApplicationLoadBalancedFargateService——當 pattern 符合你的架構且想用最少程式碼時選用。

Q6:變更集與直接堆疊更新有何不同? A:變更集是預覽工具。aws cloudformation create-change-set 計算目前堆疊狀態與新模板之間的差異,列出每個 AddModifyRemove 動作,並分類替換行為。在你執行 execute-change-set 之前,你的帳號中不會有任何變更。直接 update-stack 會立即套用變更而不預覽。對於正式環境,變更集是 DVA-C02 推薦的安全防護機制——它能在執行前揭露隱藏的替換操作(如 RDS 識別碼重新命名)。sam deploy 預設在背後使用變更集。

Q7:偏移偵測是什麼?它能修復偏移嗎? A:偏移偵測比較 CloudFormation 堆疊的預期狀態(來自上次部署)與 AWS 中的實際狀態。它將每個資源分類為 IN_SYNCMODIFIEDDELETEDNOT_CHECKED。偏移偵測是唯讀的——它回報問題,但不修復偏移。修復需手動進行:更新模板以符合實際狀態,或重新部署堆疊以覆蓋帶外變更。並非所有資源類型都支援偏移偵測;不支援的類型回報 NOT_CHECKED

Q8:何時選用具有服務管理權限的 StackSets? A:當目標帳號是 AWS Organizations 的一部分,且你希望 StackSets 自動處理 IAM 信任(包括自動部署至加入指定 OU 的新帳號)時,選擇服務管理權限。當目標帳號不在 Organizations 中,或需要對管理和執行 IAM 角色進行精細手動控制時,選擇自我管理權限。提到「AWS Organizations」或「OU 中的所有帳號」的 DVA-C02 情境通常指向服務管理權限。

Q9:自訂資源 Lambda 為何會使堆疊卡在 CREATE_IN_PROGRESS? A:自訂資源要求 Lambda 必須將回應(SUCCESS 或 FAILED)POST 至事件中的預先簽署 S3 URL。若 Lambda 拋出未處理的例外並在未回應的情況下退出,CloudFormation 會等待最多 1 小時才放棄——使堆疊卡在 CREATE_IN_PROGRESSDELETE_IN_PROGRESS。修復方式:將所有自訂資源處理常式邏輯包在 try/except/finally 中,並始終發送回應,即使失敗也不例外。cfnresponse(Python)和 aws-cdk-lib/custom-resources 等程式庫已正確實作此模式。

Q10:cfn-init 和 cfn-signal 在 EC2 執行個體上做什麼? A:cfn-init 讀取 EC2 資源上的 AWS::CloudFormation::Init 中繼資料並套用——安裝套件、建立檔案、啟動服務、執行指令。cfn-signal 從執行個體內部向 CloudFormation 發送成功或失敗訊號。搭配 CreationPolicy.ResourceSignal,CloudFormation 會等待 cfn-signal,才將資源標記為 CREATE_COMPLETE。這個模式保證堆疊在 EC2 執行個體完成 bootstrap 之前不會繼續推進——是 CloudFormation 本身無法執行的部署時設定的 EC2 原生解決方案。

延伸閱讀——AWS 官方文件

掌握基礎設施即程式碼是提升 DVA-C02 Domain 3 分數最快的途徑。請將以下內容內化:九個 CloudFormation 模板章節、九個內建函式、三個隨時引用的偽參數(AWS::Region、AWS::AccountId、AWS::StackName)、五個資源屬性(DependsOn、DeletionPolicy、UpdateReplacePolicy、CreationPolicy、UpdatePolicy)、變更集與偏移偵測工作流程、SAM Transform 加上 sam local invoke / sam local start-api 配對,以及 CDK L1/L2/L3 construct 層級結構。DVA-C02 Task 3.1 的每一題都可以化簡為從這些清單中選出正確的 CloudFormation 原語、正確的 SAM 簡寫,或正確的 CDK construct。

官方資料來源

更多 DVA-C02 主題