Wie lösche ich eine von Lambda unterstützte benutzerdefinierte Ressource, die in CloudFormation im Status DELETE_FAILED oder im Status DELETE_IN_PROGRESS hängen bleibt?

Lesedauer: 4 Minute
0

Meine von AWS Lambda unterstützte benutzerdefinierte Ressource steckt in AWS CloudFormation im Status DELETE_FAILED oder DELETE_IN_PROGRESS fest. Ich möchte meine benutzerdefinierte Ressource löschen.

Lösung

Wähle je nach Status der Ressource eine der folgenden Lösungen aus.

Eine benutzerdefinierte Ressource löschen, die im Status DELETE\ _FAILED hängen geblieben ist

Du erhältst eine Fehlermeldung, wenn du versuchst, einen Stack mit einer Lambda-gestützten benutzerdefinierten Ressource zu löschen, die nicht über die Logik zur Verarbeitung von Löschanforderungen verfügt. Du kannst auch die folgende Fehlermeldung erhalten, wenn die benutzerdefinierte Ressource eine falsche Löschlogik enthält: „CloudFormation did not receive a response from your Custom Resource. Please check your logs for requestId [652961ca-f24e-42e0-8f74-3f4846ba282d]. If you use the Python cfn-response module, you might need to update your Lambda function code so that CloudFormation can attach the updated version.“

Der Status des Stacks ändert sich in DELETE_FAILED, und dann erhältst du die folgende Fehlermeldung: „Custom Resource failed to stabilize in expected time.“

Gehe wie folgt vor, um den Stack zu löschen:

  1. Öffne die CloudFormation-Konsole.
  2. Wähle den Stack aus, der die benutzerdefinierte Ressource enthält, die im Status DELETE_FAILED hängen geblieben ist.
  3. Wähle Aktionen und dann Stack löschen.
  4. Wähle im Popup-Fenster, das eine Liste der zu beibehaltenden Ressourcen enthält, die benutzerdefinierte Ressource aus, die im Status DELETE_FAILED hängen geblieben ist. Wähle dann Löschen.
  5. Wähle Aktionen und dann Stack löschen.

Der Status des Stacks ändert sich in DELETE_COMPLETE.

**Hinweis:**Deine benutzerdefinierte Ressource ist keine physische Ressource, sodass du deine benutzerdefinierte Ressource nach dem Löschen des Stacks nicht bereinigen musst.

Eine benutzerdefinierte Ressource löschen, die im Status DELETE_IN_PROGRESS hängen geblieben ist

Wenn der Stack eine benutzerdefinierte Ressource löscht und sie im Status DELETE_IN_PROGRESS hängen bleibt, verfügt der Stack möglicherweise nicht über die Logik, um Löschanforderungen zu verarbeiten. Oder der Stack könnte eine falsche Löschlogik enthalten.

Um das Löschen des Stacks zu erzwingen, musst du manuell ein SUCCESS-Signal senden. Das Signal erfordert die Werte ResponseURL und RequestId, die beide im Ereignis enthalten sind, das von CloudFormation an Lambda gesendet wird.

  1. Identifiziere in der CloudFormation-Vorlage den Namen der Lambda-Funktion, an die die benutzerdefinierte Ressource Anforderungen sendet. Du findest den Funktionsnamen in der ServiceToken-Eigenschaft der Ressource AWS::CloudFormation::CustomResource oder Custom::String.

    Zum Beispiel:

    MyCustomResource:
      Type: "Custom::PingTester"
      Properties:
        ServiceToken:
          !Sub |
            arn:aws:lambda:us-east-1:111122223333:function:awsexamplelambdafunction
  2. Öffne die Lambda-Konsole.

  3. Wähle im Navigationsbereich Funktionen und dann die Funktion aus, die du in Schritt 1 identifiziert hast. Beispielsweise ist awsexamplelambdafunction der Funktionsname im vorherigen Codebeispiel.

  4. Stelle sicher, dass die Lambda-Funktion die Ereignisdetails in der Amazon CloudWatch-Protokollgruppe mit dem Namen /aws/lambda/function_name protokolliert.
    Beispiellogik:

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

    Hinweis: Wenn die Lambda-Funktion nicht die Logik zum Drucken des Ereignisses in CloudWatch-Protokollen enthält, kannst du die Werte ResponseURL und RequestId nicht abrufen. Du benötigst diese Werte, um ein manuelles Signal zu senden. Warte etwa eine Stunde, bis der CloudFormation-Stack das Timeout erreicht hat, und wechsle in den Status DELETE_FAILED. Führe dann die Schritte im Abschnitt Eine benutzerdefinierte Ressource löschen, die im Status DELETE_FAILED hängen geblieben ist, um den Stack zu löschen.

  5. Wähle die Registerkarte Überwachung und dann die Option Protokolle in CloudWatch anzeigen aus.

  6. Wähle in der Amazon CloudWatch-Konsole das neueste Protokoll aus.

    Hinweis: Du kannst die CloudWatch-Protokolle nur sehen, wenn die Funktion Zugriff auf Amazon CloudWatch Logs für das Protokoll-Streaming hat.

  7. Identifiziere im neuesten Protokoll das Ereignis, bei dem RequestType auf Löschen gesetzt ist, und kopiere dann die Werte für RequestId, ResponseURL, StackId, LogicalResourceId und PhysicalResourceId. Zum Beispiel:

    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. Um ein SUCCESS-Antwortsignal im Antwortobjekt an die Löschanforderung zu senden, führe den folgenden Befehl in der lokalen Befehlszeilenschnittstelle aus. Stelle sicher, dass du die Werte angibst, die du aus Schritt 7 kopiert hast.

    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"

Der Status deiner benutzerdefinierten Ressourcen ändert sich in den CloudFormation-Stack-Ereignissen in DELETE\ _COMPLETE.

Ähnliche Informationen

Erstellen einer benutzerdefinierten Bereitstellungslogik mit benutzerdefinierten Ressourcen

AWS::CloudFormation::CustomResource

Was sind einige bewährte Methoden für die Implementierung von AWS Lambda-gestützten benutzerdefinierten Ressourcen mit AWS CloudFormation?

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Monaten