はじめに
AWS CloudFormation(以降、CFn)を使って各種リソースの管理をしています。
その際、既存のCFnスタックAに同じく既存のCFnスタックBをインポートし、スタックBがスタックAの管理下に置かれる状態にできないか気になり、試してみたので簡単に共有します。
前提
今回はAWS CLIを使って試してみます。
なお、スタックBは以下のようなCFnテンプレートで作成済みです。
stack-b.yml
AWSTemplateFormatVersion: '2010-09-09'
Description: Example of child stack.
Parameters:
ParameterValue:
Type: String
Resources:
SsmParameterDummy:
Type: AWS::SSM::Parameter
Properties:
Name: dummy-parameter
Type: String
Value: !Ref ParameterValue
スタックBで作成されているSSMパラメータの名前と値は以下の通り。
名前:dummy-parameter
値:dummy
やってみた
1. スタックAのCFnテンプレートの編集
以下のように、Parametersの中にParameterValueForChildを、Resourcesの中にChildStackを追加します。
stack-a.yml
AWSTemplateFormatVersion: '2010-09-09'
Description: Example of parent stack.
Parameters:
~中略~
ParameterValueForChild:
Type: String
Resources:
~中略~
ChildStack:
Type: AWS::CloudFormation::Stack
DeletionPolicy: Retain
Properties:
TemplateURL: ./stack-b.yml
Parameters:
ParameterValue: !Ref ParameterValueForChild
2. スタックAのCFnテンプレートの変換
aws cloudformation package \
--profile "AWSプロファイル" \
--template-file stack-a.yml \
--s3-bucket "アップロード先S3バケット名" \
--output-template-file packaged-parent.yml
3. 変更セット作成に使用するファイルの作成
- resources-to-import.json:インポート対象スタックの情報が書かれたJSONファイル
[
{
"ResourceType": "AWS::CloudFormation::Stack",
"LogicalResourceId": "ChildStack",
"ResourceIdentifier": {
"StackId": "スタックBのARN"
}
}
]
- parameters.json:変更セット作成時に読み込ませるパラメータJSONファイル
[
{
"ParameterKey": "ParameterValueForChild",
"ParameterValue": "dummy"
},
~中略~
]
※ParameterValueForChildには、スタックBで作成されたSSMパラメータの値である"dummy"を入れること
4. 変更セットの作成と実行
## 変更セット作成
aws cloudformation create-change-set \
--profile "AWSプロファイル" \
--stack-name "スタックAのスタック名" \
--change-set-name import-child-stack \
--template-body file://packaged-parent.yml \
--parameters file://parameters.json \
--resources-to-import file://resources-to-import.json \
--change-set-type IMPORT \
--capabilities CAPABILITY_IAM
# 変更セット実行
aws cloudformation execute-change-set \
--profile "AWSプロファイル" \
--stack-name "スタックAのスタック名" \
--change-set-name import-child-stack
5. スタックAのステータス確認
下記コマンドを実行し、"IMPORT_COMPLETE"と返ってきたらインポート完了です。
aws cloudformation describe-stacks \
--profile "AWSプロファイル" \
--stack-name parent-stack \
--query "Stacks[0].StackStatus"
実際に必要になる機会は多くないかもしれませんが、試してみて勉強になりました。
スタック間のリソース移動、論理IDの変更等を行うことができるスタックリファクタリングといった機能もありますので、別途試してみたいと思います。

