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

2 分的閱讀內容
0

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

簡短說明

選擇下列其中一種解決方案:

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

解決方案

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

如果您嘗試在 Lambda 支援的自訂資源缺少處理刪除請求的邏輯時刪除堆疊,則會收到錯誤訊息。如果您的自訂資源包含不正確的刪除邏輯,您也可能會收到錯誤訊息。錯誤訊息是: 「自訂資源無法在預期時間內穩定。」 堆疊的狀態會變更為 DELETE_FAILED。

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

1.    開啟 CloudFormation 主控台

2.    選擇包含停留在 DELETE_FAILED 狀態之自訂資源的堆疊。

3.    選擇「動作」,然後選擇「刪除堆疊」。

4.    在提供「待保留資源」清單的彈出式視窗中,選擇停留在 DELETE_FAILED 狀態的自訂資源。然後,選擇「刪除」。

5.    選擇「動作」,然後選擇「刪除堆疊」。

堆疊的狀態會變更為 DELETE_COMPLETE。

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

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

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

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

1.    確認您的 Lambda 函數會記錄事件詳細資料。

如果您的 Lambda 函數不包含將事件列印至日誌的邏輯,則無法取得 ResponseURLRequestId 值。傳送手動訊號時需要這些值。在此情況下,您必須等待大約一個小時,讓 CloudFormation 堆疊逾時,然後進入 DELETE_FAILED 狀態。然後,完成刪除停留在 DELETE_FAILED 狀態的自訂資源區段中的步驟,以刪除您的堆疊。

**注意事項:**如果您的 Lambda 函數中已有下列邏輯,請前往步驟 2。

範例邏輯:

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

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

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

3.    開啟 Lambda 主控台

4.    在導覽窗格中,選擇「函數」,然後選擇您在步驟 1 中識別的函數。例如,awsexamplelambdafunction 是前述程式碼範例中的函數名稱。

5.    選擇「監控」索引標籤,然後選擇「在 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-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。


相關資訊

自訂資源

ServiceToken

使用 AWS CloudFormation 實作 AWS Lambda 支援的自訂資源時有哪些最佳實務?

AWS 官方
AWS 官方已更新 2 年前