AWS CloudFormation で DELETE_FAILED ステータスまたは DELETE_IN_PROGRESS ステータスのままになっている AWS Lambda-backed カスタムリソースをトラブルシューティングする方法を教えてください。

最終更新日: 2019 年 11 月 11 日

AWS CloudFormation でカスタムリソースが DELETE_FAILED ステータスまたは DELETE_IN_PROGRESS ステータスのままになっています。カスタムリソースを削除するにはどうしたらよいですか?

簡単な説明

以下のいずれかの解決策を選択してください。

  • DELETE_FAILED ステータスのままになっているカスタムリソースを削除する
  • DELETE_IN_PROGRESS のステータスのままになっているカスタムリソースを削除する

解決方法

DELETE_FAILED ステータスのままになっているカスタムリソースを削除する

AWS Lambda-backed カスタムリソースに Delete リクエストを処理するためのロジックがない場合にスタックを削除しようとすると、「カスタムリソースが予定時間内に安定しませんでした」というエラーメッセージが表示されます。また、スタックのステータスは DELETE_FAILED に変わります。

スタックを削除するには、次の手順に従ってください。

1.    AWS CloudFormation コンソールを開きます。

2.    DELETE_FAILED ステータスのままになっているカスタムリソースを含むスタックを選択します。

3.    [アクション] を選択してから、[スタックの削除] を選択します。

4.    保持するリソースのリストを表示するポップアップウィンドウで、DELETE_FAILED ステータスのままになっているカスタムリソースを選択します。次に [Delete] をクリックします。

5.    [アクション] を選択してから、[スタックの削除] を選択します。

スタックのステータスが DELETE_COMPLETE に変わります。

注 :カスタムリソースは物理的なリソースではないので、スタックを削除した後にカスタムリソースをクリーンアップする必要はありません。

DELETE_IN_PROGRESS のステータスのままになっているカスタムリソースを削除する

DELETE_IN_PROGRESS ステータスのスタックを削除できない場合、スタックに Delete リクエストを処理するためのロジックが欠けている可能性があります。正しいロジックを追加するには、次の手順を実行して、手動で SUCCESS シグナルを AWS CloudFormation に送信する必要があります。

1.    AWS CloudFormation テンプレートで、カスタムリソースがリクエストを送信している Lambda 関数の名前を特定します。関数名は、AWS::CloudFormation::CustomResource または Custom::String リソースの [ServiceToken] プロパティから見つけることができます。次の例を見てください。

MyCustomResource: 
  Type: "Custom::PingTester"
  Properties: 
    ServiceToken:
      !Sub |
        arn:aws:lambda:us-east-1:111122223333:function:awsexamplelambdafunction

2.    Lambda コンソールを開きます。

3.    ナビゲーションウィンドウで、[関数] を選択してから、手順 1 で特定した関数を選択します。たとえば、awsexamplelambdafunction は、上記のコードサンプルの関数名です。

4.    [監視] タブを選択してから、[CloudWatch でログを表示] を選択します。

5.    [Amazon CloudWatch コンソール] で、最新のログを選択します。

注 : 関数がログストリーミングのために Amazon CloudWatch Logs にアクセスできる場合にのみ CloudWatch Logs を表示することができます。

6.    最新のログで、RequestType が Delete であるイベントを識別し、RequestIdResponseURLStackIdLogicalResourceId、および PhysicalResourceId の値をコピーします。次の例を見てください。

Received event: {
  "RequestType": "Delete",
  "ServiceToken": "arn:aws:lambda:us-east-1:111122223333:function:awsexamplelambdafunction",
  "ResponseURL": "https://cloudformation-custom-resource-response-useast1.s3.us-east-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A111122223333%3Astack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2%7CMyCustomResource%7Ce2fc8f5c-0391-4a65-a645-7c695646739?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20170313T0212304Z&X-Amz-SignedHeaders=host&X-Amz-Expires=7200&X-Amz-Credential=QWERTYUIOLASDFGBHNZCV%2F20190415%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=dgvg36bh23mk44nj454bjb54689bg43r8v011uerehiubrjrug5689ghg94hb",
  "StackId": "arn:aws:cloudformation:us-east-1:111122223333:stack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2",
  "RequestId": "e2fc8f5c-0391-4a65-a645-7c695646739",
  "LogicalResourceId": "MyCustomResource",
  "PhysicalResourceId": "test-MyCustomResource-1URTEVUHSKSKDFF",
  "ResourceType": "Custom::PingTester"

7.    ステップ 6 のイベントログ出力を表示するには、Lambda 関数の先頭に次の console.log() 呼び出しを入力します。

exports.handler = function(event, context) {
    console.log("REQUEST RECEIVED:\n" + JSON.stringify(event));
...
}

重要: 上記の出力は、次を含む リクエストオブジェクト を示しています。ResponseURLStackIdPhysicalResourceIdLogicalResourceId、および RequestId。このリクエストオブジェクトは、ステップ 8 で使用します。この出力は、各リクエストで AWS CloudFormation が生成した署名済み ResponseURL を含んでいるために必須です。

8.    応答オブジェクト (Delete リクエストへの) に SUCCESS 応答シグナルを送信するには、ステップ 6 でコピーした値で curl コマンドを実行します。次の例をご参照ください。

$ curl -H 'Content-Type: ''' -X PUT -d '{
    "Status": "SUCCESS",
    "PhysicalResourceId": "test-CloudWatchtrigger-1URTEVUHSKSKDFF",
    "StackId": "arn:aws:cloudformation:us-east-1:111122223333:stack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2
  ",
    "RequestId": "e2fc8f5c-0391-4a65-a645-7c695646739",
    "LogicalResourceId": "CloudWatchtrigger"
  }' 'https://cloudformation-custom-resource-response-useast1.s3.us-east-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A111122223333%3Astack/awsexamplecloudformation/33ad60e0-5f25-11e9-a734-0aa6b80efab2%7CMyCustomResource%7Ce2fc8f5c-0391-4a65-a645-7c695646739?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20170313T0212304Z&X-Amz-SignedHeaders=host&X-Amz-Expires=7200&X-Amz-Credential=QWERTYUIOLASDFGBHNZCV%2F20190415%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=dgvg36bh23mk44nj454bjb54689bg43r8v011uerehiubrjrug5689ghg94hb
  '

カスタムリソースのステータスが DELETE_COMPLETE に変わります。