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 維護和更新
常見使用情境
- 基礎設施自動化
- 跨環境一致性
- 快速災難復原
- 合規性和審計
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 |