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
刪除策略選項
Retain:當堆積疊被刪除時,資源將被保留在AWS帳戶中。
Resources: ImportantDb: Type: "AWS::RDS::DBInstance" DeletionPolicy: Retain Properties: # RDS例項屬性設定
在這個例子中,當堆積疊被刪除時,
ImportantDb
資料函式庫例項將被保留。Delete:當堆積疊被刪除時,資源將被刪除。這是預設的刪除策略。
Resources: TemporaryDb: Type: "AWS::RDS::DBInstance" DeletionPolicy: Delete Properties: # RDS例項屬性設定
如果未指定刪除策略,資源將預設使用
Delete
策略。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)
- 輸出:用於檢索已建立資源的屬性。
- 匯出:輸出值的別名,用於跨堆積疊參照資源屬性。
# 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資料函式庫例項設定DeletionPolicy
為Retain
。這樣,當包含此資源的堆積疊被刪除時,資料函式庫例項將被保留,避免資料遺失。
# 資源參照範例
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:
AWS::AccountId
- 當前AWS賬戶的ID。AWS::Region
- 當前堆積疊所在的AWS區域。AWS::StackName
- 當前堆積疊的名稱。AWS::StackId
- 當前堆積疊的唯一ID。AWS::NoValue
- 表示一個空值或無值,可以用於條件函式中。
使用AWS Pseudo Parameters的優勢
使用AWS pseudo parameters有幾個明顯的優勢:
- 提高範本的可重用性:透過使用pseudo parameters,您可以建立出可以在不同AWS賬戶、區域或堆積疊中重用的範本。
- 減少硬編碼:避免在範本中硬編碼特定的值,如賬戶ID或區域,使得範本更加靈活和易於維護。
- 增強安全性:透過避免在範本中直接暴露敏感資訊(如賬戶ID),可以提高安全性。
例項解析:如何在CloudFormation中使用AWS Pseudo Parameters
使用AWS::AccountId
和AWS::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::Region
和AWS::AccountId
在定義資源時,盡量使用AWS::Region
和AWS::AccountId
來避免硬編碼區域和賬戶ID。這不僅提高了範本的可移植性,也減少了因硬編碼導致的錯誤。
2. 利用AWS::NoValue
進行條件組態
在需要根據條件組態資源屬性時,AWS::NoValue
非常有用。它允許您根據特定條件決定是否包含某個屬性,從而使範本更加靈活。
3. 使用AWS::StackName
和AWS::StackId
進行資源標籤化
透過使用AWS::StackName
和AWS::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::Region
、AWS::StackName
和AWS::StackId
等多個pseudo parameters,分別用於查詢對映中的AMI、設定資源標籤以及輸出堆積疊相關資訊。