前回の記事では、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をコピーしておきます。
マネジメントコンソールにアクセスし、CloudFormationを選択し「スタックの作成」を押下します。

テンプレートソースは「Amazon S3 URL」を選択し、先ほどコピーした親スタックのオブジェクトURLを入力します。
スタック名とパラメータ(先ほどコピーした子スタックのオブジェクトURL)を入力して、「次へ」を押下します。
設定はそのままで、ページ下部の機能欄に表示されているチェックボックスにチェックを入れて、「次へ」を押下します。
設定内容を確認し、「送信」を押下することで、CloudFormationの作成が始まります。
以下画像の左側のスタック欄に、ネストされた と表示されていれば、ネステッドスタックのデプロイが実行されています。
ステータスが「CREATE_COMPLETE」になり、マネジメントコンソールから、VPVに行くと
指定したVPCとサブネットが作成されていました。
子スタック側で以下2つの値も出力されていました。
- VpcId
- PublicSubnetId
スタックを削除する場合、基本的に親スタックを選択して削除するようにしましょう。
7. 削除時の注意点
親スタックを削除すると、ネストされた子スタックも自動削除されます。
ただし以下のような場合、削除処理が止まる場合があります。
| 原因 | 対応方法 |
|---|---|
子テンプレートに DeletionPolicy: Retain が設定されている |
手動削除またはRetain解除 |
| Export/Importの依存関係が残っている | 依存先スタックを先に削除 |
8. まとめ
- ネステッドスタックは、テンプレートを分割・再利用するための機能
- 親スタックと子スタックはS3にアップロードし、親スタックがS3から子スタックを呼び出して構築
-
OutputsとImportValueでスタック間のデータ連携が可能 - スタックの削除時は依存関係に注意
次回予告
次回は、
「VPCスタックを作ってみよう!ネットワーク構成の自動化」
をテーマに、VPC・Subnet・NAT Gatewayなどを実際にCloudFormationで構築します。







