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 關係
SAMServerless CFN 擴充 -> build -> deploy 為 CFN Stack
CDK程式碼生成 CFN Template -> 再由 CFN 部署
SARServerless App Repository -> 也是 CFN 部署

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


Parameters/Outputs/Export/Import

區塊 | 用途關鍵用途
ParametersCI/CD 傳入變數Multi-env Deployment
OutputsStack 回傳資訊RDS Endpoint 提供給 App
Export/ImportValueStack 之間資源共享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

FunctionFeature常見用途關鍵
!Ref取得變數值取的 Parameter 值,Resource name/ARN
!GetAtt取得資源屬性取 ALB DNS, Lambda ARNARN 屬性最常用
!Sub字串替換組字串: ARN/URL字串拼接
!Join字串 Join比較古老的拼字方式若看到 Sub 更佳
!FindInMap查 MappingRegion-based configRegion 對應設定
!ImportValue取得別 Stack OutputsCross-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 個

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