AWS - CloudFormation


簡介

AWS 上的 IaC(Infrastructure as Code) 服務,讓使用者可以用 YAML/JSON Template 定義 AWS 資源,再由 CloudFormation 自動化建立,更新與刪除。

你只需要描述 需要什麼資源 不需要逐一手動設定 -> CloudFormation 會幫你處理資源之間的依賴與建立順序


核心概念

Template

  • 定義基礎設施的藍圖:格式為 JSON/YAML
  • 包含以下區塊
    • Parameters: 允許在建立 Stack 時傳入變數
    • Resources: 核心,定義要建議的 AWS 資源
    • Outputs: 輸出資訊
    • Mappings & Conditions: 做區域或環境的判斷

Stack

  • Template 實體化結果
  • Example: 用 Template 建立 EC2 + VPC + RDS -> 這個整體就是 Stack
  • Stack 可以
    • Create: 依照 Template 建立資源
    • Update: 修改 Template 自動更新相關資源
    • Delete: 刪除整個 Stack 連帶清除資源

Change Set

  • 在更新 Stack 前,可先產生 Change Set 來模擬看看會有哪些影響(避免誤刪誤建)

Nested Stacks

  • 將大 Template 拆解成小 Template,Reuse 且模組化設計
  • 例如一個 VPC Stack 可被不同專案的 App Stack 引用

Drift Detection

  • 偵測實際資源設定是否跟 Template 不同(如果有人手動改了某個資源)

範本

AWS 提供一些地方讓你可以參考以及運用這些已經創建好的 Template

AWS Quick Starts

  • 提供由 AWS 解決方案架構師和合作夥伴創建的參考部署
  • 包含預先建立的 CloudFormation 範本
  • 提供最佳實務架構部署方案
  • 經過驗證和測試的範本

AWS Solutions Library

  • 提供完整的 AWS 解決方案集合
  • 包含詳細的架構指南和 CloudFormation 範本
  • 提供多種產業和使用案例的解決方案
  • 由 AWS 維護和更新

常見使用情境

  1. 基礎設施自動化
  2. 跨環境一致性
  3. 快速災難復原
  4. 合規性和審計

Stack Lifecycle and Rollback

開發時更新失敗 -> 自動回滾

  • 有依賴錯誤,建立失敗 -> Rollback
    • CFN 會刪除已建立的資源
  • 可設定 Disable Rollback
    • 方便 debug

Change Sets

部署前先看差異

  • aws cloudformation create-change-set
    • 模擬更新結果
  • console 顯示資源會新增/修改/刪除
    • 避免誤刪 RDS 等資源

SAM/CDK/CFN

工具 | 與 CFN 關係
SAM Serverless CFN 擴充 -> build -> deploy 為 CFN Stack
CDK 程式碼生成 CFN Template -> 再由 CFN 部署
SAR Serverless App Repository -> 也是 CFN 部署

無論 SAM 或 CDK 最後都轉成為 CFN


Parameters/Outputs/Export/Import

區塊 | 用途 關鍵用途
Parameters CI/CD 傳入變數 Multi-env Deployment
Outputs Stack 回傳資訊 RDS Endpoint 提供給 App
Export/ImportValue Stack 之間資源共享 VPC Export -> App Stack Import

但 ImportValue 會建立跨 Stack 依賴 -> 更新會受限


Drift Detection

檢測是否有人手動改資源導致 Stack 不一致

  • 適用治理,合規
  • 看到 Identity Manual Change -> Drift Detection

Rollback Triggers

CloudWatch Alarms 作為失敗條件

Alarm 變紅 -> Stack Rollback

開發上常測試 ALB/TG,Lambda Health


DeletionPolicy

避免重要資料因 Stack 刪除而遺失

  • S3/RDS/DynamoDB
    • DeletionPolicy Retain

保留資料 使用 Retain


Nested Stacks/StackSets

  • 大型專案模組化
    • Nested Stack
  • 多帳號/多區同步部署
    • StackSet

DependsOn

顯示控制順序

一般交給 CFN 自己排序,除非強依賴


語法


常用 Intrinsic Functions

Function Feature 常見用途 關鍵
!Ref 取得變數值 取的 Parameter 值,Resource name/ARN
!GetAtt 取得資源屬性 取 ALB DNS, Lambda ARN ARN 屬性最常用
!Sub 字串替換 組字串: ARN/URL 字串拼接
!Join 字串 Join 比較古老的拼字方式 若看到 Sub 更佳
!FindInMap 查 Mapping Region-based config Region 對應設定
!ImportValue 取得別 Stack Outputs Cross-stack Dependencies 與 Export 搭配
!Condition 條件建立資源 跨環境(Prod Only) 與 Conditions: 區塊搭配
!If 條件選擇元素 Prod/Dev 選不同設定 嵌在 Resource 裡面
!Equals !And !Or !Not 條件判斷 Parameter 驗證 與 Condition 一起考
!Select 依 index 選值 Subnet 分配 / AZ 選取 結合 !GetAZs 使用
!GetAZs 列出所有 AZ !Select 0 !GetAZs 選單一 AZ(大考點)

最重要 6 個

函式 拿什麼? 例子
Ref Resource 名 / Parameter 值 !Ref MyBucket → bucket name
GetAtt Resource 屬性 !GetAtt MyBucket.Arn
Sub 字串插值 "arn:aws:s3:::${BucketName}/*"
Join 字串拼接 !Join [":", ["a","b","c"]]
FindInMap Mapping 查表 !FindInMap [MapName, Key, Name]
ImportValue 跨 Stack Output !ImportValue SharedVPCID