[小ネタ] AWS CloudFormation Stack の適用漏れをローカルから確認する方法

はじめに

こんにちは 田中孝明 です。

慣れ親しんだモバイルアプリサービス部(通称プリサー)が CX事業本部 に統合され、新しい部署で心機一転...と思いきや、やることはあまり変わってないです...

最近では AWS認定資格 11冠 を目指して Alexa Skill Builder -Speciality の勉強をコツコツとしています...

今回の悩みどころ

自分は現在 28個 の CloudFormation Stack でリソースの管理をしているプロジェクトに関わっています。それぞれの CloudFormation Stack は機能や構成毎に分離されており、基本は他の Stack のリソースを参照しないように構築しています。 いくつかの CloudFormation Stack はリリースフローが走ると自動で適用されるのもあるのですが、一部集中管理しないとならない Stack からリソースを参照しているものがあるため、リリース時に手動で適用している Stack があります。

この 手動で適用する という作業が曲者で、人間の手が介在する以上ミスをする可能性は避けれないです。

こちらが毎週のようにリリースを行なっているため、なるべく人の手を介在させないチェック機構を考える機会がありました。

AWS CLI を使用した確認方法

AWS CloudFormation で管理している Stack に対して、新機能の開発などでリソースに変更が発生すると、 Change Set が作成されます。この Change Set が作成されたかどうかでリリース時に適用が必要かどうかの判断ができます。この状態はAWS CLIのコマンドを組み合わせれば取得できるため、これで判断できるかどうかを見てみましょう。

必要な Stack の抽出

まずは aws cloudformation list-stacks コマンドを使って管理している Stack の一覧を抽出しましょう。

$ aws cloudformation list-stacks --profile hoge-profile | jq -r '.[][].StackName' > list

list ファイルに管理している Stack の一覧が保存されます。

waf-logger-stack
cloudwatch-stack
etl-stack
log-stack
heartbeat-stack
message-notifier-stack
data-analysis-stack
api-stack
lambda-stack
cdn-stack
dynamodb-stack
sns-stack
kms-stack
kinesis-stack
event-history-stack
cognito-stack
cloudtrail-stack
budget-stack
waf-stack
iam-stack
s3-stack

Change Set の存在確認

先ほど作成した list ファイルに保存した Stack に対して aws cloudformation list-change-sets コマンドを使って Change Set の存在確認をしましょう。リソースの変更がある場合は CREATE_COMPLETE になるので、この状態のものを抽出してみます。

#!/bin/sh

while read line
do
  aws cloudformation list-change-sets --profile hoge-profile --stack-name $line | jq '.[][] | select(.Status=="CREATE_COMPLETE")'
done < list

リソースの変更があるもののみが抽出されます。

{
  "StackId": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/event-history-stack-stack/4f2aae40-8a64-11e8-a047-503a6ff78e2a",
  "Status": "CREATE_COMPLETE",
  "ChangeSetName": "awscli-cloudformation-package-deploy-1237778888",
  "Description": "Created by AWS CLI at 2018-08-13T08:57:38.998074 UTC",
  "CreationTime": "2018-08-13T08:57:39.694Z",
  "StackName": "event-history-stack",
  "ExecutionStatus": "AVAILABLE",
  "ChangeSetId": "arn:aws:cloudformation:ap-northeast-1:123456789012:changeSet/awscli-cloudformation-package-deploy-1237778888/7940bda9-b5df-40b6-b194-edbdbd8f880a"
}

さいごに

変更があるものをコマンドラインから確認できるようにするだけでも、リリース時の手作業の負荷は下げられると思います。ただ、一覧で出すだけではあまり効果的とは言えないので、ゆくゆくはCircleCIのワークフローに組み込んで適用漏れを確認できるようにさせたいですね。

(全部自動で適用できるようになるのが一番いいのでしょうが...)

参考文献