如何刪除 CloudFormation 中停留在 DELETE_FAILED 狀態或 DELETE_IN_PROGRESS 狀態的 Lambda 支援的自訂資源?

2 分的閱讀內容
0

我的 AWS Lambda 支援的自訂資源,在 AWS CloudFormation 中停留在 DELETE_FAILED 狀態或 DELETE_IN_PROGRESS 狀態。我想要刪除我的自訂資源。

解決方法

根據資源狀態選擇下列其中一個解決方法。

刪除停留在 DELETE_FAILED 狀態的自訂資源

如果您嘗試使用缺少處理刪除請求邏輯的 Lambda 支援的自訂資源刪除堆疊,則會收到錯誤。如果您的自訂資源包含錯誤的刪除邏輯,您也可能會收到下列錯誤: 「CloudFormation 沒有收到自訂資源的回應。請檢查您的日誌是否有 requestId [652961ca-f24e-42e0-8f74-3f4846ba282d]。如果您使用 Python cfn-response 模組,則可能需要更新 Lambda 函數程式碼,以便 CloudFormation 連接更新版本。」

堆疊的狀態變更為 DELETE\ _FAILED,然後您會收到下列錯誤訊息: 「自訂資源無法在預期時間內穩定。」

若要刪除堆疊,請完成以下步驟:

  1. 開啟 CloudFormation 主控台
  2. 選擇包含停留在 DELETE_FAILED 狀態之自訂資源的堆疊。
  3. 選擇 Actions (動作),然後選擇 Delete Stack (刪除堆疊)。
  4. 在提供待保留資源清單的彈出式視窗中,選擇停留在 DELETE_FAILED 狀態的自訂資源。然後,選擇 Delete (刪除)。
  5. 選擇 Actions (動作),然後選擇 Delete Stack (刪除堆疊)。

堆疊的狀態變更為 DELETE_COMPLETE。

**注意事項:**您的自訂資源不是實體資源,因此刪除堆疊後不必清理自訂資源。

刪除停留在 DELETE_IN_PROGRESS 狀態的自訂資源

當您刪除堆疊自訂資源時,停留在 DELETE_IN_PROGRESS 狀態,則您的堆疊可能缺少處理刪除請求的邏輯。或者,您的堆疊可能包含不正確的刪除邏輯。

如需強制刪除堆疊,您必須手動傳送 SUCCESS 訊號。訊號需要 ResponseURLRequestId 值,兩者都包含在從 CloudFormation 傳送至 Lambda 的事件中。

  1. 在您的 CloudFormation 範本中,識別自訂資源傳送請求的 Lambda 函數名稱。您可以從 AWS::CloudFormation::CustomResourceCustom::String 資源的 ServiceToken 屬性中找到函數名稱。

    例如:

    MyCustomResource:
      Type: "Custom::PingTester"
      Properties:
        ServiceToken:
          !Sub |
            arn:aws:lambda:us-east-1:111122223333:function:awsexamplelambdafunction
  2. 開啟 Lambda 主控台

  3. 在導覽窗格中,選擇 Functions (函數),然後選擇您在步驟 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 狀態。然後,完成前往刪除停留在 DELETE_FAILED 狀態的自訂資源區段中的步驟,以刪除您的堆疊。

  5. 選擇 Monitoring (監控) 索引標籤,然後選擇 View logs in CloudWatch (在 CloudWatch 中檢視日誌)。

  6. Amazon CloudWatch 主控台,選擇最新的日誌。

    **注意事項:**只有當您的函數能夠存取 Amazon CloudWatch Logs 進行日誌串流時,才能看到 CloudWatch 日誌。

  7. 在最新的日誌中,識別 RequestType 設為 Delete 的事件,然後複製 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 官方已更新 1 個月前