Erstellen eines Aktivitäts-Zustandsautomaten mithilfe von Step Functions - 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.

Erstellen eines Aktivitäts-Zustandsautomaten mithilfe von Step Functions

In diesem Tutorial erfahren Sie, wie Sie einen aktivitätsbasierten Zustandsautomaten mithilfe von Java und AWS Step Functions erstellen. Mit Aktivitäten können Sie Worker-Code steuern, der von Ihrem Zustandsautomaten aus ausgeführt wird. Eine Übersicht finden Sie unter Aktivitäten im Abschnitt So funktioniert Step Functions.

Zum Durcharbeiten dieses Tutorials ist Folgendes erforderlich:

Schritt 1: Erstellen einer Aktivität

Sie müssen Step Functions auf dieAktivitätderenArbeiter(Ein Programm) Sie möchten erstellen. Step Functions reagiert mit einem Amazon Resource Name (ARN), der eine Identität für die Aktivität etabliert. Verwenden Sie diese Identität, um die Informationen zwischen Ihrem Zustandsautomaten und dem Worker zu koordinieren.

Wichtig

Stellen Sie sicher, dass Ihre Aktivitätsaufgabe unter derselben liegtAWSKonto als Ihr Zustandsautomaten.

  1. In derStep Functions KonsoleWählen Sie im Navigationsbereich auf der linken SeiteAktivitätenaus.

  2. Wählen Sie Create activity (Aktivität erstellen) aus.

  3. Geben Sie einen Activity Name (Aktivitätsnamen) ein, z. B. get-greeting, und wählen Sie dann Create Activity (Aktivität erstellen).

  4. Wenn Ihre Aktivitätsaufgabe erstellt wird, notieren Sie sich deren ARN, wie im folgenden Beispiel gezeigt.

    arn:aws:states:us-east-1:123456789012:activity:get-greeting

Schritt 2: Erstellen eines Zustandsautomaten

Erstellen Sie einen Zustandsautomaten, der festlegt, wann Ihre Aktivität aufgerufen wird und wann Ihr Worker seine primäre Arbeit ausführen, die Ergebnisse sammeln und zurückgeben soll.

  1. In derStep Functions KonsoleWählen Sie im Navigationsbereich auf der linken SeiteZustandsautomatenaus.

  2. Wählen Sie auf der Seite State machines (Zustandsautomaten) die Option Create state machine (Zustandsautomaten erstellen) und dann Author with code snippets (Autor mit Codeausschnitten) aus. Wählen Sie unter Type (Typ) die Option Standard und geben Sie dann einen Namen für den Zustandsautomaten (z. B. ActivityStateMachine)) ein.

    Anmerkung

    Statuscomputer-, Ausführungs- und Aktivitätsnamen müssen 1 bis 80 Zeichen lang sein, müssen für Ihr Konto eindeutig sein undAWSRegion und darf keine der folgenden Optionen enthalten:

    • Leerzeichen

    • Platzhalterzeichen (? *)

    • Bracket-Zeichen (< > { } [ ])

    • Sonderzeichen (: ; , \ | ^ ~ $ # % & ` ")

    • Steuerzeichen (\\u0000-\\u001foder\\u007f-\\u009f) enthalten.

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

    Geben Sie unter State machine definition (Zustandsautomatendefinition) den folgenden Code sowie wie den ARN der Aktivitätsaufgabe, die Sie zuvor erstellt haben, im Feld Resource ein, wie im folgenden Beispiel gezeigt.

    { "Comment": "An example using a Task state.", "StartAt": "getGreeting", "Version": "1.0", "TimeoutSeconds": 300, "States": { "getGreeting": { "Type": "Task", "Resource": "arn:aws:states:us-east-1:123456789012:activity:get-greeting", "End": true } } }

    Dies ist eine Beschreibung Ihres Zustandsautomaten mithilfe der Amazon States Language. Sie definiert einen einzelnen Task-Zustand namens getGreeting. Weitere Informationen finden Sie unter State Machine Structure.

  3. Verwenden Sie das Diagramm imVisueller Workflow-Bereich, um zu überprüfen, ob Ihr Amazon States Language Code Ihren Zustandsautomaten korrekt beschreibt.

    Wenn Sie das Diagramm nicht sehen, wählen Sie 
       refresh
    im Bereich Visual Workflow aus.

  4. Wählen Sie Next (Weiter) aus.

  5. Erstellen oder geben Sie eine IAM-Rolle ein:

    • Um eine IAM-Rolle für Step Functions zu erstellen, wählen SieErstellen einer IAM-Rolle für mich, und geben Sie einNameFür Ihre Rolle.

    • Wenn SieErstellen einer IAM-RolleWählen Sie mit den richtigen Berechtigungen für Ihren ZustandsautomatenWählen Sie eine vorhandene IAM-Rolle ausaus. Wählen Sie eine Rolle aus der Liste aus oder geben Sie einen ARN für diese Rolle an.

    Anmerkung

    Wenn Sie die von Step Functions erstellte IAM-Rolle löschen, kann sie von Step Functions später nicht neu erstellt werden. Ebenso wenig kann, wenn Sie die Rolle verändern (z. B. durch Entfernen von Step Functions von den Prinzipalen in der IAM-Richtlinie), Step Functions später seine ursprünglichen Einstellungen wiederherstellen.

  6. Wählen Sie Create State Machine (Zustandsautomaten erstellen).

Schritt 3: Implementieren eines Workers

Geben Sie einen Namen für den Benutzer ein und klicken Sie dann aufeinArbeiteraus. Ein Worker ist ein Programm, das für Folgendes verantwortlich ist:

  • Polling Step Functions für Aktivitäten mitGetActivityTaskAPI-Aktion.

  • Durchführen der Arbeit der Aktivität mit Ihrem Code (z. B. die Methode getGreeting() im folgenden Code).

  • Zurückgeben der Ergebnisse mithilfe der API-Aktionen SendTaskSuccess, SendTaskFailure und SendTaskHeartbeat.

Anmerkung

Ein umfassendes Beispiel für einen Aktivitäts-Worker finden Sie unter BeispielAktivitätArbeiter in Ruby. Dieses Beispiel verwendet eine auf bewährten Methoden basierende Implementierung, die Sie als Referenz für Ihren Aktivitäts-Worker verwenden können. Der Code implementiert ein Verbraucher/Erzeuger-Muster mit einer konfigurierbaren Anzahl an Threads für Poller und Aktivitäts-Worker.

Implementieren des Workers

  1. Erstellen Sie eine Datei namens GreeterActivities.java.

  2. Fügen Sie ihr folgenden Code hinzu.

    import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.EnvironmentVariableCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.stepfunctions.AWSStepFunctions; import com.amazonaws.services.stepfunctions.AWSStepFunctionsClientBuilder; import com.amazonaws.services.stepfunctions.model.GetActivityTaskRequest; import com.amazonaws.services.stepfunctions.model.GetActivityTaskResult; import com.amazonaws.services.stepfunctions.model.SendTaskFailureRequest; import com.amazonaws.services.stepfunctions.model.SendTaskSuccessRequest; import com.amazonaws.util.json.Jackson; import com.fasterxml.jackson.databind.JsonNode; import java.util.concurrent.TimeUnit; public class GreeterActivities { public String getGreeting(String who) throws Exception { return "{\"Hello\": \"" + who + "\"}"; } public static void main(final String[] args) throws Exception { GreeterActivities greeterActivities = new GreeterActivities(); ClientConfiguration clientConfiguration = new ClientConfiguration(); clientConfiguration.setSocketTimeout((int)TimeUnit.SECONDS.toMillis(70)); AWSStepFunctions client = AWSStepFunctionsClientBuilder.standard() .withRegion(Regions.US_EAST_1) .withCredentials(new EnvironmentVariableCredentialsProvider()) .withClientConfiguration(clientConfiguration) .build(); while (true) { GetActivityTaskResult getActivityTaskResult = client.getActivityTask( new GetActivityTaskRequest().withActivityArn(ACTIVITY_ARN)); if (getActivityTaskResult.getTaskToken() != null) { try { JsonNode json = Jackson.jsonNodeOf(getActivityTaskResult.getInput()); String greetingResult = greeterActivities.getGreeting(json.get("who").textValue()); client.sendTaskSuccess( new SendTaskSuccessRequest().withOutput( greetingResult).withTaskToken(getActivityTaskResult.getTaskToken())); } catch (Exception e) { client.sendTaskFailure(new SendTaskFailureRequest().withTaskToken( getActivityTaskResult.getTaskToken())); } } else { Thread.sleep(1000); } } } }
    Anmerkung

    Bei der Klasse EnvironmentVariableCredentialsProvider in diesem Beispiel wird davon ausgegangen, dass die Umgebungsvariablen AWS_ACCESS_KEY_ID (oder AWS_ACCESS_KEY) und AWS_SECRET_KEY (oder AWS_SECRET_ACCESS_KEY) gesetzt sind. Weitere Informationen zum Bereitstellen der erforderlichen Anmeldeinformationen für diese Factory finden Sie unterAWSCredentialsProviderimAWS SDK for Java-API-ReferenzundEinrichten vonAWSAnmeldeinformationen und Region für die EntwicklungimAWS SDK for JavaEntwicklerhandbuchaus.

    Standardmäßig ist derAWSDas SDK wartet bis zu 50 Sekunden, bis Daten vom Server für eine Operation empfangen werden. Die Operation GetActivityTask ist eine Langabfrage-Operation, die bis zu 60 Sekunden auf die nächste verfügbare Aufgabe wartet. Um zu verhindern, dass einSocketTimeoutExceptionFehler, setzenSocketTimeoutauf 70 Sekunden.

  3. Ersetzen Sie in der Liste der Parameter des Konstruktors GetActivityTaskRequest().withActivityArn() den Wert ACTIVITY_ARN mit dem ARN der Aktivitätsaufgabe, die Sie zuvor erstellt haben.

Schritt 4: Starten einer Ausführung

Beim Starten der Ausführung des Zustandsautomaten fragt Ihr Worker Step Functions nach Aktivitäten ab, führt seine Arbeit durch (mithilfe der Eingabe, die Sie bereitstellen) und gibt die Ergebnisse zurück.

  1. Auf derActivityStateMaschine-Seite wählenStarten der Ausführungaus.

    Die Seite New execution wird angezeigt.

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

    Anmerkung

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

  3. Ersetzen Sie im Ausführungs-Eingabebereich die Beispieldaten durch folgende Daten.

    { "who" : "AWS Step Functions" }
  4. Wählen Sie Start Execution aus.

    Eine neue Ausführung Ihres Zustandsautomaten startet und eine neue Seite mit Ihrer laufenden Ausführung wird angezeigt.

  5. Wählen Sie im Abschnitt Execution Details Info aus, um den Execution Status und die Zeitstempel Started und Closed anzuzeigen.

  6. Erweitern Sie im Abschnitt Execution Details (Ausführungsdetails) den Abschnitt Output (Ausgabe), um das Ergebnis Ihres Workflows anzuzeigen.

Schritt 5: Ausführen und stoppen Sie den Worker

Damit der Worker Ihren Zustandsautomaten nach Aktivitäten abfragen kann, müssen Sie den Worker ausführen.

  1. Navigieren Sie über die Befehlszeile zu dem Verzeichnis, in dem Sie GreeterActivities.java erstellt haben.

  2. Um das AWS-SDK zu verwenden, fügen Sie den vollständigen Pfad der Verzeichnisse lib und third-party zu den Abhängigkeiten Ihrer Build-Datei und zu Ihrer Java-CLASSPATH hinzu. Weitere Informationen finden Sie unterHerunterladen und Entpacken des SDKimAWS SDK for JavaEntwicklerhandbuchaus.

  3. Kompilieren Sie die Datei.

    $ javac GreeterActivities.java
  4. Führen Sie die Datei aus.

    $ java GreeterActivities
  5. In derStep Functions KonsoleNavigieren Sie zurAusführungsdetailsangezeigten.

  6. Wenn die Ausführung abgeschlossen ist, wählen Sie Output aus, um die Ergebnisse Ihrer Ausführung zu sehen.

  7. Beenden Sie den Worker.