CloudformationスタックがDELETE_IN_PROGRESSから進まない時の対処法
背景
CloudformationからLambdaを起動していたのですが、そのLambdaがcfnresponseを返さず、スタックがROLLBACK中に手動でDELETEボタンを押してしまいました。
詳細な状況
CloudformationでLambdaを使用するにはカスタムリソースとして使用します
そのLambdaからcfnresponseというCloudformationへLambdaの処理が成功した、失敗したというレスポンスを送る必要があります。
公式ドキュメント
私はドキュメントのPythonのコードをコピペしてLambdaに実装していました。
ただし、Cloudformation実行中にLambdaが正常にレスポンスを送れず(Lambdaの処理で失敗していた)、CloudformationスタックがCREATE_IN_PROGRESSのままになることがあります。
これは、しばらく待ったらLambdaから応答がないことでCloudformationがエラーを出して、ROLLBACKを実行しますが、誤って手動でCloudformationスタックを削除しようとした場合に新しい問題が発生しました。
それは、Lambdaからレスポンスが返ってこずに、CloudformationスタックがDELETEを完了させられない問題です。
このDELETEの処理はLambdaからのレスポンスが来ないと永遠に進まない、でもLambdaはレスポンスを送れないというふんづまった状態です。
対策
公式ブログがありました!
Lambdaのログを見ます
公式のcfnresponse関数を使っていれば、ログにStackId, RequestId, LogicalResourceId,CloudformationのURLが書いてあります。(公式ドキュメントの7,8当たりのステップ)
ここで迷ったのが、PhysicalResourceIdがどこにあるかです。
正解はCloudformationのResourcesにありました。
コンソールから対象のスタックのResourcesを見るとPhysical IDがあるので、このIDをコピーして、curlコマンドをたたきます。
curlのレスポンスは特にありません(何か欲しい・・・)
すると、CloudformationのDELETE処理が完了しました。
体感、最低でも数分はDELETE処理が進まず、ひどい時は1時間後くらいに処理が終わった気がします。
こちらからしたら、進んでいるのかすら分からないのでかなり困りました。
Discussion