ネストされたスタックを使用してテンプレートを再利用可能な部分に分割する - AWS CloudFormation

ネストされたスタックを使用してテンプレートを再利用可能な部分に分割する

インフラストラクチャが拡張するにつれて、複数のテンプレートで同一のリソース構成を繰り返し作成する場合があります。このような重複を避けるために、共通の構成を専用のテンプレートに分離できます。次に、他のテンプレートで AWS::CloudFormation::Stack リソースを使用してこれらの専用テンプレートを参照し、ネストされたスタックを作成できます。

たとえば、ほとんどのスタックに使用しているロードバランサー構成があると仮定します。テンプレートに同じ構成をコピーアンドペーストする代わりに、ロードバランサーを対象にした専用テンプレートを作成できます。次に、同じロードバランサー構成を必要とする他のテンプレート内からこのテンプレートを参照できます。

ネストされたスタックには他のネストされたスタックを含めることができるため、次の図に示すようにスタックの階層になっています。ルートスタックは、ネストされたすべてのスタックが最終的に属する最上位スタックです。ネストされたスタックにはそれぞれ、直接の親スタックが存在します。第 1 レベルのネストされたスタックの場合は、ルートスタックにも親スタックが存在します。

  • スタック A は、階層内のネストされたその他すべてのスタックのルートスタックを表します。

  • スタック B から見ると、スタック A は親スタックであると同時にルートスタックでもあります。

  • スタック D から見るとスタック C が親スタック、スタック C から見るとスタック B が親スタックです。

別のスタックの一部として作成されているネストされたスタックには、直接の親スタックと最上位のルートスタックが存在します。

テンプレート分割の前後の例

この例では、単一の大規模な CloudFormation テンプレートを、ネストされたテンプレートを使用するより構造的で再利用可能な設計に再編成する方法を説明します。元の「ネスト前のスタック」テンプレートでは、1 つのファイルにすべてのリソースが定義されているのがわかります。このテンプレートは、リソースの数が増えるにつれて煩雑になり、管理しにくくなる可能性があります。「ネスト後のスタック」テンプレートは、リソースをより小規模な個別のテンプレートに分割しています。ネストされたスタックは、それぞれが関連するリソースの特定のセットを処理するため、構造全体がよりよく整理され、維持しやすくなります。

スタックをネストする前

スタックをネストした後

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 コマンドを使用すると、デプロイの準備を行うのに役立ちます。このコマンドは、ローカルのアーティファクト (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-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

ネストされたスタックでのスタックオペレーションの実行

ネストされたスタックを扱う場合は、操作時に注意が必要です。特定のスタックオペレーション (例: スタックの更新) では、ネストされたスタックから直接実行するのではなく、ルートスタックから起動する必要があります。ルートスタックを更新すると、テンプレートが変更されたネストされたスタックのみが更新されます。

さらに、ネストされたスタックがあると、ルートスタックでのオペレーションに影響する場合があります。たとえば、ネストされたスタックの 1 つが UPDATE_ROLLBACK_IN_PROGRESS 状態でスタックした場合、ルートスタックはそのネストされたスタックがロールバックを完了するまで待機してから続行します。更新オペレーションに進む前に、スタックの更新がロールバックされた場合にキャンセルする IAM アクセス権限があることを確認してください。詳細については、「AWS Identity and Access Management で CloudFormation アクセスを制御する」を参照してください。

ルートスタックとネストされたスタックを検索するには、次の手順を実行します。

ネストされたスタックのルートスタックを表示するには
  1. AWS Management Console にサインインし、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) を開きます。

  2. [スタック] ページで、ルートスタックを表示するネストされたスタックの名前を選択します。

    ネストされたスタックについては、スタック名の上に [NESTED] と表示されます。

  3. [スタック情報] タブの [概要] セクションで、[ルートスタック] としてリストされているスタック名を選択します。

ルートスタックに属するネストされたスタックを表示するには
  1. ネストされたスタックを表示するルートスタックから、[リソース] タブを選択します。

  2. [タイプ] 列で、AWS::CloudFormation::Stack タイプのリソースを探します。