Verwenden einer Lambda-Funktion, um eine neue Ausführung fortzusetzen - AWS Step Functions

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Verwenden einer Lambda-Funktion, um eine neue Ausführung fortzusetzen

Sie können eine Zustandsmaschine erstellen, die eine Lambda-Funktion verwendet, um eine neue Ausführung zu starten, bevor die aktuelle Ausführung beendet wird. Wenn Sie diesen Ansatz verwenden, um Ihre laufende Arbeit in einer neuen Ausführung fortzusetzen, können Sie eine Zustandsmaschine haben, die große Aufträge in kleinere Workflows aufteilen kann, oder eine Zustandsmaschine, die unbegrenzt ausgeführt wird.

Dieses Tutorial baut auf dem Konzept der Verwendung einer externen Lambda-Funktion zur Änderung Ihres Workflows auf, das in derIteratives Durchlaufen einer Schleife mit LambdaTutorial. Sie verwenden dieselbe Lambda-Funktion (Iterator), um eine Schleife für eine bestimmte Anzahl von Malen zu iterieren. Darüber hinaus erstellen Sie eine weitere Lambda-Funktion, um eine neue Ausführung Ihres Workflows zu starten und die Anzahl jedes Mal zu verringern, wenn eine neue Ausführung gestartet wird. Indem die Anzahl der Ausführungen in der Eingabe festgelegt wird, beendet dieser Zustandsautomat eine Ausführung mit der angegebenen Häufigkeit und startet sie neu.

Der Zustandsautomat, den Sie erstellen, implementiert die folgenden Zustände.

Status Zweck

ConfigureCount

EINPassStaat, der das konfiguriertcount,index, undstepschätzt, dass derIteratorDie Lambda-Funktion wird verwendet, um Iterationen der Arbeit schrittweise zu durchlaufen.

Iterator

EINTaskgeben Sie an, dass aufIteratorLambda-Funktion.

IsCountReached

EINChoicestate, der einen booleschen Wert aus demIteratorFunktion, um zu entscheiden, ob die Zustandsmaschine die Beispielarbeit fortsetzen soll, oderShouldRestartZustand.

ExampleWork

EINPassZustand, der dieTaskangeben, dass die Arbeit in einer tatsächlichen Implementierung ausgeführt werden würde.

ShouldRestart

EINChoiceStaat, der das benutztexecutionCountWert, um zu entscheiden, ob eine Ausführung beendet und eine andere gestartet oder einfach beendet werden soll.

Restart

EINTaskStatus, der eine Lambda-Funktion verwendet, um eine neue Ausführung Ihrer Zustandsmaschine zu starten. Wie die Iterator-Funktion dekrementiert auch diese Funktion einen Zähler. DieRestartstate übergibt den dekrementierten Wert des Zählers an den Eingang der neuen Ausführung.

Voraussetzungen

Bevor Sie anfangen, gehen Sie dieErstellen einer Step Functions State Machine, die Lambda verwendetTutorial, um sicherzustellen, dass Sie mit der gemeinsamen Verwendung von Lambda und Step Functions vertraut sind.

Schritt 1: Erstellen einer Lambda-Funktion zum Iterieren einer Zählung

Anmerkung

Wenn Sie das abgeschlossen habenIteratives Durchlaufen einer Schleife mit LambdaTutorial können Sie diesen Schritt überspringen und diese Lambda-Funktion überspringen und diese Lambda

Dieser Abschnitt und dieIteratives Durchlaufen einer Schleife mit LambdaTutorial zeigt, wie Sie eine Lambda-Funktion verwenden können, um eine Anzahl zu verfolgen, z. B. die Anzahl der Iterationen einer Schleife in Ihrer Zustandsmaschine.

Die folgende Lambda-Funktion empfängt Eingabewerte fürcount,index, undstep. Sie gibt diese Werte mit einem aktualisierten index und einem Booleschen Wert namens continue zurück. Die Lambda-Funktionssätzecontinuezutruewenn derindexist kleiner alscount.

Ihr Zustandsautomat implementiert dann einen Choice-Zustand, der eine bestimmte Anwendungslogik ausführt, wenn true für continue angegeben ist, oder mit ShouldRestart fortfährt, wenn false für continue angegeben ist.

Erstellen der Lambda-Funktion

  1. Öffnen Sie die Lambda-Konsole und wählen Sie Create function (Funktion erstellen) aus.

  2. Wählen Sie auf der Seite Create function die Option Author from scratch.

  3. In derGrundlegende Informationenkonfigurieren Sie Ihre Lambda-Funktion wie folgt:

    1. Geben Sie für Function name (Funktionsname) Iterator ein.

    2. FürLaufzeit, wählenNode.js 16.x.

    3. Behalten Sie alle Standardauswahlen auf der Seite bei und wählen Sie dannFunktion erstellen.

      Wenn Ihre Lambda-Funktion erstellt wurde, notieren Sie sich ihren Amazon-Ressourcennamen (ARN) in der oberen rechten Ecke der Seite, zum Beispiel:

      arn:aws:lambda:us-east-1:123456789012:function:Iterator
  4. Kopieren Sie folgenden Code für die Lambda-Funktion in die Lambda-Funktion inCode-QuelleAbschnittIteratorSeite in der Lambda-Konsole.

    exports.handler = function iterator (event, context, callback) { let index = event.iterator.index; let step = event.iterator.step; let count = event.iterator.count; index = index + step; callback(null, { index, step, count, continue: index < count }) }

    Dieser Code nimmt Eingabewerte für count, index und step entgegen. Er inkrementiert index um den Wert von step und gibt diese Werte sowie den Booleschen Wert continue zurück. Der Wert von continue ist true, wenn index kleiner als count ist.

  5. WählenBereitstellenum den Code bereitzustellen.

Lambda-Funktion testen

Um zu sehen, wie Ihre Iterate-Funktion arbeitet, führen Sie sie mit numerischen Werten aus. Sie können Eingabewerte für Ihre Lambda-Funktion angeben, die eine Iteration nachahmen, um zu sehen, welche Ausgabe Sie mit bestimmten Eingabewerten erhalten.

So testen Sie Ihre Lambda-Funktion

  1. Wählen Sie im Dialogfeld Configure test event die Option Create new test event und geben Sie dann TestIterator für Event name ein.

  2. Ersetzen Sie die Beispieldaten durch Folgendes.

    { "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }

    Diese Werte ahmen nach, was während einer Iteration aus Ihrem Zustandsautomaten kommt. Die Lambda-Funktion inkrementiert den Index und gibt zurückcontinuealstrue. Wenn der Index nicht geringer ist als count, wird continue als false zurückgegeben. Für diesen Test wurde der Index bereits auf 5 inkrementiert. Die Ergebnisse sollten index auf 6 inkrementieren und continue auf true setzen.

  3. Wählen Sie Create (Erstellen) aus.

  4. Auf derIteratorSeite in Ihrer Lambda-Konsole, seien Sie sicherTestIteratorist aufgeführt, und wählen Sie danntesten.

    Die Ergebnisse des Tests werden oben auf der Seite angezeigt. Wählen Sie Details und sehen Sie sich das Ergebnis an.

    { "index": 6, "step": 1, "count": 10, "continue": true }
    Anmerkung

    Wenn Sie index für diesen Test auf 9 setzen, wird index auf 10 inkrementiert und continue ist false.

Schritt 2: Erstellen Sie eine Lambda-Funktion zum Starten einer neuen Ausführung von Step Functions

  1. Öffnen Sie die Lambda-Konsole und wählen Sie Create function (Funktion erstellen) aus.

  2. Wählen Sie auf der Seite Create function die Option Author from scratch.

  3. In derGrundlegende Informationenkonfigurieren Sie Ihre Lambda-Funktion wie folgt:

    1. Geben Sie für Function name (Funktionsname) Restart ein.

    2. FürLaufzeit, wählenNode.js 16.x.

  4. Behalten Sie alle Standardauswahlen auf der Seite bei und wählen Sie dannFunktion erstellen.

    Wenn Ihre Lambda-Funktion erstellt wurde, notieren Sie sich ihren Amazon-Ressourcennamen (ARN) in der oberen rechten Ecke der Seite, zum Beispiel:

    arn:aws:lambda:us-east-1:123456789012:function:Iterator
  5. Kopieren Sie folgenden Code für die Lambda-Funktion in die Lambda-Funktion inCode-QuelleAbschnittStartenSeite in der Lambda-Konsole.

    Der folgende Code dekrementiert einen Zähler für die Ausführungsanzahl und startet eine neue Ausführung Ihres Zustandsautomaten, einschließlich des dekrementierten Wertes.

    var aws = require('aws-sdk'); var sfn = new aws.StepFunctions(); exports.restart = function(event, context, callback) { let StateMachineArn = event.restart.StateMachineArn; event.restart.executionCount -= 1; event = JSON.stringify(event); let params = { input: event, stateMachineArn: StateMachineArn }; sfn.startExecution(params, function(err, data) { if (err) callback(err); else callback(null,event); }); }
  6. WählenBereitstellenum den Code bereitzustellen.

Schritt 3: Erstellen eines Zustandsautomaten

Nachdem Sie Ihre beiden Lambda-Funktionen erstellt haben, erstellen Sie eine Zustandsmaschine. In diesem Zustandsautomaten benennen die Zustände ShouldRestart und Restart die Art und Weise, wie Sie Ihre Arbeit auf mehrere Ausführungen aufteilen.

Beispiel ShouldRestart Status

Dieser Auszug des Zustandsautomaten zeigt dieShouldRestartChoiceZustand. Dieser Zustand bestimmt, ob Sie die Ausführung neu starten sollten.

"ShouldRestart": { "Type": "Choice", "Choices": [ { "Variable": "$.restart.executionCount", "NumericGreaterThan": 1, "Next": "Restart" } ],

Der $.restart.executionCount-Wert ist in der Eingabe der ersten Ausführung enthalten. Er wird bei jedem Aufruf der Restart-Funktion um eins dekrementiert und dann für jede nachfolgende Ausführung in die Eingabe platziert.

Beispiel Task-Zustand Restart

Dieser Auszug des Zustandsautomaten zeigt dieRestartTaskZustand. In diesem Zustand wird die Lambda-Funktion verwendet, die Sie zuvor erstellt haben, um die Ausführung neu zu starten und die Anzahl zu verringern, um die verbleibende Anzahl der zu startenden Ausführungen nachzuverfolgen.

"Restart": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart", "Next": "Done" },
  1. Auf derStep Functions, wählenZustandsautomaten.

    Wichtig

    Stellen Sie sicher, dass sich Ihre Zustandsmaschine unter derselben befindetAWSaccount und Region als Lambda-Funktion, die Sie zuvor erstellt haben.

  2. Fügen Sie folgenden Code in die Datei ein:DefinitionFensterbereich.

    { "Comment": "Continue-as-new State Machine Example", "StartAt": "ConfigureCount", "States": { "ConfigureCount": { "Type": "Pass", "Result": { "count": 100, "index": -1, "step": 1 }, "ResultPath": "$.iterator", "Next": "Iterator" }, "Iterator": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Iterator", "ResultPath": "$.iterator", "Next": "IsCountReached" }, "IsCountReached": { "Type": "Choice", "Choices": [ { "Variable": "$.iterator.continue", "BooleanEquals": true, "Next": "ExampleWork" } ], "Default": "ShouldRestart" }, "ExampleWork": { "Comment": "Your application logic, to run a specific number of times", "Type": "Pass", "Result": { "success": true }, "ResultPath": "$.result", "Next": "Iterator" }, "ShouldRestart": { "Type": "Choice", "Choices": [ { "Variable": "$.restart.executionCount", "NumericGreaterThan": 0, "Next": "Restart" } ], "Default": "Done" }, "Restart": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart", "Next": "Done" }, "Done": { "Type": "Pass", "End": true } } }
  3. Aktualisieren Sie dieResourceZeichenfolge imRestartundIteratorgibt an, auf die jeweiligen Lambda-Funktionen zu verweisen, die Sie zuvor erstellt haben.

  4. Wählen Sie Next (Weiter).

  5. Auf derFestlegenein und geben Sie einen Namen für Ihre Zustandsautomaten ein. Zum Beispiel ContinueAsNew.

  6. Behalten Sie die Standardauswahl für alle anderen Optionen auf der Seite bei und wählen Sie dannZustandsautomaten.

  7. Speichern Sie den Amazon-Ressourcenname (ARN) dieses Zustandsautomaten in einer Textdatei. Sie müssen den ARN angeben und gleichzeitig der Lambda-Funktion die Berechtigung erteilen, eine neue Ausführung der Step Functions zu starten.

Schritt 4: Aktualisieren Sie die IAM-Richtlinie

Um sicherzustellen, dass Ihre Lambda-Funktion über Berechtigungen zum Starten einer neuen Ausführung von Step Functions verfügt, fügen Sie der IAM-Rolle, die Sie für Ihr verwenden, eine Inline-Richtlinie anRestartLambda-Funktion. Weitere Informationen finden Sie unterEingebundene Richtlinienin derIAM User Guide.

Anmerkung

Sie können die Resource-Zeile im vorherigen Beispiel aktualisieren, damit sie auf den ARN Ihres ContinueAsNew-Zustandsautomaten verweist. Dies beschränkt die Richtlinie, so dass sie nur eine Ausführung dieses spezifischen Zustandsautomaten starten kann.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "states:StartExecution" ], "Resource": "arn:aws:states:us-east-2:123456789012stateMachine:ContinueAsNew" } ] }

Schritt 5: Führen Sie eine Ausführung aus

Zum Starten einer Ausführung stellen Sie eine Eingabe bereit, die den ARN des Zustandsautomaten enthält und einen executionCount, der angibt, wie oft eine neue Ausführung gestartet werden soll.

  1. Auf derContinueAsNewSeite, wählenStarten der Ausführung.

    DieStarten der Ausführungwird ein Dialogfeld angezeigt.

  2. (Optional) Um Ihre Ausführung zu identifizieren, können Sie einen Namen dafür in derNameKiste. Standardmäßig generiert Step Functions automatisch einen eindeutigen Ausführungsnamen.

    Anmerkung

    Mit Step Functions können Sie Zustandsautomaten-, Ausführungs- und Aktivitätsnamen erstellen, die Nicht-ASCII-Zeichen enthalten. Diese Nicht-ASCII-Namen funktionieren nicht mit Amazon CloudWatch. Um sicherzustellen, dass Sie verfolgen können CloudWatch Metriken, wählen Sie einen Namen, der nur ASCII-Zeichen verwendet.

  3. In derEingabeAbschnitt, auf derStarten der AusführungGeben Sie im Dialogfeld Folgendes als Ausführungseingabe ein:

    { "restart": { "StateMachineArn": "arn:aws:states:us-east-1:123456789012:stateMachine:ContinueAsNew", "executionCount": 4 } }
  4. Aktualisieren Sie das Feld StateMachineArn mit dem ARN für den Zustandsautomaten ContinueAsNew.

  5. Wählen Sie Start Execution aus.

Das Diagramm Visual Workflow (Visueller Workflow) zeigt die erste der vier Ausführungen an. Bevor sie abgeschlossen ist, durchläuft sie den Restart-Zustand und startet eine neue Ausführung.


                Erste von vier Ausführungen.

Da nun diese Ausführung abgeschlossen ist, können Sie sich die nächste Ausführung ansehen, die ausgeführt wird. Wählen Sie dieContinueAsNewLink oben, um die Liste der Ausführungen zu sehen. Sie sollten sowohl die kürzlich abgeschlossene Ausführung als auch eine laufende Ausführung sehen, dieRestartDie Lambda-Funktion wurde gestartet.


                Eine Ausführung abgeschlossen, die nächste wird ausgeführt.

Wenn alle Ausführungen abgeschlossen sind, sollten Sie vier erfolgreiche Ausführungen in der Liste sehen. Die erste gestartete Ausführung zeigt den von Ihnen gewählten Namen. Nachfolgende Ausführungen haben einen generierten Namen.


                Alle Ausführungen abgeschlossen.