CloudFormationのスタックを間違えて上書きデプロイしちゃったので、対策としてスタックの命名を自動化した

先日、既存のCloudFormationスタックを間違えて上書きデプロイしてしまいました。気づいたときには後の祭りです(再デプロイで復旧しました)。

そこで今回は、発生したことの整理と対策を考えてみました。

前提

リポジトリとCloudFormation(AWS SAM)のスタックは次のような関係です。

  • AWS SAMのテンプレートファイルを使用していた
  • 1つのリポジトリに対して、1つのCloudFormationスタックを作る

発生したこと

単純なミスでした。でも怖い……。

  1. 新しいリポジトリRepository-Xを作成した
  2. 既存リポジトリRepository-Aのデプロイコマンドをコピーした
  3. このとき、デプロイコマンドのスタック名がRepository-A-Stackとなっていた(★修正漏れ)
  4. これに気づかず、新規作成したRepository-XリポジトリをRepository-A-Stackとしてデプロイしてしまった
  5. 結果として、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

さいごに

やらかしたのが開発環境で良かったです。スタック名の自動命名は初めて試しましたが、良い感じではないでしょうか。今後は取り入れてみたいと思います。