CloudFormation 作為 AWS 基礎設施即程式碼的核心服務,其進階功能可以大幅提升範本的彈性與安全性。資源刪除策略(DeletionPolicy)允許開發者精細控制資源的生命週期,避免重要資料因堆積疊操作而意外遺失。Retain 策略可在刪除堆積疊時保留資源,Delete 策略則會移除資源,而 Snapshot 策略則會在刪除前建立快照。文章也探討瞭如何透過條件式判斷動態調整刪除策略,例如根據環境變數決定是否保留資料函式庫例項。跨堆積疊資源參照則能促進團隊協作和模組化設計,透過 Outputs 和 Exports 機制,可以將一個堆積疊的資源屬性匯出,並在其他堆積疊中透過 Fn::ImportValue 函式參照,實作資源分享和設定一致性。

進階範本開發:刪除策略與資源參照

在AWS CloudFormation中,進階範本開發涉及多個重要導向,包括資源刪除策略、資源參照等。這些功能使我們能夠更靈活、更安全地管理基礎設施即程式碼(IaC)。

刪除策略(Deletion Policies)

刪除策略是CloudFormation中用於控制資源刪除行為的重要屬性。正確使用刪除策略,可以避免因範本更新或刪除而導致的重要資料遺失。

支援的資源型別

目前,刪除策略支援以下資源型別:

  • AWS::EC2::Volume
  • AWS::ElastiCache::CacheCluster
  • AWS::ElastiCache::ReplicationGroup
  • AWS::Neptune::DBCluster
  • AWS::RDS::DBCluster
  • AWS::RDS::DBInstance
  • AWS::Redshift::Cluster

刪除策略選項

  1. Retain:當堆積疊被刪除時,資源將被保留在AWS帳戶中。

    Resources:
      ImportantDb:
        Type: "AWS::RDS::DBInstance"
        DeletionPolicy: Retain
        Properties:
          # RDS例項屬性設定
    

    在這個例子中,當堆積疊被刪除時,ImportantDb 資料函式庫例項將被保留。

  2. Delete:當堆積疊被刪除時,資源將被刪除。這是預設的刪除策略。

    Resources:
      TemporaryDb:
        Type: "AWS::RDS::DBInstance"
        DeletionPolicy: Delete
        Properties:
          # RDS例項屬性設定
    

    如果未指定刪除策略,資源將預設使用Delete策略。

  3. Snapshot:在刪除資源之前,先建立資源的快照(目前僅支援某些資源型別,如RDS例項和Redshift叢集)。

    Resources:
      SnapshottedDb:
        Type: "AWS::RDS::DBInstance"
        DeletionPolicy: Snapshot
        Properties:
          # RDS例項屬性設定
    

條件式刪除策略

結合條件(Conditions)和刪除策略,可以實作更靈活的資源管理。

AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::LanguageExtensions
Description: Database template
Parameters:
  Environment:
    Type: String
    AllowedValues: [ "dev", "test", "prod" ]
    Default: "dev"
Conditions:
  ProdEnv: !Equals [ !Ref Environment, "prod" ]
  TestEnv: !Equals [ !Ref Environment, "test" ]
  DevEnv: !Equals [ !Ref Environment, "dev" ]
Resources:
  Database:
    DeletionPolicy: !If [ProdEnv, "Retain", "Delete"]
    Type: "AWS::RDS::DBCluster"
    Properties:
      # 生產資料函式庫屬性設定

在這個範例中,根據Environment引數的值,Database資源的刪除策略將被動態設定為Retain(在生產環境)或Delete(在開發或測試環境)。

參照現有堆積疊資源

在大型環境中,不同的團隊可能會管理各自的堆積疊資源。有時,我們需要在不同的堆積疊之間共用資源或資源屬性。

使用輸出(Outputs)和匯出(Exports)

  1. 輸出:用於檢索已建立資源的屬性。
  2. 匯出:輸出值的別名,用於跨堆積疊參照資源屬性。
# core.yaml
Outputs:
  VpcId:
    Value: !Ref Vpc
    Export:
      Name: VpcId
  PublicSubnet1Id:
    Value: !Ref PublicSubnet1
    Export:
      Name: PublicSubnet1Id
  PublicSubnetIds:
    Value: !Join [ ",", [ !Ref PublicSubnet1, !Ref PublicSubnet2, !Ref PublicSubnet3 ] ]
    Export:
      Name: PublicSubnetIds
# webtier.yaml
Resources:
  WebTierAsg:
    Type: "AWS::AutoScaling::AutoScalingGroup"
    Properties:
      # 其他屬性...
      VpcZoneIdentifier: !Split [ ",", !ImportValue PublicSubnetIds ]
      # 其他屬性...

在這個範例中,core.yaml 範本匯出了 VPC ID 和子網 ID,而 webtier.yaml 範本則使用 Fn::ImportValue 匯入這些值。

最佳實踐

  • 對於清單型別的資源(如子網ID或可用區),建議將它們組合成字串後匯出,然後在目標堆積疊中使用 Fn::Split 函式進行分割。
  • 確保匯出名稱在區域和帳戶內是唯一的。
  • 謹慎使用刪除策略,以避免意外刪除重要資源。
內容解密:

上述內容描述瞭如何在AWS CloudFormation中使用刪除策略和資源參照來增強範本的靈活性和安全性。刪除策略允許開發者控制資源在堆積疊刪除時的行為,而資源參照則使得跨堆積疊共用資源屬性成為可能。這些功能對於大型、複雜的雲端環境至關重要。

# 正確使用刪除策略範例
Resources:
  MyDatabase:
    Type: 'AWS::RDS::DBInstance'
    DeletionPolicy: Retain
    Properties:
      AllocatedStorage: '20'
      DBInstanceClass: 'db.t2.micro'
      Engine: 'MySQL'
      MasterUsername: !Sub 'dbuser-${AWS::Region}'
      MasterUserPassword: !Sub 'dbpassword-${AWS::Region}'

內容解密:

這個YAML程式碼片段展示瞭如何在CloudFormation範本中為RDS資料函式庫例項設定DeletionPolicyRetain。這樣,當包含此資源的堆積疊被刪除時,資料函式庫例項將被保留,避免資料遺失。

# 資源參照範例
Outputs:
  MyVpcId:
    Value: !Ref MyVpc
    Export:
      Name: !Sub '${AWS::Region}-MyVpcId'

內容解密:

此範例展示瞭如何在CloudFormation範本的Outputs部分匯出VPC ID。匯出的名稱包含區域資訊,以確保其唯一性。這使得其他堆積疊可以使用Fn::ImportValue函式參照此VPC ID。

# 使用匯出值範例
Resources:
  MyEc2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      VpcId: !ImportValue !Sub '${AWS::Region}-MyVpcId'
      # 其他屬性...

內容解密:

這個範例展示瞭如何在另一個CloudFormation堆積疊中使用Fn::ImportValue函式匯入之前匯出的VPC ID。資源區域資訊的動態參照確保了跨區域佈署的靈活性。

探討AWS Pseudo Parameters在CloudFormation中的應用

在AWS CloudFormation中,pseudo parameters扮演著重要的角色,它們提供了在範本中參照AWS特定值的能力,而無需硬編碼這些值。本文將探討AWS pseudo parameters的概念、常見用法以及如何在CloudFormation範本中有效地使用它們。

什麼是AWS Pseudo Parameters?

AWS pseudo parameters是一些由AWS提供的特殊引數,它們的值在堆積疊建立或更新時由AWS自動填充。這些引數使得範本更加靈活和可重用,因為它們允許您參照與當前AWS環境相關的資訊,而無需手動輸入或硬編碼這些值。

常見的AWS Pseudo Parameters

以下是一些常見的AWS pseudo parameters:

  1. AWS::AccountId - 當前AWS賬戶的ID。
  2. AWS::Region - 當前堆積疊所在的AWS區域。
  3. AWS::StackName - 當前堆積疊的名稱。
  4. AWS::StackId - 當前堆積疊的唯一ID。
  5. AWS::NoValue - 表示一個空值或無值,可以用於條件函式中。

使用AWS Pseudo Parameters的優勢

使用AWS pseudo parameters有幾個明顯的優勢:

  1. 提高範本的可重用性:透過使用pseudo parameters,您可以建立出可以在不同AWS賬戶、區域或堆積疊中重用的範本。
  2. 減少硬編碼:避免在範本中硬編碼特定的值,如賬戶ID或區域,使得範本更加靈活和易於維護。
  3. 增強安全性:透過避免在範本中直接暴露敏感資訊(如賬戶ID),可以提高安全性。

例項解析:如何在CloudFormation中使用AWS Pseudo Parameters

使用AWS::AccountIdAWS::Region

在某些資源的定義中,需要指定AWS賬戶ID或區域。使用pseudo parameters可以避免硬編碼這些值。

Resources:
  MyIamRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Action:
              - "sts:AssumeRole"
            Principal:
              AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"

使用AWS::NoValue與條件函式

AWS::NoValue可以用於條件表示式中,以根據條件決定是否包含某個屬性。

Resources:
  MyDB:
    Type: "AWS::RDS::DBInstance"
    Properties:
      AllocatedStorage: "5"
      DBInstanceClass: "db.t3.micro"
      Engine: "MySQL"
      EngineVersion: "5.7"
      DBSnapshotIdentifier: !If
        - UseDBSnapshot
        - !Ref DBSnapshotName
        - !Ref AWS::NoValue

使用AWS::StackName作為標籤

您可以使用AWS::StackName pseudo parameter來為資源新增標籤,這有助於資源的管理和跟蹤。

Resources:
  SomeResource:
    Type: "AWS::EC2::Instance"
    Properties:
      # 其他屬性...
      Tags:
        - Key: "Application"
          Value: !Ref AWS::StackName

進一步探討:AWS Pseudo Parameters的最佳實踐

1. 廣泛使用AWS::RegionAWS::AccountId

在定義資源時,盡量使用AWS::RegionAWS::AccountId來避免硬編碼區域和賬戶ID。這不僅提高了範本的可移植性,也減少了因硬編碼導致的錯誤。

2. 利用AWS::NoValue進行條件組態

在需要根據條件組態資源屬性時,AWS::NoValue非常有用。它允許您根據特定條件決定是否包含某個屬性,從而使範本更加靈活。

3. 使用AWS::StackNameAWS::StackId進行資源標籤化

透過使用AWS::StackNameAWS::StackId為資源新增標籤,可以提高資源的可管理性,特別是在複雜的環境中。

4. 結合條件函式使用Pseudo Parameters

條件函式(如Fn::If)與pseudo parameters結合使用,可以實作更加複雜的邏輯控制。這使得範本能夠根據不同的條件進行動態調整。

5. 注意Pseudo Parameters的限制

雖然pseudo parameters非常有用,但它們也有一些限制。例如,某些資源或屬性可能不支援所有的pseudo parameters。因此,在使用之前,請務必查閱相關檔案。

實踐案例:綜合運用AWS Pseudo Parameters

以下是一個綜合運用多個pseudo parameters的例子,展示瞭如何在一個範本中靈活地使用這些引數。

Resources:
  MyEC2Instance:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", "AMI"]
      InstanceType: "t2.micro"
      Tags:
        - Key: "StackName"
          Value: !Ref AWS::StackName
        - Key: "StackId"
          Value: !Ref AWS::StackId

Mappings:
  RegionMap:
    us-east-1:
      AMI: "ami-0c94855ba95c71c99"
    us-west-2:
      AMI: "ami-0d6621c01e8c2de2c"

Outputs:
  InstanceId:
    Value: !Ref MyEC2Instance
    Export:
      Name: !Sub "${AWS::StackName}-InstanceId"

這個例子中,我們使用了AWS::RegionAWS::StackNameAWS::StackId等多個pseudo parameters,分別用於查詢對映中的AMI、設定資源標籤以及輸出堆積疊相關資訊。