CloudFormation で DELETE_FAILED ステータスまたは DELETE_IN_PROGRESS ステータスのままになっている Lambda-backed カスタムリソースを削除するにはどうすればよいですか?

最終更新日: 2021 年 8 月 23 日

AWS Lambda-backed カスタムリソースが、AWS CloudFormation で DELETE_FAILED ステータスまたは DELETE_IN_PROGRESS ステータスのままになっています。カスタムリソースを削除したいと考えています。

簡単な説明

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

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

解決方法

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

Lambda-backed カスタムリソースに削除リクエストを処理するロジックがないときにスタックを削除しようとすると、エラーメッセージが表示されます。カスタムリソースに誤った削除ロジックが含まれている場合にも、エラーが発生することがあります。エラーメッセージは、「カスタムリソースが想定時間内に安定化できませんでした」というものです。 スタックのステータスは DELETE_FAILED に変わります。

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

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

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

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

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

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

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

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

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

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

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

1.    Lambda 関数がイベントの詳細をログに記録することを確認します。

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

注: Lambda 関数に既に次のロジックがある場合は、ステップ 2 に進みます。

ロジックの例:

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

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

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

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

4.    ナビゲーションウィンドウで、[Functions] (関数) を選択してから、ステップ 1 で特定した関数を選択します。例えば、awsexamplelambdafunction は、上記のコードサンプルの関数名です。

5.    [Monitoring] (監視) タブを選択してから、[View logs in CloudWatch] (CloudWatch でログを表示) を選択します。

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

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

7.    最新のログで、RequestTypeDelete に設定されているイベントを識別し、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"

8.    応答オブジェクトの SUCCESS 応答シグナルを削除リクエストに送信するには、次のコマンドを実行します。ステップ 7 でコピーした値を必ず含めてください。

$ 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
  '

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