bashのスクリプト内でaws-cliを使ってCloudFormation deployを行っている部分があり、新たにCloudFormation deployのコードを追加したところ、aws-cliのバージョンによって、挙動が異なったので、ソレについて話す。
きっかけ
会社のサービスで使用している年期の入ったCircleCIのビルドスクリプトに、新しくCloudFormation Deployを追加したところ、スタックに変更がなくメッセージ出力されてスクリプトの後続処理が停止した。
No changes to deploy. Stack ExampleStack is up to date
原因
ローカル環境で動作を確認したときのaws-cliバージョンとCircleCIで動いているaws-cli
のバージョンが異なることで、CloudFormation deployの返すスクリプトの終了ステータスコードが異なっていたことで、ローカル環境では発生しなかった問題がCircleCIで発生した。
ローカル環境
- python: v3.9.13
- aws-cli: v2.17.40
CircleCI
- python: v3.6.5
- aws-cli: v1.15.7
aws-cli: v2.17.40
$ aws cloudformation deploy \
--template-file ./deploy \
--stack-name ExampleStack \
--capabilities CAPABILITY_NAMED_IAM
echo $? # 0
v2.17.40では、終了ステータスコードを0の値を返しており、正常終了している。
aws-cli: v1.15.7
$ aws cloudformation deploy \
--template-file ./deploy \
--stack-name ExampleStack \
--capabilities CAPABILITY_NAMED_IAM
echo $? # 255
v1.15.7では、終了ステータスコードを255の値を返しており、これが原因でスクリプトが途中で終了してしまいそれが原因で後続処理が止まっていた。
解決方法
古のCircleCIのビルドスクリプトを修正したくなかったので、何か良い方法はないかと
aws-cliのドキュメントを漁っていたら、--no-fail-on-empty-changeset
をつけることで終了ステータスコードを0にできそうだったのでそれで対応した。
$ aws cloudformation deploy \
--template-file ./deploy \
--stack-name ExampleStack \
--capabilities CAPABILITY_NAMED_IAM \
+ --no-fail-on-empty-changeset
deploy
https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/
--no-fail-on-empty-changeset (boolean) Specify if the CLI should return a non-zero exit code if there are no changes to be made to the stack. The default behavior is to return a non-zero exit code.
まとめ
古のビルドスクリプト化しないようにしっかりCIはメンテナンスしたほうがいい
このビルドスクリプトはどうやらgitの更新履歴を見る限り7年前にfirst commitされていて、そこから秘伝のタレを今日まで作っていたようだ
技術負債をしっかり解消できるように努めていきたい
・・・そういうことに前向きな組織じゃないと難しいけどネ