AWS CloudFormtion スタックのステータスをポーリングし、完了(COMPLETE)となったら別のコマンドを自動実行させる小技

2023.11.23

こんにちは、CX 事業本部 Delivery 部の若槻です。

AWS CloudFormtion でデプロイなどによりスタックの更新を行う際に、リソースの依存関係の解決の失敗などによってスタックの更新が失敗し、スタックが ROLLBACK_IN_PROGRESSUPDATE_COMPLETE_CLEANUP_IN_PROGRESS などのステータスとなることがあります。

これらのステータスは CloudFormation による解消が行われ後に自動的に XXXX_COMPLETE ステータスに遷移しますが、それまでに数分から数十分かかる場合があります。その間は当然そのスタックの更新は行えません。

スタックのステータスをポーリングできる wait コマンド

さて、私の場合は CloudFormation スタックの管理は AWS CDK で行うことがほとんどのなのですが、cdk deploy コマンドなどの実行が失敗し、前述のようなステータスとなった際には作業の中断を余儀なくされてしまいます。

そこで活用したいのが、CloudFormation のスタックのステータスをポーリングできる wait コマンドです。このコマンドを使うことにより、XXXX_IN_PROGRESS というステータスの XXXX_COMPLETE への遷移を待機することができます。

wait コマンドには以下のサブコマンドがあり、ステータスの遷移先ごとに使い分けを行います。

  • change-set-create-complete
  • stack-create-complete
  • stack-delete-complete
  • stack-exists
  • stack-import-complete
  • stack-rollback-complete
  • stack-update-complete
  • type-registration-complete

例えば、次のように UPDATE_COMPLETE_CLEANUP_IN_PROGRESS となったスタックのステータスが UPDATE_COMPLETE に遷移したらすぐに再度 cdk deploy コマンドを実行させたいとします。

その場合は wait stack-update-complete コマンドに &&cdk deploy コマンドを繋げることで、UPDATE_COMPLETE に遷移後に自動で cdk deploy コマンドが実行されるようになります。

aws cloudformation wait stack-update-complete --stack-name $STACK_ARN && cdk deploy

試してみると、wait コマンドの後に cdk deploy コマンドが実行されました。

$ aws cloudformation wait stack-update-complete --stack-name $STACK_ARN && cdk deploy --method=direct --require-approval never

✨  Synthesis time: 3.18s

CdkSampleStack: deploying... [1/1]

 ✅  CdkSampleStack (no changes)

✨  Deployment time: 0.52s

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:stack/CdkSampleStack/64865330-32dd-11ee-966b-0ad98d96b631

✨  Total time: 3.7s

これでコーヒーを飲んでいる間にスタックの IN_PROGRESS 状態の解消のチェックと、解消後の別のコマンドの実行を自動化することができ、作業者はコーヒーでも飲みながらゆっくりと待機することができるようになります。

参考