🐒

CloudformationスタックがDELETE_IN_PROGRESSから進まない時の対処法

2021/12/09に公開

背景

CloudformationからLambdaを起動していたのですが、そのLambdaがcfnresponseを返さず、スタックがROLLBACK中に手動でDELETEボタンを押してしまいました。

詳細な状況

CloudformationでLambdaを使用するにはカスタムリソースとして使用します

そのLambdaからcfnresponseというCloudformationへLambdaの処理が成功した、失敗したというレスポンスを送る必要があります。
公式ドキュメント
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-lambda-function-code-cfnresponsemodule.html

私はドキュメントのPythonのコードをコピペしてLambdaに実装していました。

ただし、Cloudformation実行中にLambdaが正常にレスポンスを送れず(Lambdaの処理で失敗していた)、CloudformationスタックがCREATE_IN_PROGRESSのままになることがあります。

これは、しばらく待ったらLambdaから応答がないことでCloudformationがエラーを出して、ROLLBACKを実行しますが、誤って手動でCloudformationスタックを削除しようとした場合に新しい問題が発生しました。

それは、Lambdaからレスポンスが返ってこずに、CloudformationスタックがDELETEを完了させられない問題です。
このDELETEの処理はLambdaからのレスポンスが来ないと永遠に進まない、でもLambdaはレスポンスを送れないというふんづまった状態です。

対策

公式ブログがありました!
https://aws.amazon.com/jp/premiumsupport/knowledge-center/cloudformation-lambda-resource-delete/

Lambdaのログを見ます
公式のcfnresponse関数を使っていれば、ログにStackId, RequestId, LogicalResourceId,CloudformationのURLが書いてあります。(公式ドキュメントの7,8当たりのステップ)
ここで迷ったのが、PhysicalResourceIdがどこにあるかです。
正解はCloudformationのResourcesにありました。
コンソールから対象のスタックのResourcesを見るとPhysical IDがあるので、このIDをコピーして、curlコマンドをたたきます。
curlのレスポンスは特にありません(何か欲しい・・・)

すると、CloudformationのDELETE処理が完了しました。

体感、最低でも数分はDELETE処理が進まず、ひどい時は1時間後くらいに処理が終わった気がします。
こちらからしたら、進んでいるのかすら分からないのでかなり困りました。

Discussion