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.

Kurzbeschreibung

Wählen Sie eine der folgenden Lösungen:

  • Löscht eine benutzerdefinierte Ressource, die im Status DELETE\ _FAILED hängen geblieben ist
  • Löscht eine benutzerdefinierte Ressource, die im Status DELETE\ _IN\ _PROGRESS feststeckt

Behebung

Löscht eine benutzerdefinierte Ressource, die im Status DELETE\ _FAILED hängen geblieben ist

Sie erhalten eine Fehlermeldung, wenn Sie versuchen, einen Stack zu löschen, obwohl Ihrer von Lambda unterstützten benutzerdefinierten Ressource die Logik zur Bearbeitung von Löschanfragen fehlt. Sie können auch eine Fehlermeldung erhalten, wenn Ihre benutzerdefinierte Ressource eine falsche Löschlogik enthält. Die Fehlermeldung lautet: „Custom Resource failed to stabilize in expected time.” (Die benutzerdefinierte Ressource konnte sich nicht in der erwarteten Zeit stabilisieren.) Der Status des Stacks ändert sich in DELETE\ _FAILED.

Gehen Sie wie folgt vor, um Ihren Stack zu löschen:

  1. Öffnen Sie die CloudFormation-Konsole.

  2. Wählen Sie den Stack aus, der Ihre benutzerdefinierte Ressource enthält, die im Status DELETE\ _FAILED hängen bleibt.

  3. Wählen Sie Aktionen und dann Stack löschen.

  4. Wählen Sie in dem Popup-Fenster, das eine Liste der zu behaltenden Ressourcen enthält, die benutzerdefinierte Ressource aus, die im Status DELETE\ _FAILED hängen bleibt. Wählen Sie dann Löschen.

  5. Wählen Sie Aktionen und dann Stack löschen.

Der Status Ihres Stacks ändert sich in DELETE\ _COMPLETE.

**Hinweis:**Ihre benutzerdefinierte Ressource ist keine physische Ressource, sodass Sie Ihre benutzerdefinierte Ressource nach dem Löschen des Stacks nicht bereinigen müssen.

Löscht eine benutzerdefinierte Ressource, die im Status DELETE\ _IN\ _PROGRESS feststeckt

Wenn Ihr Stack beim Löschen einer benutzerdefinierten Ressource im Status DELETE\ _IN\ _PROGRESS hängen bleibt, fehlt Ihrem Stack möglicherweise die Logik zur Bearbeitung von Löschanfragen. Oder Ihr Stack könnte eine falsche Löschlogik enthalten.

Um das Löschen des Stacks zu erzwingen, müssen Sie manuell ein ERFOLGSsignal senden. Das Signal erfordert die Werte responseUrl und requestId, die beide in dem Ereignis enthalten sind, das von CloudFormation an Lambda gesendet wird.

  1. Vergewissern Sie sich, dass Ihre Lambda-Funktion die Ereignisdetails protokolliert.

Wenn Ihre Lambda-Funktion nicht die Logik zum Ausdrucken des Ereignisses in Protokollen enthält, können Sie die Werte responseUrl und requestId nicht abrufen. Diese Werte sind erforderlich, um ein manuelles Signal zu senden. In diesem Fall müssen Sie ungefähr eine Stunde warten, bis der CloudFormation-Stack ein Timeout erreicht hat und in den Status DELETE\ _FAILED übergeht. Führen Sie dann die Schritte im Abschnitt Löschen einer benutzerdefinierten Ressource aus, die im Statusabschnitt DELETE\ _FAILED hängen geblieben ist, um Ihren Stack zu löschen.

**Hinweis:**Wenn Ihre Lambda-Funktion bereits über die folgende Logik verfügt, fahren Sie mit Schritt 2 fort.

Beispiellogik:

exports.handler = function(event, context) {
    console.log("REQUEST RECEIVED:\n" + JSON.stringify(event));
...
}
  1. Identifizieren Sie in Ihrer CloudFormation-Vorlage den Namen der Lambda-Funktion, an die Ihre benutzerdefinierte Ressource Anfragen sendet. Sie finden 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

3.    Öffnen Sie die Lambda-Konsole.

  1. Wählen Sie im Navigationsbereich Funktionen und dann die Funktion aus, die Sie in Schritt 1 identifiziert haben. Beispielsweise ist awsexamplelambdafunction der Funktionsname im vorherigen Codebeispiel.

  2. Wählen Sie den Tab Monitoring und dann die Option Logs in CloudWatch anzeigen aus.

  3. Wählen Sie in der Amazon CloudWatch-Konsole das neueste Protokoll aus.

**Hinweis:**Sie können die CloudWatch-Logs nur sehen, wenn Ihre Funktion Zugriff auf Amazon CloudWatch Logs für das Log-Streaming hat.

  1. Identifizieren Sie im neuesten Protokoll das Ereignis, bei dem RequestType auf Delete gesetzt ist, und kopieren Sie 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"
  1. Um ein SUCCESS-Antwortsignal im Antwortobjekt an die Löschanforderung zu senden, führen Sie den folgenden Befehl in Ihrer lokalen Befehlszeilenschnittstelle aus. Stellen Sie sicher, dass Sie die Werte angeben, die Sie aus Schritt 7 kopiert haben.
$ 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
  '

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


Ähnliche Informationen

Benutzerdefinierte Ressourcen

Service-Token

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