Bearbeiten von Fehlern in serverlosen Anwendungen

mit AWS Step Functions und AWS Lambda

In diesem Tutorial erfahren Sie, wie Sie mit AWS Step Functions Workflow-Laufzeitfehler behandeln. AWS Step Functions ist ein serverloser Orchestrierungsdienst, mit dem Sie problemlos mehrere Lambda-Funktionen zu flexiblen Workflows koordinieren können, die leicht zu debuggen und leicht zu ändern sind. AWS Lambda ist ein Rechenservice, mit dem Sie Code ausführen können, ohne Server bereitstellen und verwalten zu müssen. 

Lambda-Funktionen können gelegentlich fehlschlagen, z. B. wenn eine nicht behandelte Ausnahme ausgelöst wird, wenn sie länger als das konfigurierte Zeitlimit ausgeführt werden oder wenn ihnen der Speicher ausgeht. Das Schreiben und Verwalten der Fehlerbehandlungslogik in jeder Ihrer Lambda-Funktionen zur Behandlung von Situationen wie API-Einschränkung oder Socket-Timeouts kann zeitintensiv und kompliziert sein – insbesondere bei verteilten Anwendungen. Durch das Einbetten dieses Codes in jede Lambda-Funktion entstehen Abhängigkeiten zwischen ihnen. Es kann schwierig sein, alle diese Verbindungen aufrechtzuerhalten, wenn in der Zukunft Änderungen auftreten.

Um dies zu vermeiden und die Menge des von Ihnen geschriebenen Fehlerbehandlungscodes zu verringern, können Sie mit AWS Step Functions einen serverlosen Workflow erstellen, der die Behandlung von Funktionsfehlern unterstützt. Sie können Step Functions so konfigurieren, dass es mit bedingter Logik basierend auf der Art des aufgetretenen Fehlers reagiert. Dabei ist unwichtig, ob der Fehler eine vom Entwickler erstellte Funktionsausnahme (z. B. Datei nicht gefunden) oder unvorhergesehen ist (z. B. Platz im Hauptspeicher reicht nicht aus.). Indem Sie auf diese Weise Ihre Workflow-Logik von Ihrer Geschäftslogik trennen, können Sie modifizieren, wie Ihr Workflow auf Fehler reagiert, ohne die Geschäftslogik Ihrer Lambda-Funktionen zu ändern.

In diesem Tutorial entwerfen und führen Sie einen serverlosen Workflow mit AWS Step Functions aus, mit denen diese Fehler ordnungsgemäß behandelt werden. Sie werden eine AWS Lambda-Funktion erstellen, die Aufrufe an eine RESTful-API nachahmt und verschiedene Antwortcodes und Ausnahmen zurückgibt. Anschließend verwenden Sie AWS Step Functions, um eine Zustandsmaschine mit Retry- und Catch-Funktionen zu erstellen, die abhängig von der ausgelösten Ausnahme mit unterschiedlicher Logik reagiert.

Für dieses Tutorial ist ein AWS-Konto erforderlich

Für AWS Step Functions oder AWS Lambda fallen keine zusätzlichen Kosten an. Die in diesem Tutorial erstellten Ressourcen können im Rahmen des kostenlosen Kontingents genutzt werden. 

Weitere Informationen zum kostenlosen Kontingent >>


Schritt 1. Erstellen einer Lambda-Funktion, um eine API nachzuahmen

In diesem Schritt erstellen Sie eine Lambda-Funktion, die einige grundlegende API-Interaktionen nachahmt. Die Lambda-Funktion löst Ausnahmen aus, um Antworten von einer fiktiven API zu simulieren. Diese sind vom Fehlercode abhängig, den Sie im Ereignisparameter eingeben.


a.  Öffnen Sie die AWS-Managementkonsole, dann können Sie diese schrittweise Anleitung nebenher geöffnet lassen. Wenn der Bildschirm vollständig geladen ist, geben Sie Ihren Benutzernamen und das Passwort ein, um zu beginnen. Geben Sie anschließend Lambda in die Suchleiste ein und wählen Sie Lambda, um die Servicekonsole zu öffnen.

(zum Vergrößern klicken)


b. Wählen Sie Eine Funktion erstellen aus.

(zum Vergrößern klicken)


c. Lassen Sie Von Grund auf neu verfassen ausgewählt. Konfigurieren Sie als nächstes die Lambda-Funktion wie folgt:

Geben Sie als Name MockAPIFunction ein.
Wählen Sie bei Laufzeit die Option Python 3.6 aus.
Wählen Sie unter Rolle die Option Benutzerdefinierte Rolle erstellen aus.

Ein neues IAM-Fenster wird geöffnet. Belassen Sie den Rollennamen als lambda_basic_execution und klicken Sie auf Zulassen. Sie kehren automatisch zur Lambda-Konsole zurück.

Klicken Sie auf Create function (Funktion erstellen).

(zum Vergrößern klicken)


d. Scrollen Sie auf dem MockAPIFunction-Bildschirm nach unten zum Abschnitt Funktionscode. In diesem Tutorial erstellen Sie eine Funktion, die das Programmiermodell zum Erstellen von Lambda-Funktionen in Python verwendet. Ersetzen Sie im Codefenster den gesamten Code durch den folgenden und wählen Sie anschließend Speichern.

class TooManyRequestsException(Exception): pass
class ServerUnavailableException(Exception): pass
class UnknownException(Exception): pass

def lambda_handler(event, context):
    statuscode = event["statuscode"]    
    if statuscode == "429":
        raise TooManyRequestsException('429 Too Many Requests')
    elif statuscode == "503":
        raise ServerUnavailableException('503 Server Unavailable')
    elif statuscode == "200":
        return '200 OK'
    else:
        raise UnknownException('Unknown error')

(zum Vergrößern klicken)


e. Scrollen Sie nach dem Erstellen Ihrer Lambda-Funktion zum oberen Rand des Fensters und notieren Sie sich den Amazon Resource Name (ARN) in der oberen rechten Ecke der Seite. Amazon Resource Names (ARNs) identifizieren AWS-Ressourcen eindeutig und helfen Ihnen, AWS-Elemente und -Richtlinien für AWS-Services und API-Aufrufe zu verfolgen und zu verwenden. Wir benötigen eine ARN, wenn Sie in Step Functions auf eine bestimmte Ressource verweisen müssen.

(zum Vergrößern klicken)


Schritt 2. Erstellen einer AWS Identity and Access Management (IAM)-Rolle

AWS Step Functions kann Code ausführen und auf andere AWS-Ressourcen zugreifen (z. B. Daten, die in Amazon S3-Buckets gespeichert sind). Um die Sicherheit zu gewährleisten, müssen Sie Step Functions mithilfe von AWS Identity and Access Management (IAM) Zugriff auf diese Ressourcen gewähren.


a. Navigieren Sie in einem anderen Browserfenster zur AWS Managementkonsole und geben Sie in der Suchleiste IAM ein. Klicken Sie auf IAM, um die Servicekonsole zu öffnen.

(zum Vergrößern klicken)


b. Klicken Sie auf Rollen und wählen Sie anschließend Rolle erstellen.

(zum Vergrößern klicken)


c. Wählen Sie auf der Seite Typ der vertrauenswürdigen Entität auswählen unter AWS-Service die Option Step Functions aus der Liste aus und wählen Sie anschließend Weiter: Berechtigungen.

(zum Vergrößern klicken)


d. Wählen Sie auf der Seite Berechtigungsrichtlinie anhängen die Option Weiter: Prüfen.

 

(zum Vergrößern klicken)


e. Geben Sie auf der Seite Review step_functions_basic_execution als Rollennamen ein und klicken Sie auf Rolle erstellen.

(zum Vergrößern klicken)


f. Ihre neue IAM-Rolle wird erstellt und in der Liste unter der IAM-Rolle für Ihre Lambda-Funktion angezeigt.

(zum Vergrößern klicken)


Schritt 3. Erstellen einer Zustandsmaschine für Step Functions

Jetzt, wo Sie Ihre einfache Lambda-Funktion erstellt haben, die eine API-Antwort nachahmt, können Sie eine Statusmaschine für Step Functions erstellen, um die API aufzurufen und Ausnahmen zu behandeln.

In diesem Schritt erstellen Sie mithilfe der Step Functions-Konsole eine Statusmaschine, die einen Task-Zustand mit einem Retry- und Catch-Feld verwendet, um die verschiedenen API-Antwortcodes zu verarbeiten. Sie verwenden einen Task-Zustand, um Ihre nachgebildete API-Lambda-Funktion aufzurufen, die den API-Statuscode zurückgibt, welchen Sie als Eingabe in Ihre Statusmaschine angegeben haben.


a. Öffnen Sie die AWS Step Functions-Konsole. Wählen Sie auf der Seite Zustandsmaschine erstellen die Option Von Grund auf neu verfassen. Benennen Sie im Abschnitt Details Ihre Zustandsmaschine MyAPIStateMachine und wählen Sie anschließend Ich werde eine vorhandene Rolle verwenden.

(zum Vergrößern klicken)


b. Als Nächstes entwerfen Sie eine Zustandsmaschine, die abhängig von der Antwort Ihrer Mock-API unterschiedliche Aktionen ausführt. Wenn die API nicht erreicht werden kann, wird der Workflow es erneut versuchen. Wiederholungen sind eine hilfreiche Methode, um vorübergehende Fehler zu beheben. Der Workflow fängt außerdem verschiedene Ausnahmen ab, die von der Mock-API ausgelöst werden.

Ersetzen Sie den Inhalt des Abschnitts zur Definition der Zustandsmaschine durch den folgenden Code:

{
  "Comment": "An example of using retry and catch to handle API responses",
  "StartAt": "Call API",
  "States": {
    "Call API": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next" : "OK",
      "Comment": "Catch a 429 (Too many requests) API exception, and resubmit the failed request in a rate-limiting fashion.",
      "Retry" : [ {
        "ErrorEquals": [ "TooManyRequestsException" ],
        "IntervalSeconds": 1,
        "MaxAttempts": 2
      } ],
      "Catch": [ 
        {
          "ErrorEquals": ["TooManyRequestsException"],
          "Next": "Wait and Try Later"
        }, {
          "ErrorEquals": ["ServerUnavailableException"],
          "Next": "Server Unavailable"
        }, {
          "ErrorEquals": ["States.ALL"],
          "Next": "Catch All"
        }
      ]
    },
    "Wait and Try Later": {
      "Type": "Wait",
      "Seconds" : 1,
      "Next" : "Change to 200"
    },
    "Server Unavailable": {
      "Type": "Fail",
      "Error":"ServerUnavailable",
      "Cause": "The server is currently unable to handle the request."
    },
    "Catch All": {
      "Type": "Fail",
      "Cause": "Unknown error!",
      "Error": "An error of unknown type occurred"
    },
    "Change to 200": {
      "Type": "Pass",
      "Result": {"statuscode" :"200"} ,
      "Next": "Call API"
    },
    "OK": {
      "Type": "Pass",
      "Result": "The request has succeeded.",
      "End": true
    }
  }
}

(zum Vergrößern klicken)


c. Suchen Sie die Zeile „Ressource“ im Task-Zustand „API aufrufen“ (Zeile 7). Um diese ARN auf die ARN der soeben erstellten Lambda-Funktion der Mock-API zu aktualisieren, klicken Sie auf den ARN-Text und wählen Sie die ARN aus der Liste aus.

(zum Vergrößern klicken)


d. Klicken Sie auf die Schaltfläche Aktualisieren neben dem Fensterbereich Visueller Workflow, damit Step Functions ein Zustandsmaschinendiagramm erstellt, das dem soeben entworfenen Workflow entspricht. Klicken Sie nach Überprüfung des visuellen Workflows auf Zustandsmaschine erstellen.

(zum Vergrößern klicken)


Schritt 4. Testen Ihres Workflows zur Fehlerbehandlung

Um Ihren Workflow zur Fehlerbehandlung zu testen, rufen Sie Ihre Zustandsmaschine auf, um Ihre Mock-API aufzurufen, indem Sie den Fehlercode als Eingabe angeben.


a. Klicken Sie auf Ausführung starten.

(zum Vergrößern klicken)


b. Ein neues Ausführungsdialogfeld wird angezeigt, in das Sie Eingaben für Ihre Zustandsmaschine eingeben können. Sie spielen die Rolle der API und geben den Fehlercode ein, den die Mock-API zurückgeben soll. Ersetzen Sie den vorhandenen Text durch den folgenden Code und wählen Sie dann Ausführung starten:

{
    "statuscode": "200"
}

(zum Vergrößern klicken)


c. Klicken Sie im Bildschirm Ausführungsdetails auf Eingabe, um die Eingabe anzuzeigen, die Sie für Ihre Zustandsmaschine bereitgestellt haben. Klicken Sie anschließend auf Ausgabe, um das Ergebnis der Ausführung Ihrer Zustandsmaschine anzuzeigen. Sie können sehen, dass der Workflow den Statuscode 200 als erfolgreichen API-Aufruf interpretiert hat.

(zum Vergrößern klicken)


d. Unter Visueller Workflow sehen Sie den Ausführungspfad jeder Ausführung, der im Workflow grün angezeigt wird. Klicken Sie auf den Task-Zustand „API aufrufen“ und erweitern Sie die Felder Eingabe und Ausgabe im Bildschirm Schrittdetails.

Sie können sehen, dass dieser Task-Zustand Ihre Mock-API-Lambda-Funktion mit der von Ihnen angegebenen Eingabe erfolgreich aufgerufen und die Ausgabe dieser Lambda-Funktion („200 OK“) erfasst hat.

(zum Vergrößern klicken)


e. Klicken Sie anschließend im visuellen Workflow auf den Task-Zustand „OK“. Unter Schrittdetails können Sie sehen, dass die Ausgabe des vorherigen Schritts (der Task-Zustand „API aufrufen“) als Eingabe für diesen Schritt übergeben wurde. Der OK-Zustand ist ein Pass-Zustand, der einfach seine Eingabe an seine Ausgabe übergeben hat und keine Arbeit ausführt. Pass-Zustände sind nützlich beim Erstellen und Debuggen von Zustandsmaschinen.

(zum Vergrößern klicken)


Schritt 5. Überprüfen der Ausführung Ihrer Zustandsmaschine


a. Scrollen Sie zum oberen Rand des Bildschirms Ausführungsdetails und klicken Sie auf MyAPIStateMachine.

(zum Vergrößern klicken)


b. Klicken Sie erneut auf Ausführung starten. Geben Sie diesmal die folgende Eingabe ein und klicken Sie anschließend auf Ausführung starten.

{
    "statuscode": "503"
}

(zum Vergrößern klicken)


c. Erweitern Sie im Abschnitt Ausführungsereignisverlauf jeden Ausführungsschritt, um zu bestätigen, dass sich Ihr Workflow wie erwartet verhalten hat. Wir haben erwartet, dass diese Ausführung fehlschlägt. Seien Sie also nicht beunruhigt! Sie werden Folgendes feststellen:

  1. Step Functions hat Ihre Eingabe erfasst
  2. Diese Eingabe wurde an den Task-Zustand „API aufrufen“ übergeben
  3. Der Task-Zustand „API aufrufen“ hat Ihre MockAPIFunction mit dieser Eingabe aufgerufen
  4. Die MockAPIF-Funktion wurde ausgeführt
  5. Die MockAPIF-Funktion ist mit einer ServerUnavailableException fehlgeschlagen
  6. Die Catch-Anweisung in Ihrem Task-Zustand API aufrufen hat diese Ausnahme abgefangen
  7. Die Catch-Anweisung hat den Workflow nicht bestanden
  8. Ihre Zustandsmaschine hat ihre Ausführung abgeschlossen

(zum Vergrößern klicken)


d. Als Nächstes werden Sie eine 429-Ausnahme simulieren. Scrollen Sie zum oberen Rand des Bildschirms Ausführungsdetails und klicken Sie auf MyAPIStateMachine. Klicken Sie auf Ausführung starten, geben Sie die folgende Eingabe ein und klicken Sie anschließend auf Ausführung starten:

{
    "statuscode": "429"
}

(zum Vergrößern klicken)


e. Untersuchen Sie nun das Wiederholungsverhalten Ihres Workflows. Erweitern Sie im Abschnitt Ausführungsereignisverlauf jeden Ausführungsschritt erneut, um zu bestätigen, dass Step Functions zweimal versucht hat, die MockAPILambda-Funktion aufzurufen, wobei beide Versuche fehlgeschlagen sind. Zu diesem Zeitpunkt hat Ihr Workflow in den Status „Warten und später versuchen“ gewechselt (siehe Abbildung rechts), in der Hoffnung, dass die API nur vorübergehend nicht reagiert hat.

Als Nächstes hat der Wartestatus mit allen Mitteln versucht, den Antwortcode auf 200 zu ändern, und Ihr Workflow hat die Ausführung erfolgreich abgeschlossen. So würden Sie eine 429-Ausnahme in einer realen Anwendung vermutlich nicht behandeln, aber wir lassen die Dinge für dieses Tutorial einfach.

(zum Vergrößern klicken)


f. Führen Sie eine weitere Instance Ihres Workflows aus, und geben Sie diesmal eine zufällige API-Antwort an, die von Ihrer Zustandsmaschine nicht verarbeitet wird:

{
    "statuscode": "999"
}

Überprüfen Sie die Ausführung erneut mithilfe des Ausführungsereignisverlaufs. Wenn Sie fertig sind, klicken Sie erneut auf MyAPIStateMachine. Im Bereich Ausführungen können Sie den Verlauf aller Ausführungen Ihres Workflows anzeigen und nach Belieben einzeln darauf zugreifen.

(zum Vergrößern klicken)


Schritt 6. Beenden Ihrer Ressourcen

In diesem Schritt beenden Sie Ihre AWS Step Functions- und AWS Lambda-bezogenen Ressourcen.

Wichtig: Die Beendigung von Ressourcen, die nicht aktiv genutzt werden, ist eine bewährte Methode zur Senkung der Kosten. Wenn Sie Ihre Ressourcen nicht beenden, können Gebühren anfallen.


a. Klicken Sie oben im Konsolenfenster von AWS Step Functions auf Zustandsmaschinen.

(zum Vergrößern klicken)


b. Klicken Sie im Fenster Zustandsmaschinen auf MyAPIStateMachine und wählen Sie Löschen. Bestätigen Sie die Aktion, indem Sie im Dialogfeld Zustandsmaschine löschen auswählen. Ihre Zustandsmaschine wird in ein oder zwei Minuten gelöscht, nachdem Step Functions bestätigt hat, dass alle prozessinternen Ausführungen abgeschlossen sind.

(zum Vergrößern klicken)


c. Als Nächstes löschen Sie Ihre Lambda-Funktionen. Klicken Sie in der AWS-Managementkonsole auf Services und wählen Sie anschließend die Option Lambda aus.

(zum Vergrößern klicken)


d. Klicken Sie im Bildschirm Funktionen auf Ihre MockAPIFunction, wählen Sie Aktionen und anschließend Löschen. Bestätigen Sie den Löschvorgang, indem Sie erneut auf Löschen klicken.

(zum Vergrößern klicken)


e. Zum Schluss löschen Sie noch Ihre IAM-Rollen. Klicken Sie in der AWS-Managementkonsole auf Services und wählen Sie anschließend die Option IAM aus.

(zum Vergrößern klicken)


f. Wählen Sie die beiden IAM-Rollen aus, die Sie für dieses Tutorial erstellt haben, und klicken Sie dann Rolle löschen. Bestätigen Sie das Löschen, indem Sie im Dialogfeld auf Ja, löschen klicken.


Sie können sich nun von der AWS-Managementkonsole abmelden.

(zum Vergrößern klicken)


Herzlichen Glückwunsch!

Sie haben AWS Step Functions und AWS Lambda dafür verwendet, einen Fehlerbehandlungsworkflow für eine Netzwerk-API zu erstellen. Durch die Verwendung von AWS Lambda können Sie Code für fast jede Anwendungsart oder jeden Back-End-Service ausführen, und das ohne Administration. Laden Sie Ihren Code einfach hoch und Lambda übernimmt alles, was zum Ausführen und Skalieren Ihres Codes für hohe Verfügbarkeit erforderlich ist.

Durch die Kombination von AWS Step Functions mit AWS Lambda wird es einfach, AWS Lambda-Funktionen für Anwendungen ohne Server zu orchestrieren. Mit Step Functions können Sie komplexe Workflows mithilfe von Lambda-Funktionen steuern, ohne dass die zugrunde liegende Anwendung den Status verwaltet und koordiniert. Sie können Step Functions auch für die Orchestrierung von Mikrodiensten mittels Rechenressourcen wie Amazon EC2 und Amazon ECS nutzen.

Weiteres Tutorial ausprobieren

AWS Step Functions erkunden