CloudFormation 作為 AWS 基礎設施即程式碼的核心服務,其 pseudo 引數和動態參考機制是構建靈活、可重用範本的關鍵。pseudo 引數允許在範本中直接取得堆積疊相關資訊,例如堆積疊名稱、區域資訊等,簡化跨區域佈署。而動態參考則能整合 SSM 引數儲存和 Secrets Manager,實作敏感資料的安全管理和引數值的動態更新,避免硬編碼的風險,提升範本的可維護性。這對於構建複雜的雲端環境,以及在不同環境中佈署相同的應用程式架構至關重要。

進階範本開發:AWS Pseudo 引數與動態參考

在 AWS CloudFormation 中,開發高階別範本需要深入瞭解 pseudo 引數和動態參考的使用。這些功能使得範本更加靈活和可重用,尤其是在處理敏感資料和跨區域佈署時。

AWS Pseudo 引數詳解

AWS 提供了一系列 pseudo 引數,讓範本開發者能夠動態取得與堆積疊相關的資訊。這些引數在範本中非常有用,因為它們允許你建立與特定環境無關的範本。

1. AWS::StackName 引數詳解

AWS::StackName 是一個關鍵的 pseudo 引數,用於表示當前堆積疊的名稱。這個引數在資源標籤中非常有用,它能夠明確指出資源所屬的堆積疊。

Resources:
  MyResource:
    Type: AWS::EC2::Instance
    Properties:
      Tags:
        - Key: "StackName"
          Value: !Ref AWS::StackName

2. AWS::URLSuffix 引數詳解

AWS::URLSuffix 用於指定 AWS 服務的 URL 字尾。在大多數情況下,這個值是 amazonaws.com。然而,在特殊區域(如中國或 AWS GovCloud)佈署應用時,需要使用特定的 URL 字尾。

Resources:
  EcsTaskExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              Service: !Sub "ecs-tasks.${AWS::URLSuffix}"
            Action: "sts:AssumeRole"

3. AWS::Partition 引數詳解

AWS::Partition 引數用於構建 ARN(Amazon Resource Name)。在大多數情況下,分割槽是 aws,但在某些區域(如中國或 GovCloud),分割槽可能是 aws-cnaws-us-gov

Resources:
  MyResource:
    Type: AWS::IAM::Role
    Properties:
      Arn: !Sub "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/MyRole"

動態參考:與 SSM 引數儲存和 Secrets Manager 整合

在處理敏感資料或頻繁變更的引數時,動態參考提供了一個強大的解決方案。透過與 AWS Systems Manager (SSM) 引數儲存和 Secrets Manager 整合,你可以在範本中動態檢索引數值。

1. 使用 SSM 引數儲存

首先,在核心範本中建立 SSM 引數:

Resources:
  WebAsgMinSize:
    Type: "AWS::SSM::Parameter"
    Properties:
      Type: String
      Value: "1"

Outputs:
  WebAsgMinSize:
    Value: !Ref WebAsgMinSize
    Export:
      Name: WebAsgMinSize

然後,在另一個範本中參照這些引數:

Resources:
  WebTierAsg:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      MinSize: !Sub "{{resolve:ssm:${parameter}:1}}"
      MaxSize: !Sub "{{resolve:ssm:${parameter}:1}}"
      DesiredCapacity: !Sub "{{resolve:ssm:${parameter}:1}}"

2. 使用 Secrets Manager 儲存敏感資料

對於敏感資料,如資料函式庫密碼,可以使用 Secrets Manager:

Resources:
  DbPwSecret:
    Type: "AWS::SecretsManager::Secret"
    Properties:
      GenerateSecretString:
        GenerateStringKey: "DbPassword"

  RdsInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      MasterUserPassword: !Sub "{{resolve:secretsmanager:${DbPwSecret}:SecretString::DbPassword}}"

重要注意事項

  1. SSM 引數版本控制:目前無法直接參照 SSM 引數的最新版本,必須在 resolve 塊中指定版本。
  2. 動態參考語法:正確使用 {{resolve:service-name:reference-key}} 語法來參照動態引數。
  3. 敏感資料保護:使用 Secrets Manager 儲存敏感資料,避免在範本中硬編碼。

最佳實踐

  1. 範本模組化:將 SSM 引數和 Secrets Manager 整合到核心範本中,其他範本透過參照這些引數來保持一致性。
  2. 動態參考的靈活性:利用動態參考減少範本之間的耦合,提高可重用性。
  3. 安全最佳實踐:始終使用加密和安全儲存來保護敏感資料。

隨著雲端計算技術的不斷進步,CloudFormation 等基礎設施即程式碼(IaC)工具將繼續演進。未來,我們可以預期會有更多強大的功能和整合出現,以進一步簡化雲資源的管理和佈署。持續學習和掌握這些新技術,將使你在雲端計算領域保持競爭優勢。

進一步閱讀

這些資源提供了關於 CloudFormation、SSM 引數儲存和 Secrets Manager 的詳細資訊,可以幫助你深入瞭解並有效利用這些服務。

使用CloudFormation語言擴充功能最佳化範本開發

CloudFormation範本主要採用YAML或JSON格式,但其本身是一種專門為雲端資源定義的領域特定語言(DSL)。雖然我們可以利用YAML的功能,如錨點和別名,但CloudFormation透過內建函式(如Fn::RefFn::GetAttFn::Cidr)增強了其功能,使其在處理變數參照、類別屬性取得和CIDR範圍生成等方面更為強大。

克服範本限制:語言擴充功能的引入

在處理多個相似資源或需要在資源屬性中寫入JSON字串時,傳統的CloudFormation範本會顯得力不從心。雖然其他工具(如Cloud Development Kit和Serverless Application Model)可以解決重複性問題,但AWS持續改進CloudFormation,其中包括最近發布的語言擴充功能(Language Extensions)

刪除策略的改進

過去,我們需要根據環境(測試或生產)決定是否保留或刪除資料函式庫,通常需要使用Condition宣告兩個相同的資源。而語言擴充功能簡化了這一過程,讓我們能夠更靈活地控制資源的生命週期。

JSON字串生成的最佳化

另一個常見問題是在範本中生成JSON字串,尤其是在使用Secrets Manager時。傳統做法是直接在範本中寫死敏感資訊,例如:

// database.yaml
Resources:
  HardcodedDatabaseSecret:
    Condition: TestEnv
    Type: "AWS::SecretsManager::Secret"
    Properties:
      Description: "Database credentials"
      # 請勿在生產環境中使用此方法!
      SecretString: '{"username":"dbuser","password":"dbpassword"}'

這樣的設定不僅可讀性差,維護起來也很困難,尤其是在JSON格式的範本中更是如此:

{
  "Resources": {
    "MySecret": {
      "Type": "AWS::SecretsManager::Secret",
      "Properties": {
        "SecretString": "{\"username\":\"dbuser\",\"password\":\"dbpassword\"}"
      }
    }
  }
}

使用Fn::ToJsonString提升範本靈活性

語言擴充功能引入了Fn::ToJsonString,這是一個內建函式,能夠將YAML鍵值對轉換為JSON字串。讓我們使用這個新功能來改進前面的範例:

// database.yaml
Resources:
  HardcodedDatabaseSecret:
    Condition: TestEnv
    Type: "AWS::SecretsManager::Secret"
    Properties:
      Description: "Database credentials"
      SecretString:
        Fn::ToJsonString:
          username: "dbuser"
          # 請勿在生產環境中使用此方法!
          password: "dbpassword"

內容解密:

在這個範例中,Fn::ToJsonString 將YAML中的鍵值對轉換為JSON格式的字串。這使得在SecretString屬性中動態生成JSON內容變得更加簡單和直觀。Fn::ToJsonString 不僅能處理簡單的鍵值對,還能轉換複雜的物件結構,例如CloudWatch儀錶板組態。

更多語言擴充功能的發展

語言擴充功能目前仍在積極開發中,其中一個備受期待的功能是迴圈(for loop),它將進一步提升範本的靈活性和可重用性。

範本開發的最佳實踐

雖然我們在這一章中沒有實際佈署任何堆積疊,但我們探討了CloudFormation的主要構建模組。我們學習瞭如何使範本可重用和可回收,如何使用條件控制範本,以及如何保護堆積疊資源免受意外刪除。同時,我們還介紹了動態引數參照的使用,這在後續章節中將會越來越重要。

在進入下一章之前,請務必仔細閱讀程式碼倉函式庫中的範本,並理解每一行程式碼的意義。

重點回顧

本章節主要介紹了CloudFormation的語言擴充功能及其在範本開發中的優勢。透過這些新功能,我們可以更高效地管理和維護雲端資源組態。下一章將探討預檢檢查和各種堆積疊資源的組態方法。

驗證、檢查與佈署堆積疊

到目前為止,我們尚未佈署堆積疊。雖然我們已經學習了範本的功能,但如果不實際佈署資源,這些知識就沒有太大的價值。本章節將重點介紹在佈署資源之前需要進行的檢查、各種佈署堆積疊的方法以及相關步驟。

範本驗證

每當我們執行aws cloudformation create-stack(或update-stack)時,CloudFormation會首先驗證範本,檢查它是否是有效的JSON或YAML檔案(語法檢查),以及是否存在任何嚴重的問題,例如迴圈依賴。

驗證流程詳細解說

  1. 語法檢查:首先檢查範本檔案的語法是否正確,確保其符合JSON或YAML的規範。
  2. 依賴檢查:檢查範本中的資源依賴關係,確保沒有迴圈依賴的情況發生。

使用檢查工具提升範本品質

除了CloudFormation自帶的驗證功能,我們還可以使用linter工具來檢查範本是否符合最佳實踐。這有助於在佈署前發現潛在問題,從而提高範本的品質和可維護性。

佈署堆積疊與錯誤處理

在完成範本驗證後,我們可以開始佈署堆積疊。在佈署過程中,正確處理錯誤和漂移(drift)是非常重要的,這將確保我們的資源組態正確且符合預期。

佈署步驟詳解

  1. 堆積疊建立:使用aws cloudformation create-stack命令建立新的堆積疊。
  2. 堆積疊更新:使用aws cloudformation update-stack命令更新現有的堆積疊。
  3. 錯誤處理:在佈署過程中遇到錯誤時,應及時檢查錯誤資訊並進行相應的修正。

處理漂移

隨著時間的推移,堆積疊中的資源可能會與範本定義的狀態不一致,這種情況被稱為漂移。我們需要定期檢查和處理漂移,以確保堆積疊資源的組態始終符合範本的定義。

漂移處理步驟

  1. 檢測漂移:使用aws cloudformation detect-stack-drift命令檢測堆積疊中的漂移。
  2. 修正漂移:根據檢測結果,對漂移的資源進行修正,使其重新符合範本的定義。

重要問題與進一步閱讀

重要問題

  1. 我們可以在資源的Conditions屬性中使用內建函式嗎?
  2. 我們可以在資源屬性中使用內建函式進行條件判斷嗎?
  3. UpdatePolicyUpdateReplacePolicy之間有什麼區別?
  4. 對於關鍵任務的資料函式庫,應使用哪種刪除策略?
  5. Fn::ImportValue是用於什麼場景的?
  6. 是否可以建立多個具有相同名稱的匯出?
  7. 是否有特定的引數資料型別用於AMI?
  8. 什麼是AWS::NoValue?它的使用場景有哪些?

進一步閱讀

透過本章節的學習,我們對CloudFormation的範本開發、驗證和佈署有了更深入的瞭解。這些知識將幫助我們在未來的雲端資源管理中更加得心應手。下一章將繼續探討如何利用CloudFormation進行持續整合和佈署。