
CloudFormationのスタックを間違えて上書きデプロイしちゃったので、対策としてスタックの命名を自動化した
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
先日、既存のCloudFormationスタックを間違えて上書きデプロイしてしまいました。気づいたときには後の祭りです(再デプロイで復旧しました)。
そこで今回は、発生したことの整理と対策を考えてみました。
前提
リポジトリとCloudFormation(AWS SAM)のスタックは次のような関係です。
- AWS SAMのテンプレートファイルを使用していた
- 1つのリポジトリに対して、1つのCloudFormationスタックを作る
発生したこと
単純なミスでした。でも怖い……。
- 新しいリポジトリ
Repository-Xを作成した - 既存リポジトリ
Repository-Aのデプロイコマンドをコピーした - このとき、デプロイコマンドのスタック名が
Repository-A-Stackとなっていた(★修正漏れ) - これに気づかず、新規作成した
Repository-XリポジトリをRepository-A-Stackとしてデプロイしてしまった - 結果として、
Repository-Aのデプロイ内容がRepository-Xで上書きデプロイされてしまった
デプロイコマンド
AWS SAMテンプレートをデプロイするとき、次のようなMakefileを作成し、make deployコマンドを実行しています。
ご覧のとおり、--stack-name Repository-A-Stackと直接指定されていたのを見落としていました。
deploy: sam package \ --output-template-file packaged.yaml \ --s3-bucket any-bucket-name sam deploy \ --template-file packaged.yaml \ --stack-name Repository-A-Stack \ --capabilities CAPABILITY_NAMED_IAM \ --no-fail-on-empty-changeset \ --parameter-overrides xxx=aaa
対策案
デプロイコマンドにスタック名が埋め込まれていたことに気づけませんでした。というわけで、対策方針は2つです。
- スタック名を変数化して分かりやすくする
- スタック名を自動で命名する
スタック名を変数化して分かりやすくする
スタック名の変数をMakefileの先頭に明記することで、気付けるようにしました。
STACK_NAME := Repository-X-Stack deploy: sam package \ --output-template-file packaged.yaml \ --s3-bucket any-bucket-name sam deploy \ --template-file packaged.yaml \ --stack-name $(STACK_NAME) \ --capabilities CAPABILITY_NAMED_IAM \ --no-fail-on-empty-changeset \ --parameter-overrides xxx=aaa
スタック名を自動で命名する
スタック名を「カレントディレクトリ名」にすることで、リポジトリと同じ名前にします。これにより、スタック名を気にすることなくデプロイできます。(リポジトリ名の重複は無いもとのして考えます)
pwdコマンドでカレントディレクトリパスを取得し、basenameでカレントディレクトリ名を取得しています。
deploy: sam package \ --output-template-file packaged.yaml \ --s3-bucket any-bucket-name sam deploy \ --template-file packaged.yaml \ --stack-name $$(basename `pwd`)-Stack \ --capabilities CAPABILITY_NAMED_IAM \ --no-fail-on-empty-changeset \ --parameter-overrides xxx=aaa
さいごに
やらかしたのが開発環境で良かったです。スタック名の自動命名は初めて試しましたが、良い感じではないでしょうか。今後は取り入れてみたいと思います。








