使用巢狀堆疊將範本分割成可重複使用的部分 - AWS CloudFormation

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用巢狀堆疊將範本分割成可重複使用的部分

隨著基礎設施的成長,您可能會發現自己在多個範本之間重複建立相同的資源組態。若要避免這種備援,您可以將這些常用組態分隔為專用範本。然後,您可以在其他範本中使用 AWS::CloudFormation::Stack 資源來參考這些專用範本,建立巢狀堆疊。

例如,假設您有一個用於大部分堆疊的負載平衡器組態。相較於複製相同的組態並在您的範本中貼上,您可以為負載平衡器建立專用的範本。然後,您可以從需要相同負載平衡器組態的其他範本中參考此範本。

巢狀堆疊本身可以包含其他巢狀堆疊,導致堆疊階層,如下圖所示。根堆疊是所有巢狀堆疊最終所屬的最上層堆疊。每個巢狀堆疊都有一個立即的父堆疊。對於第一層巢狀堆疊,根堆疊也是父堆疊。

  • 堆疊 A 是所有其他、巢狀、階層中堆疊的根堆疊。

  • 針對堆疊 B,堆疊 A 同時是其父系堆疊及根堆疊。

  • 針對堆疊 D,堆疊 C 是父系堆疊;針對堆疊 C,堆疊 B 為其父系堆疊。

巢狀堆疊,即做為另一個堆疊的部分建立的堆疊,具有立即的父系堆疊,以及最上層的根堆疊。

分割範本的範例前後

此範例示範如何採用單一大型 CloudFormation 範本,並使用巢狀範本將其重新組織為更結構化且可重複使用的設計。一開始,「巢狀堆疊前」範本會顯示一個檔案中定義的所有資源。隨著資源數量的增加,這可能會變得雜亂且難以管理。「巢狀堆疊後」範本會將資源分割成較小的個別範本。每個巢狀堆疊都會處理一組特定的相關資源,讓整體結構更有條理且更容易維護。

巢狀堆疊之前

巢狀堆疊之後

AWSTemplateFormatVersion: 2010-09-09 Parameters: InstanceType: Type: String Default: t2.micro Description: The EC2 instance type Environment: Type: String Default: Production Description: The deployment environment Resources: MyEC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-1234567890abcdef0 InstanceType: !Ref InstanceType MyS3Bucket: Type: AWS::S3::Bucket
AWSTemplateFormatVersion: 2010-09-09 Resources: MyFirstNestedStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/first-nested-stack.yaml Parameters: # Pass parameters to the nested stack if needed InstanceType: t3.micro MySecondNestedStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/second-nested-stack.yaml Parameters: # Pass parameters to the nested stack if needed Environment: Testing DependsOn: MyFirstNestedStack

巢狀堆疊架構的範例

本節示範由參考巢狀堆疊的頂層堆疊組成的巢狀堆疊架構。巢狀堆疊會部署 Node.js Lambda 函數、從頂層堆疊接收參數值,並傳回透過頂層堆疊公開的輸出。

步驟 1:為本機系統上的巢狀堆疊建立範本

下列範例顯示巢狀堆疊範本的格式。

YAML

AWSTemplateFormatVersion: 2010-09-09 Description: Nested stack template for Lambda function deployment Parameters: MemorySize: Type: Number Default: 128 MinValue: 128 MaxValue: 10240 Description: Lambda function memory allocation (128-10240 MB) Resources: LambdaFunction: Type: AWS::Lambda::Function Properties: FunctionName: !Sub "${AWS::StackName}-Function" Runtime: nodejs18.x Handler: index.handler Role: !GetAtt LambdaExecutionRole.Arn Code: ZipFile: | exports.handler = async (event) => { return { statusCode: 200, body: JSON.stringify('Hello from Lambda!') }; }; MemorySize: !Ref MemorySize LambdaExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: sts:AssumeRole ManagedPolicyArns: - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole' Outputs: LambdaArn: Description: ARN of the created Lambda function Value: !GetAtt LambdaFunction.Arn

步驟 2:建立本機系統上最上層堆疊的範本

下列範例顯示最上層堆疊範本的格式,以及參考您在上一個步驟中建立之堆疊AWS::CloudFormation::Stack的資源。

YAML

AWSTemplateFormatVersion: 2010-09-09 Description: Top-level stack template that deploys a nested stack Resources: NestedStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: /path_to_template/nested-template.yaml Parameters: MemorySize: 256 Outputs: NestedStackLambdaArn: Description: ARN of the Lambda function from nested stack Value: !GetAtt NestedStack.Outputs.LambdaArn

步驟 3:封裝和部署範本

注意

在本機使用範本時, AWS CLI package命令可協助您準備部署的範本。它會自動處理本機成品上傳到 Amazon S3 (包括 TemplateURL),並產生新的範本檔案,其中包含這些 S3 位置的更新參考。如需詳細資訊,請參閱使用 將本機成品上傳至 S3 儲存貯體 AWS CLI

接下來,您可以使用 package命令將巢狀範本上傳至 Amazon S3 儲存貯體。

aws cloudformation package \ --s3-bucket amzn-s3-demo-bucket \ --template /path_to_template/top-level-template.yaml \ --output-template-file packaged-template.yaml \ --output json

命令會在 指定的路徑產生新的範本--output-template-file。它會將TemplateURL參考取代為 Amazon S3 位置,如下所示。

產生範本

AWSTemplateFormatVersion: 2010-09-09 Description: Top-level stack template that deploys a nested stack Resources: NestedStack: Type: AWS::CloudFormation::Stack Properties: TemplateURL: https://s3.us-west-2.amazonaws.com/amzn-s3-demo-bucket/8b3bb7aa7abfc6e37e2d06b869484bed.template Parameters: MemorySize: 256 Outputs: NestedStackLambdaArn: Description: ARN of the Lambda function from nested stack Value: Fn::GetAtt: - NestedStack - Outputs.LambdaArn

執行 package命令之後,您可以使用 deploy命令部署已處理的範本。對於包含 IAM 資源的巢狀堆疊,您必須包含 --capabilities選項來認可 IAM 功能。

aws cloudformation deploy \ --template-file packaged-template.yaml \ --stack-name stack-name \ --capabilities CAPABILITY_NAMED_IAM

在巢狀堆疊上執行堆疊操作

使用巢狀堆疊時,您必須在操作期間小心處理。某些堆疊操作,例如堆疊更新,應該從根堆疊啟動,而不是直接在巢狀堆疊上執行。當您更新根堆疊時,只會更新具有範本變更的巢狀堆疊。

此外,巢狀堆疊的存在可能會影響根堆疊上的操作。例如,如果一個巢狀堆疊卡在 UPDATE_ROLLBACK_IN_PROGRESS 狀態,根堆疊會等到該巢狀堆疊完成復原後再繼續。在繼續更新操作之前,請確定您具有取消堆疊更新的 IAM 許可,以防其轉返。如需詳細資訊,請參閱使用 控制 CloudFormation 存取 AWS Identity and Access Management

使用下列程序來尋找根堆疊和巢狀堆疊。

檢視巢狀堆疊的根堆疊
  1. 登入 AWS Management Console 並在 https://https://console.aws.amazon.com/cloudformation 開啟 AWS CloudFormation 主控台。

  2. 堆疊頁面上,選擇您要檢視根堆疊的巢狀堆疊名稱。

    巢狀堆疊會在其堆疊名稱上方顯示 NESTED

  3. 堆疊資訊索引標籤的概觀區段中,選擇列為根堆疊的堆疊名稱。

檢視屬於根堆疊的巢狀堆疊
  1. 從您要檢視其巢狀堆疊的根堆疊中,選擇資源索引標籤。

  2. 類型欄中,尋找 AWS::CloudFormation::Stack類型的資源。