0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【実践編】ネステッドスタックでテンプレートを分割管理してみよう

Last updated at Posted at 2025-11-04

前回の記事では、CloudFormationテンプレートの基本構造(Parameters、Resources、Outputsなど)を解説しました。

実際の環境構築では、1枚のテンプレートにすべてのリソースを書くと、
管理・修正・再利用の面でどんどん非効率になっていきます。

そこで登場するのが ネステッドスタック(Nested Stack)。
今回は、親スタックと子スタックの関係、そして Outputs / ImportValue を使った
スタック間データ連携の仕組みをわかりやすく整理します。

1. ネステッドスタックとは?

ネステッドスタックは、複数のテンプレートを組み合わせて管理するための仕組みです。
親スタック(Root Stack)が子スタック(Nested Stack)を呼び出し、
それぞれの責務を分離した構成を取ります。

構成イメージ

RootStack(親)
├── NetworkStack(VPC, Subnet, IGWなど)
├── SecurityStack(SG, NACLなど)
└── AppStack(EC2, ECSなど)

こうすることで、以下のメリットが得られます。

  • 各スタックを独立して管理可能
  • 再利用しやすいテンプレート構成を実現
  • 修正や検証の影響範囲を限定

2. ディレクトリ構成例

cfn/
├── root.yaml
└── network/
    └── network.yaml

3. 親テンプレート(root.yaml)

親スタックは、S3上に配置した子テンプレートを呼び出して構築します。

AWSTemplateFormatVersion: "2010-09-09"
Description: Root stack for infrastructure

Parameters:
  Environment:
    Type: String
    AllowedValues: [dev, stg, prod]
  SystemCode:
    Type: String
    Default: myapp
  TemplateURL:
    Type: String
    Description: Wirte S3 URL
  TemplateURL:
    Type: String
    Description: Wirte S3 URL

Resources:
  NetworkStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Ref TemplateURL
      Parameters:
        SystemCode: !Ref SystemCode
        Environment: !Ref Environment

★ポイント

  • AWS::CloudFormation::Stack 型で子テンプレートを呼び出す
  • TemplateURL にS3上のYAMLを指定
  • Parameters で親から子へ値を引き渡せる

4. 子テンプレート(network.yaml)

子スタックでは、実際のリソース(例:VPCやSubnet)を定義します。
親との連携を考慮して、Outputs セクションを必ず用意しましょう。

AWSTemplateFormatVersion: "2010-09-09"
Description: Network stack (VPC + PublicSubnet)

Parameters:
  SystemCode:
    Type: String
  Environment:
    Type: String

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      Tags:
        - Key: Name
          Value: !Sub "${SystemCode}-${Environment}-vpc"

  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: 10.0.1.0/24
      VpcId: !Ref VPC
      AvailabilityZone: !Select [0, !GetAZs ""]
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: !Sub "${SystemCode}-${Environment}-public-subnet"

Outputs:
  VpcId:
    Value: !Ref VPC
    Export:
      Name: !Sub "${SystemCode}-${Environment}-VpcId"

  PublicSubnetId:
    Value: !Ref PublicSubnet
    Export:
      Name: !Sub "${SystemCode}-${Environment}-PublicSubnetId"

5. スタック間のデータ連携(Outputs / ImportValue)

CloudFormationでは、あるスタックの出力値(Outputs)を
別スタックで !ImportValue 関数を使って再利用できます。

例:AppスタックでVPC情報を参照する場合

Parameters:
  VpcId:
    Type: String
    Default: !ImportValue myapp-dev-VpcId

これにより、NetworkStackが出力したVPC IDを再利用できるようになります。
アプリケーション層とネットワーク層を疎結合に保てるのが大きな利点です。

6. デプロイ手順(手動)

では、実際に作成したCloudFormationをマネジメントコンソールからデプロイしてみましょう。

事前準備として、前回作成したS3バケットを作成するCloudFormationテンプレートを活用して、親子スタックをアップロードするS3バケットを作成します。

詳細については前回の記事を参照してください。


マネジメントコンソールにアクセスし、S3を選択し対象のバケットに先ほど作成した以下のファイルをアップロードします。

  • root.yaml
  • network.yaml

親子テンプレートそれぞれのオブジェクトURLをコピーしておきます。

image.png


マネジメントコンソールにアクセスし、CloudFormationを選択し「スタックの作成」を押下します。
image.png


テンプレートソースは「Amazon S3 URL」を選択し、先ほどコピーした親スタックのオブジェクトURLを入力します。

image.png


スタック名とパラメータ(先ほどコピーした子スタックのオブジェクトURL)を入力して、「次へ」を押下します。

image.png


設定はそのままで、ページ下部の機能欄に表示されているチェックボックスにチェックを入れて、「次へ」を押下します。

image.png


設定内容を確認し、「送信」を押下することで、CloudFormationの作成が始まります。

以下画像の左側のスタック欄に、ネストされた と表示されていれば、ネステッドスタックのデプロイが実行されています。

image.png


ステータスが「CREATE_COMPLETE」になり、マネジメントコンソールから、VPVに行くと
指定したVPCとサブネットが作成されていました。

image.png

子スタック側で以下2つの値も出力されていました。

  • VpcId
  • PublicSubnetId

image.png


スタックを削除する場合、基本的に親スタックを選択して削除するようにしましょう。

image.png

7. 削除時の注意点

親スタックを削除すると、ネストされた子スタックも自動削除されます。
ただし以下のような場合、削除処理が止まる場合があります。

原因 対応方法
子テンプレートに DeletionPolicy: Retain が設定されている 手動削除またはRetain解除
Export/Importの依存関係が残っている 依存先スタックを先に削除

8. まとめ

  • ネステッドスタックは、テンプレートを分割・再利用するための機能
  • 親スタックと子スタックはS3にアップロードし、親スタックがS3から子スタックを呼び出して構築
  • OutputsImportValue でスタック間のデータ連携が可能
  • スタックの削除時は依存関係に注意

次回予告

次回は、

「VPCスタックを作ってみよう!ネットワーク構成の自動化」

をテーマに、VPC・Subnet・NAT Gatewayなどを実際にCloudFormationで構築します。

📚参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?