本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用巢狀堆疊將範本分割成可重複使用的部分
隨著基礎設施的成長,您可能會發現自己在多個範本之間重複建立相同的資源組態。若要避免這種備援,您可以將這些常用組態分隔為專用範本。然後,您可以在其他範本中使用 AWS::CloudFormation::Stack 資源來參考這些專用範本,建立巢狀堆疊。
例如,假設您有一個用於大部分堆疊的負載平衡器組態。相較於複製相同的組態並在您的範本中貼上,您可以為負載平衡器建立專用的範本。然後,您可以從需要相同負載平衡器組態的其他範本中參考此範本。
巢狀堆疊本身可以包含其他巢狀堆疊,導致堆疊階層,如下圖所示。根堆疊是所有巢狀堆疊最終所屬的最上層堆疊。每個巢狀堆疊都有一個立即的父堆疊。對於第一層巢狀堆疊,根堆疊也是父堆疊。
-
堆疊 A 是所有其他、巢狀、階層中堆疊的根堆疊。
-
針對堆疊 B,堆疊 A 同時是其父系堆疊及根堆疊。
-
針對堆疊 D,堆疊 C 是父系堆疊;針對堆疊 C,堆疊 B 為其父系堆疊。

分割範本的範例前後
此範例示範如何採用單一大型 CloudFormation 範本,並使用巢狀範本將其重新組織為更結構化且可重複使用的設計。一開始,「巢狀堆疊前」範本會顯示一個檔案中定義的所有資源。隨著資源數量的增加,這可能會變得雜亂且難以管理。「巢狀堆疊後」範本會將資源分割成較小的個別範本。每個巢狀堆疊都會處理一組特定的相關資源,讓整體結構更有條理且更容易維護。
巢狀堆疊之前 |
巢狀堆疊之後 |
---|---|
|
|
巢狀堆疊架構的範例
本節示範由參考巢狀堆疊的頂層堆疊組成的巢狀堆疊架構。巢狀堆疊會部署 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-filepackaged-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-namestack-name
\ --capabilities CAPABILITY_NAMED_IAM
在巢狀堆疊上執行堆疊操作
使用巢狀堆疊時,您必須在操作期間小心處理。某些堆疊操作,例如堆疊更新,應該從根堆疊啟動,而不是直接在巢狀堆疊上執行。當您更新根堆疊時,只會更新具有範本變更的巢狀堆疊。
此外,巢狀堆疊的存在可能會影響根堆疊上的操作。例如,如果一個巢狀堆疊卡在 UPDATE_ROLLBACK_IN_PROGRESS
狀態,根堆疊會等到該巢狀堆疊完成復原後再繼續。在繼續更新操作之前,請確定您具有取消堆疊更新的 IAM 許可,以防其轉返。如需詳細資訊,請參閱使用 控制 CloudFormation 存取 AWS Identity and Access Management。
使用下列程序來尋找根堆疊和巢狀堆疊。
檢視巢狀堆疊的根堆疊
-
登入 AWS Management Console 並在 https://https://console.aws.amazon.com/cloudformation
開啟 AWS CloudFormation 主控台。 -
在堆疊頁面上,選擇您要檢視根堆疊的巢狀堆疊名稱。
巢狀堆疊會在其堆疊名稱上方顯示 NESTED。
-
在堆疊資訊索引標籤的概觀區段中,選擇列為根堆疊的堆疊名稱。
檢視屬於根堆疊的巢狀堆疊
-
從您要檢視其巢狀堆疊的根堆疊中,選擇資源索引標籤。
-
在類型欄中,尋找 AWS::CloudFormation::Stack類型的資源。