CloudFormationのスタックをCLIで直接更新してみた

CloudFormationのスタックをCLIで直接更新してみた

Clock Icon2024.08.24

こんにちは。中村です。

はじめに

CLIでCloudFormationを実行してスタックを作成した後、テンプレートの更新ってどうするのだったかな?
と、ふと思うことがあったので、備忘録として記録してみました。

https://dev.classmethod.jp/articles/create-ec2-playground/

きっかけはこの記事ですね。
一度スタックを作成して削除し、後日CloudShellからそこに保存してあるテンプレートを用いてスタックを作成してみました。
作成直後、EC2に繋がりませんでした。
理由は私の環境の問題でした。
VPNを利用して接続している都合上、接続元グローバルIPアドレスが変わり、セキュリティグループでIP制限をかけていたため、変更後のIPアドレスからは通信ができなかったのです。

スタックを削除して、パラメータを更新した上で、再度スタックを作成。
という方法も可能ですが、更新の方が早いよね!
ということで更新することにしました。
マネジメントコンソールからだと、スタックを選択してパラメータを変更したのち、更新するだけなのですが。。。
やっぱり、CLIで試してみたいじゃないですか!
当時の私は、CLIでやってみたかったのです。

やってみる

前提条件

  • スタックが作成されていること

やってみた

まず、予備知識がなかったので、少しマニュアルを眺めてみました。

aws cloudformation help

実行してみると、コマンドが多かったので、決めうちで「update」関係があるかを見てみました。

[cloudshell-user@ip-xxx-xxx-xxx-xxx ~]$ aws cloudformation help|grep update
       o cancel-update-stack
       o continue-update-rollback
       o update-generated-template
       o update-stack
       o update-stack-instances
       o update-stack-set
       o update-termination-protection

なんだか、「update-stack」というものが利用できそうですね!

aws cloudformation update-stack help

このコマンドを基にスタックを更新する方針としました。
インターネットに接続できないような環境だと、このままマニュアルを読み込んで、実行するコマンドを作成することもありますが、
自らハードルを上げる必要はないので、公式ドキュメントを参考にしてきます!

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudformation/update-stack.html
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-direct.html

AWS CloudFormation スタックを更新するには (AWS CLI)

ここの部分に記載がありますね!

ふむふむ。
ということで、スタックを更新するコマンドを作成してみました。

aws cloudformation update-stack --stack-name ec2-playground --use-previous-template --parameters ParameterKey=KeyName,UsePreviousValue=true ParameterKey=MyIP,ParameterValue=xxx.xxx.xxx.xxx/32 --capabilities CAPABILITY_NAMED_IAM

オプション名から推測ができる通り、既存のテンプレートを利用してパラメータを更新させます。
変更する必要のないパラメータはUsePreviousValue=trueを設定してあげます。

それでは、実行してみます。

[cloudshell-user@ip-xxx-xxx-xxx-xxx ~]$ aws cloudformation update-stack --stack-name ec2-playground --use-previous-template --parameters ParameterKey=KeyName,UsePreviousValue=true ParameterKey=MyIP,ParameterValue=xxx.xxx.xxx.xxx/32 --capabilities CAPABILITY_NAMED_IAM
{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:<YOUR-ACCOUNT-ID>:stack/ec2-playground/<UUID>"
}

更新できました!
思ったより簡単にできてよかった!

NG集

実は、update-stackコマンドの使い方を調査する前に、簡単に更新できないかなーとなんとなく実行を試してみた失敗例があります。

[cloudshell-user@ip-xxx-xxx-xxx-xxx ~]$ aws cloudformation update-stack --stack-name ec2-playground --use-previous-template --parameters $(cat parameter.txt)

Parameter validation failed:
Unknown parameter in Parameters[0]: "KeyName", must be one of: ParameterKey, ParameterValue, UsePreviousValue, ResolvedValue
Unknown parameter in Parameters[1]: "MyIP", must be one of: ParameterKey, ParameterValue, UsePreviousValue, ResolvedValue

使い捨てEC2環境を構築する際に利用した「parameter.txt」がそのまま利用できたらいいなーと思い実行してみた結果でした。
入力形式が異なっていたので、あっけなくエラーとなりました。

さいごに

CLIはそこで利用できるコマンド名やオプションの名前からある程度は使い方を推測できるので取り組みやすいですね。helpも駆使すると、また違ったコマンドの発見にも繋がって気づきにもなります。

今回は、EC2の使い捨て環境のスタックに対する更新であったため、スタックの直接更新という方法を躊躇なく選択しました。(失敗したら名前の通り捨てたらいいので。)
しかし、本番環境などでスタックを更新する場合は、変更セットを作成して差分を評価するなど、慎重に作業を実施することをオススメします。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.