ネストされたスタックを使用してテンプレートを再利用可能な部分に分割する
インフラストラクチャが拡張するにつれて、複数のテンプレートで同一のリソース構成を繰り返し作成する場合があります。このような重複を避けるために、共通の構成を専用のテンプレートに分離できます。次に、他のテンプレートで AWS::CloudFormation::Stack リソースを使用してこれらの専用テンプレートを参照し、ネストされたスタックを作成できます。
たとえば、ほとんどのスタックに使用しているロードバランサー構成があると仮定します。テンプレートに同じ構成をコピーアンドペーストする代わりに、ロードバランサーを対象にした専用テンプレートを作成できます。次に、同じロードバランサー構成を必要とする他のテンプレート内からこのテンプレートを参照できます。
ネストされたスタックには他のネストされたスタックを含めることができるため、次の図に示すようにスタックの階層になっています。ルートスタックは、ネストされたすべてのスタックが最終的に属する最上位スタックです。ネストされたスタックにはそれぞれ、直接の親スタックが存在します。第 1 レベルのネストされたスタックの場合は、ルートスタックにも親スタックが存在します。
-
スタック A は、階層内のネストされたその他すべてのスタックのルートスタックを表します。
-
スタック B から見ると、スタック A は親スタックであると同時にルートスタックでもあります。
-
スタック D から見るとスタック C が親スタック、スタック C から見るとスタック B が親スタックです。

テンプレート分割の前後の例
この例では、単一の大規模な CloudFormation テンプレートを、ネストされたテンプレートを使用するより構造的で再利用可能な設計に再編成する方法を説明します。元の「ネスト前のスタック」テンプレートでは、1 つのファイルにすべてのリソースが定義されているのがわかります。このテンプレートは、リソースの数が増えるにつれて煩雑になり、管理しにくくなる可能性があります。「ネスト後のスタック」テンプレートは、リソースをより小規模な個別のテンプレートに分割しています。ネストされたスタックは、それぞれが関連するリソースの特定のセットを処理するため、構造全体がよりよく整理され、維持しやすくなります。
スタックをネストする前 |
スタックをネストした後 |
---|---|
|
|
ネストされたスタックのアーキテクチャの例
このセクションでは、ネストされたスタックを参照する最上位スタックで構成される、ネストされたスタックのアーキテクチャを示します。ネストされたスタックは、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 コマンドを使用すると、デプロイの準備を行うのに役立ちます。このコマンドは、ローカルのアーティファクト (TemplateURL
を含む) を自動的に Amazon S3 にアップロードし、これらの S3 の場所への更新された参照を含む新しいテンプレートファイルを生成します。詳細については、「AWS CLI を使用してローカルアーティファクトを S3 バケットにアップロードする」を参照してください。
次に、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
ネストされたスタックでのスタックオペレーションの実行
ネストされたスタックを扱う場合は、操作時に注意が必要です。特定のスタックオペレーション (例: スタックの更新) では、ネストされたスタックから直接実行するのではなく、ルートスタックから起動する必要があります。ルートスタックを更新すると、テンプレートが変更されたネストされたスタックのみが更新されます。
さらに、ネストされたスタックがあると、ルートスタックでのオペレーションに影響する場合があります。たとえば、ネストされたスタックの 1 つが UPDATE_ROLLBACK_IN_PROGRESS
状態でスタックした場合、ルートスタックはそのネストされたスタックがロールバックを完了するまで待機してから続行します。更新オペレーションに進む前に、スタックの更新がロールバックされた場合にキャンセルする IAM アクセス権限があることを確認してください。詳細については、「AWS Identity and Access Management で CloudFormation アクセスを制御する」を参照してください。
ルートスタックとネストされたスタックを検索するには、次の手順を実行します。
ネストされたスタックのルートスタックを表示するには
-
AWS Management Console にサインインし、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation
) を開きます。 -
[スタック] ページで、ルートスタックを表示するネストされたスタックの名前を選択します。
ネストされたスタックについては、スタック名の上に [NESTED] と表示されます。
-
[スタック情報] タブの [概要] セクションで、[ルートスタック] としてリストされているスタック名を選択します。
ルートスタックに属するネストされたスタックを表示するには
-
ネストされたスタックを表示するルートスタックから、[リソース] タブを選択します。
-
[タイプ] 列で、AWS::CloudFormation::Stack タイプのリソースを探します。