CloudFormationスタックを新規作成または更新する際は、 変更セットを事前に作成して、確認したいケースが多いと思います。 この一連の流れを AWS CLI で全て実現しようと思うと、create-change-set および、describe-change-set を使うことになります。
ただ、変更セットの確認(describe-change-set) を ターミナル上で見るには辛く、見やすくするために作り込みが必要です(※)。 できれば変更セットの確認は、マネジメントコンソール上で確認したいです。
そこで今回は「変更セットの作成」までをAWS CLIで実施して、 「変更セットの確認(〜展開)」をマネジメントコンソールで実施する方法を 考えてみます。
※ ちなみに rain というツールを使うと 作り込み無く、変更セットの確認もターミナル上で見やすく実施できます。
- GitHub - aws-cloudformation/rain: A development workflow tool for working with AWS CloudFormation.
- CloudFormationのCLI実行ツール Rain がイケてそうなので紹介したい | DevelopersIO
AWS CLI で変更セットを作成する
変更セットの作成は aws cloudformation create-change-set コマンドで実施します。
以下 3パターン、それぞれでサンプルコマンドを紹介します。
- 新規スタックを作成する前の変更セット
- 既存スタックを更新する前の変更セット(パラメータ更新のみ)
- 既存スタックを更新する前の変更セット(テンプレート更新含む)
新規スタックを展開する前の変更セット
例としてSNSトピックを作成するCFnテンプレートを使って、 スタックを展開していきます。
以下のようなコマンドを実行します。 --change-set-type CREATE
指定が必要です。
### ファイルのパス、スタック名
file_path="./example-sns-topic.yaml"
stack_name="example-sns-topic"
### パラメータ
SNSTopicName="example-sns-topic"
EmailAddress="example@example.com"
### 変更セットの作成
change_set_name="change-set-$(date +%Y%m%d-%H%M%S)"
aws cloudformation create-change-set --output json \
--stack-name "${stack_name}" \
--change-set-name "${change_set_name}" \
--change-set-type "CREATE" \
--template-body "file://${file_path}" \
--parameters \
ParameterKey=SNSTopicName,ParameterValue="${SNSTopicName}" \
ParameterKey=EmailAddress,ParameterValue="${EmailAddress}"
# {
# "Id": "arn:aws:cloudformation:ap-northeast-1:123456789012:changeSet/change-set-20240204-095158/ab6943d1-0a71-4cda-ab40-a5109fa32fb2",
# "StackId": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/example-sns-topic/99d41db0-c2f7-11ee-9619-0ad70eb931c9"
# }
マネジメントコンソール上で "change-set-xxxx" が作成されていることを確認しました。
既存スタックを更新する前の変更セット(パラメータ更新のみ)
既存スタックを更新する際は create-change-set にて --change-set-type UPDATE
を指定します。
パラメータ更新のみの場合は、以下のようなコマンドになります。
### ファイルのパス、スタック名
stack_name="example-sns-topic"
### 更新したいパラメータ
EmailAddress="example-ver2@example.com"
### 変更セットの作成
change_set_name="change-set-$(date +%Y%m%d-%H%M%S)"
aws cloudformation create-change-set --output json \
--stack-name "${stack_name}" \
--change-set-name "${change_set_name}" \
--change-set-type "UPDATE" \
--use-previous-template \
--parameters \
ParameterKey=SNSTopicName,UsePreviousValue=true \
ParameterKey=EmailAddress,ParameterValue="${EmailAddress}"
# {
# "Id": "arn:aws:cloudformation:ap-northeast-1:123456789012:changeSet/change-set-20240204-100114/f4a0d669-5e16-438c-a37d-7ee03c833c99",
# "StackId": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/example-sns-topic/99d41db0-c2f7-11ee-9619-0ad70eb931c9"
# }
こちらも変更セットが確認できましたね。
既存スタックを更新する前の変更セット(テンプレート更新)
最後にテンプレート更新のコマンド例です。 --change-set-type UPDATE
に加えて、 --no-use-previous-template
オプションを指定します。
### ファイルのパス、スタック名
file_path="./example-sns-topic-ver2.yaml"
stack_name="example-sns-topic"
### 変更セットの作成
change_set_name="change-set-$(date +%Y%m%d-%H%M%S)"
aws cloudformation create-change-set --output json \
--stack-name "${stack_name}" \
--change-set-name "${change_set_name}" \
--change-set-type "UPDATE" \
--no-use-previous-template \
--template-body "file://${file_path}" \
--parameters \
ParameterKey=SNSTopicName,UsePreviousValue=true \
ParameterKey=EmailAddress,UsePreviousValue=true
# {
# "Id": "arn:aws:cloudformation:ap-northeast-1:123456789012:changeSet/change-set-20240204-100630/0e92f7ca-53ef-4ba0-af00-27dd7ad96b64",
# "StackId": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/example-sns-topic/99d41db0-c2f7-11ee-9619-0ad70eb931c9"
# }
こちらも同じく変更セット作成を確認できました。
マネジメントコンソールで変更セットを確認する
変更セットURLの形式について
変更セットのURLは以下のような形式です。(見やすくするために改行で区切っています)
https://ap-northeast-1.console.aws.amazon.com/cloudformation/home
?region=ap-northeast-1#/stacks/changesets/changes
?stackId=${スタックIDをURLエンコードしたもの}
&changeSetId=${変更セットIDをURLエンコードしたもの}
スタックIDおよび変更セットIDは以下のような形式です。
- スタックID:
arn:aws:cloudformation:ap-northeast-1:123456789012:stack/example-sns-topic/11aa22bb-1111-2222-3333-0ha1example
- 変更セットID:
arn:aws:cloudformation:ap-northeast-1:123456789012:changeSet/change-set-xxxx/aa11bb22-1111-2222-3333-a510example
URLエンコードする場合、以下変換が必要になります。
:
を%3A
へ変換/
を%2F
へ変換
CLI結果からURLを作成してブラウザへアクセス
create-change-set の返り値に スタックID( StackId
) および 変更セットID( Id
) が含まれます。 それらIDを使ってコマンドラインから マネジメントコンソールへアクセスします。
例えば「新規スタックを作成する前の変更セット」にて、 変更セット作成後にマネジメントコンソールへアクセスするには 以下のようなコマンドを実行します。
### ファイルのパス、スタック名
file_path="./example-sns-topic.yaml"
stack_name="example-sns-topic"
### パラメータ
SNSTopicName="example-sns-topic"
EmailAddress="example@example.com"
### 変更セットの作成
change_set_name="change-set-$(date +%Y%m%d-%H%M%S)"
cli_response=$(aws cloudformation create-change-set --output json \
--stack-name "${stack_name}" \
--change-set-name "${change_set_name}" \
--change-set-type "CREATE" \
--template-body "file://${file_path}" \
--parameters \
ParameterKey=SNSTopicName,ParameterValue="${SNSTopicName}" \
ParameterKey=EmailAddress,ParameterValue="${EmailAddress}")
### マネジメントコンソールで変更セットを確認
# 変更セットIDのURLエンコード
change_set_id_encoded=$(echo "${cli_response}" \
| jq -r ".Id" | sed -e 's/:/%3A/g' | sed -e 's/\//%2F/g')
# スタックIDのURLエンコード
stack_id_encoded=$(echo "${cli_response}" \
| jq -r ".StackId" | sed -e 's/:/%3A/g' | sed -e 's/\//%2F/g')
# コンソールURLを生成
console_url="https://ap-northeast-1.console.aws.amazon.com/cloudformation/home\
?region=ap-northeast-1#/stacks/changesets/changes\
?stackId=${stack_id_encoded}\
&changeSetId=${change_set_id_encoded}"
# コンソールURLをブラウザで開く(macOSの場合 open コマンド)
open "${console_url}"
コードのハイライト部分が主な追記点です。 コンソールURLを create-change-set 結果から組み立てて ブラウザで開きます。
Tips: mac環境であれば、 open "URL"
を使って楽にブラウザを開けます。 (PowerShell の場合は Start-Process "URL"
)
おわりに
以上、変更セットを手早くマネコンで確認するための試みでした。
個人的には rain がイケているので、可能であればこちらを使いたいです。 制約がありrainを活用できない場合は、本記事が参考になるかもしれません。