記事検索

検索ワードを入力してください。
Sky Tech Blog
【AWS】AWS CloudFormationスタックに​別スタックを​インポートして​ネストに​してみた

【AWS】AWS CloudFormationスタックに​別スタックを​インポートして​ネストに​してみた

AWS CloudFormation(CFn)において、既存のCFnスタックを別の既存スタックにインポートし、親子関係にする方法をAWS CLIを用いて解説します。CFnテンプレートの編集から、インポート用のファイル作成、変更セットの作成・実行、そしてステータス確認まで、具体的な手順をサンプルコード付きで紹介する内容です。

はじめに

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の変更等を行うことができるスタックリファクタリングといった機能もありますので、別途試してみたいと思います。


\シェアをお願いします!/
  • X
  • Facebook
  • LINE
キャリア採用募集中!

入社後にスキルアップを目指す若手の方も、ご自身の経験を幅広いフィールドで生かしたいベテランの方も、お一人おひとりの経験に応じたキャリア採用を行っています。

Sky株式会社のソフトウェア開発や製品、採用に関するお問い合わせについては、下記のリンクをご確認ください。
お問い合わせ
ホーム