📝

[小ネタ] CloudFormation のネストされたスタックを直接更新する方法は非推奨である

に公開

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

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

上記仕様についてです。

ネストされたスタックとは

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

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

1 つのテンプレートの肥大化を防ぐためにテンプレートを分割し、親テンプレートから子テンプレートを呼び出すような方法です。

以下は簡単なテンプレート例です。

親テンプレート
AWSTemplateFormatVersion: "2010-09-09"
Description: "Parent template - Demonstrates nested stacks"

Resources:
  ChildStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: "<子テンプレートの S3 の URL>"
      TimeoutInMinutes: 10
子テンプレート
AWSTemplateFormatVersion: "2010-09-09"
Resources:
  FirstVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16

手順としては子テンプレートを任意の S3 バケットにアップロードし、子テンプレートの S3 の URL を親テンプレートで指定します。
この状態で親テンプレートを CloudFormation でデプロイすると、親テンプレートで指定した S3 の URL の子テンプレートも自動的にネストされたスタックとしてデプロイされます。

上記テンプレートでデプロイすると、以下のようにネストされたスタックが作成されることが確認できます。

ネストされたスタックの更新について

冒頭に記載した通りネストされたスタックを直接更新する方法は非推奨です。
ただし、ネストされたスタックを直接更新することは可能です。

しかし、非推奨の方法であるため AWS サポートから指示があった場合などに限って実施するほうが安全だと思われます。

以下のような検証を実施した限りではエラーが発生することはありませんでしたが、動作の保証ができないと思われるので参考程度にご覧ください。

  1. 上記テンプレートで親スタックをデプロイ
  2. 子テンプレートを変更してネストされたスタックを直接更新
  3. 子テンプレートを再度変更して S3 バケットにアップロード
  4. 親スタックのテンプレートで 3 の子テンプレートの URL を指定して親スタックを更新
  5. 親スタック、ネストされたスタックともに更新が完了することを確認

まとめ

今回は CloudFormation のネストされたスタックを直接更新する方法は非推奨であるという小ネタを紹介しました。
どなたかの参考になれば幸いです。

参考資料

Discussion