カスタムリソースが原因でCloudFormationスタックの処理が完了しない場合の対処方法

2022.01.12

いわさです。

先日以下の記事でCloudFormationのカスタムリソースを使ってテンプレートを作成したのですが、試行錯誤の過程でスタックを操作できなくなる状態が発生しました。

具体的には、カスタムリソースの作成に失敗したためスタックをロールバック操作したのですが、カスタムリソースのロールバック中にエラーハンドリングに失敗してスタックへシグナル送信出来ない状態となってしまい、カスタムリソースのステータスがDELETE_IN_PROGRESSのまま戻せなくなりました。

そうすると、スタック自体のステータスもUPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESSになってしまい、キャンセルやロールバック操作を受け付けなくなります。

この状態になるとスタック操作のタイムアウトを待つしかなさそうですが、実は強制的にカスタムリソースのステータスを更新することが出来ましたのでその方法を紹介します。

強制的にカスタムリソースの完了シグナルを送信する

横田 あかりさんの以下の記事では、curlコマンドでカスタムリソースプロバイダーのレスポンス相当のメッセージを手動で送信しています。

今回はこちらを参考に、先程失敗したカスタムリソースの成功シグナルを手動で送信することで解決しました。

リクエストに必要な情報を取得する

カスタムリソースのLambda権限が正しく付与されていればCloudWatch Logsに削除オペレーション時のイベントが出力されていると思います。

必要な情報は、PhysicalResourceIdStackIdRequestIdLogicalResourceIdそしてエンドポイント(ResponseURL)です。

{
    "RequestType": "Delete",
    "ServiceToken": "arn:aws:lambda:ap-northeast-1:123456789012:function:amb-stack-ManagedBlockchainVpcEndpointLambda-OwtwNbsylAmm",
    "ResponseURL": "https://cloudformation-custom-resource-response-apnortheast1.s3-ap-northeast-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aap-northeast-1%3A123456789012%3Astack/amb-stack/0207c950-6f34-11ec-91bd-064a048f128d%7CManagedBlockchainVpcEndpoint%7C46944558-0fb8-4d08-8bc0-97f364db5586
    "StackId": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/amb-stack/0207c950-6f34-11ec-91bd-064a048f128d",
    "RequestId": "46944558-0fb8-4d08-8bc0-97f364db5586",
    "LogicalResourceId": "ManagedBlockchainVpcEndpoint",
    "PhysicalResourceId": "amb-stack-ManagedBlockchainVpcEndpoint-1743680CK41PB",
    "ResourceType": "AWS::CloudFormation::CustomResource",
    "ResourceProperties": {
        "ServiceToken": "arn:aws:lambda:ap-northeast-1:123456789012:function:amb-stack-ManagedBlockchainVpcEndpointLambda-OwtwNbsylAmm",
        "VpcId": "vpc-05a0afdde14b86481",
        "NetworkId": "n-CLXLSES5ENFATN2TY2TIEHNF6M",
        "SubnetIds": [
            "subnet-0d0bbe7005410c56d"
        ],
        "SecurityGroupIds": [
            "sg-0bbf9b68416d51fd2"
        ]
    }
}

リクエストを送信する

同じようにcurlを使ってリクエストを送信します。

iwasa.takahito@hoge ~ % curl -H 'Content-Type: ''' -X PUT -d '{
    "Status": "SUCCESS",
    "PhysicalResourceId": "amb-stack-ManagedBlockchainVpcEndpoint-1743680CK41PB",
    "StackId": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/amb-stack/0207c950-6f34-11ec-91bd-064a048f128d",
    "RequestId": "46944558-0fb8-4d08-8bc0-97f364db5586",
    "LogicalResourceId": "ManagedBlockchainVpcEndpoint"
  }' 'https://cloudformation-custom-resource-response-apnortheast1.s3-ap-northeast-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aap-northeast-1%3A123456789012%3Astack/amb-stack/0207c950-6f34-11ec-91bd-064a048f128d%7CManagedBlockchainVpcEndpoint%7C46944558-0fb8-4d08-8bc0-97f364db5586

送信後、カスタムリソースのステータスがDELETE_COMPLETEに変わりました。

そしてスタックのステータスも無事UPDATE_ROLLBACK_COMPLETEに変わりましたね。

ちなみに、AWSリソース(このカスタムリソースだとVPCエンドポイント)の削除にも失敗していますので、そちらはマネジメントコンソールから手動で削除しています。

さいごに

本日はカスタムリソースが原因でステータス更新ができなくなった場合の対処方法のひとつを紹介しました。
同様の事象でお困りの方の参考になれば幸いです。

参考