CloudFormation でステータスが DELETE_FAILED または DELETE_IN_PROGRESS で止まっている Lambda ベースのカスタムリソースを削除する方法を教えてください。

所要時間2分
0

AWS CloudFormation で、Lambda ベースのカスタムリソースが DELETE_FAILED ステータスまたは DELETE_IN_PROGRESS ステータスで止まっています。カスタムリソースを削除したいです。

解決策

リソースの状態に応じて、次の解決策のいずれかを選択してください。

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

削除リクエストを処理するロジックがない Lambda ベースのカスタムリソースでスタックを削除しようとすると、エラーメッセージが表示されます。カスタムリソースに誤った削除ロジックが含まれている場合も、次のエラーメッセージが表示される場合があります。 "CloudFormation はカスタムリソースからの応答を受信しませんでした。ログで requestId [652961ca-f24e-42e0-8f74-3f4846ba282d] を確認してください。Python cfn-response モジュールを使用する場合、CloudFormation が更新されたバージョンをアタッチできるように Lambda 関数コードを更新する必要がある場合があります。"

スタックのステータスが DELETE_FAILED に変わり、次のエラーメッセージが表示されます。 "カスタムリソースを想定時間内に安定化できませんでした。"

スタックを削除するには、次の手順を実行します。

  1. CloudFormation コンソールを開きます。
  2. DELETE_FAILED ステータスのままになっているカスタムリソースを含むスタックを選択します。
  3. [アクション] を選択し、[スタックを削除] を選択します。
  4. 保持するリソースのリストが表示されたポップアップウィンドウで、DELETE_FAILED ステータスのままになっているカスタムリソースを選択します。次に、[削除] を選択します。
  5. [アクション] を選択し、[スタックを削除] を選択します。

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

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

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

スタックがカスタムリソースを削除すると DELETE_IN_PROGRESS ステータスから進まなくなった場合、そのスタックに削除リクエストを処理するロジックがない可能性があります。または、スタックに誤った削除ロジックが含まれている可能性があります。

スタックを強制的に削除するには、SUCCESS シグナルを手動で送信する必要があります。シグナルには、CloudFormation から Lambda に送信されるイベントに含まれている ResponseURL 値と RequestId 値が必要です。

  1. 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. Lambda 関数が、イベントの詳細を /aws/lambda/function_name という Amazon CloudWatch ロググループに記録していることを確認します。
    ロジックの例:

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

    注: Lambda 関数にイベントを CloudWatch ログに出力するロジックが含まれていない場合、 ResponseURLRequestId の値を取得することはできません。手動でシグナルを送信するには、これらの値が必要です。CloudFormation スタックがタイムアウトし、DELETE_FAILED 状態に移行するまで約 1 時間待機します。その後、「DELETE_FAILED ステータスで止まっているカスタムリソースを削除する」セクションの手順を実行してスタックを削除します。

  5. [モニタリング] タブを選択し、[CloudWatch でログを表示] を選択します。

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

    注: 関数がログストリーム用の Amazon CloudWatch Logs にアクセスできる場合のみ、CloudWatch ログが表示されます。

  7. 最新のログ内の RequestTypeDelete に設定されているイベントを特定し、RequestIdResponseURLStackIdLogicalResourceIdPhysicalResourceId の値をコピーします。例を次に示します。

    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"
  8. 応答オブジェクトの SUCCESS 応答シグナルを削除リクエストに送信するには、ローカルのコマンドラインインターフェイスで次のコマンドを実行します。ステップ 7 でコピーした値を含める必要があります。

    curl -H "Content-Type: ''" -X PUT -d "{\"Status\": \"SUCCESS\",\"PhysicalResourceId\": \"test-CloudWatchtrigger-1URTEVUHSKSKDFF\",\"StackId\": \"arn:aws:cloudformation:us-west-2:111122223333:stack/CRStack/5105e4b0-4a29-11ef-8c42-067744df1edb\",\"RequestId\": \"dca731ad-18ad-496c-8c77-459d904fd36b\",\"LogicalResourceId\": \"MyCustomResource\"}" "https://cloudformation-custom-resource-response-uswest2.s3-us-west-2.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-west-2%3A111122223333%3Astack/CRStack/5105e4b0-4a29-11ef-8c42-067744df1edb%7CCustomResource%7Cdca731ad-18ad-496c-8c77-459d904fd36b?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20240725T020141Z&X-Amz-SignedHeaders=host&X-Amz-Expires=7200&X-Amz-Credential=AKIA54RCMT6SJPHCTM4H%2F20240725%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Signature=3b1567adb5ec9415526251a26bac3a6c861ac77aa090a3ada0a4a4d109a7273d"

CloudFormation スタックイベントで、カスタムリソースのステータスが DELETE_COMPLETE に変わります。

関連情報

カスタムリソースを使用してカスタムプロビジョニングロジックを作成する

AWS::CloudFormation::CustomResource

AWS CloudFormation を使用して AWS Lambda ベースのカスタムリソースを実装するうえでのベストプラクティスを教えてください

AWS公式
AWS公式更新しました 5ヶ月前
コメントはありません