🪆

AWS CloudFormation スタックの子スタックにリソースを自動インポートする

に公開

隙間記事です。

背景

AWS CloudFormation には自動インポート機能があり,対応リソース[1]について,テンプレートと同名のリソースが存在すれば,スタックに自動でインポートすることができます。

AWS CLI では,aws cloudformation create-change-set コマンド[2]--import-existing-resources オプションを指定することで,テンプレートに含まれるリソースのうち,自動インポートに対応していて同名のリソースが存在するものが,変更セットに Import アクションとして追加されます。

問題

スタックをネストしていて,子スタックにリソースを自動インポートしたい場合,--import-existing-resources を付けても Import アクションとして認識されず,変更セット実行時に新規作成しようとして,リソースが既に存在する旨のエラーになってしまう場合があります。

自動インポートのドキュメントを読むと,ネストスタックではルートスタックから変更セットを作成することが明記されています。実現できそうに思えますが,それ以上は詳しく書かれていません。

一体どうすればよいでしょうか?

解決策

--include-nested-stacks オプションを指定します。

これにより,子スタックの中身のリソースまで変更セットが作成され,そこで自動インポートの判定もされるようになります。

子スタックで自動インポートする場合は,create-change-set コマンドで2個のオプションを指定する必要があります。コマンド例は以下の通りです。

aws cloudformation create-change-set \
  --stack-name my-root-stack \
  --change-set-name CreateChangeSet \
  --change-set-type CREATE \
  --template-body file://my-root-stack.yaml \
  --import-existing-resources \
  --include-nested-stacks
脚注
  1. 対応していないリソースも結構あります。 ↩︎

  2. CreateChangeSet API を使うため,deploy コマンドでは使用できません。 ↩︎

Discussion