Einen Activity State Machine mithilfe von Step Functions erstellen - 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.

Einen Activity State Machine mithilfe von Step Functions erstellen

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

Zum Durcharbeiten dieses Tutorials ist Folgendes erforderlich:

  • Das SDK für Java. Die Beispielaktivität in diesem Tutorial ist eine Java-Anwendung, die verwendet, AWS SDK for Java um mit zu kommunizieren AWS.

  • AWS Anmeldeinformationen in der Umgebung oder in der AWS Standardkonfigurationsdatei. Weitere Informationen finden Sie unter Einrichten Ihrer AWS Anmeldeinformationen im AWS SDK for Java Entwicklerhandbuch.

Schritt 1: Erstellen einer Aktivität

Sie müssen Step Functions auf die Aktivität aufmerksam machen, deren Worker (ein Programm) Sie erstellen möchten. Step Functions antwortet mit einem Amazon-Ressourcennamen (ARN), der eine Identität für die Aktivität festlegt. Verwenden Sie diese Identität, um die Informationen zwischen Ihrem Zustandsautomaten und dem Worker zu koordinieren.

Wichtig

Stellen Sie sicher, dass sich Ihre Aktivitätsaufgabe unter demselben AWS Konto befindet wie Ihr State Machine.

  1. Wählen Sie in der Step Functions Functions-Konsole im Navigationsbereich auf der linken Seite Aktivitäten aus.

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

  3. Geben Sie beispielsweise einen Namen für die Aktivität ein und wählen Sie dann Aktivität erstellen aus. get-greeting

  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 Sie eine Zustandsmaschine

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. Um die Zustandsmaschine zu erstellen, verwenden Sie Code-Editor den Workflow Studio.

  1. Wählen Sie in der Step Functions Functions-Konsole im Navigationsbereich auf der linken Seite State Machines aus.

  2. Wählen Sie auf der Seite State Machines die Option Create State Machine aus.

  3. Wählen Sie im Dialogfeld Vorlage auswählen die Option Leer aus.

  4. Wählen Sie Select (Auswählen). Dadurch wird Workflow Studio in geöffnetEntwurfsmodus.

  5. Für dieses Tutorial schreiben Sie die Amazon States Language (ASL-) Definition Ihrer Zustandsmaschine in den Code-Editor. Wählen Sie dazu Code.

  6. Entfernen Sie den vorhandenen Boilerplate-Code und fügen Sie den folgenden Code ein. Denken Sie daran, den Beispiel-ARN in diesem Code durch den ARN der Aktivitätsaufgabe zu ersetzen, die Sie zuvor in dem Resource Feld erstellt haben.

    { "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 Ihrer Zustandsmaschine, die die Amazon States Language (ASL) verwendet. Sie definiert einen einzelnen Task-Zustand namens getGreeting. Weitere Informationen finden Sie unter State Machine Structure.

  7. Vergewissern Sie sichBereich zur Grafikvisualisierung, dass das Workflow-Diagramm für die ASL-Definition, die Sie hinzugefügt haben, dem folgenden Diagramm ähnelt.

  8. Geben Sie einen Namen für Ihre Zustandsmaschine ein. Wählen Sie dazu das Bearbeitungssymbol neben dem Standardnamen der Zustandsmaschine von MyStateMachine. Geben Sie dann unter State-Machine-Konfiguration einen Namen in das Feld State-Machine-Name ein.

    Geben Sie für dieses Tutorial den Namen ActivityStateMachine ein.

  9. (Optional) Geben Sie unter State-Machine-Konfiguration weitere Workflow-Einstellungen an, z. B. den Zustandsmaschinentyp und seine Ausführungsrolle.

    Behalten Sie für dieses Tutorial alle Standardauswahlen in den State-Machine-Einstellungen bei.

    Wenn Sie zuvor eine IAM-Rolle mit den richtigen Berechtigungen für Ihren Zustandsmaschine erstellt haben und diese verwenden möchten, wählen Sie unter Berechtigungen die Option Vorhandene Rolle auswählen und dann eine Rolle aus der Liste aus. Oder wählen Sie Einen Rollen-ARN eingeben aus und geben Sie dann einen ARN für diese IAM-Rolle ein.

  10. Wählen Sie im Dialogfeld „Rollenerstellung bestätigen“ die Option Bestätigen aus, um fortzufahren.

    Sie können auch Rolleneinstellungen anzeigen wählen, um zur State-Machine-Konfiguration zurückzukehren.

    Anmerkung

    Wenn Sie die von Step Functions erstellte IAM-Rolle löschen, kann Step Functions sie später nicht mehr neu erstellen. Ebenso kann Step Functions ihre ursprünglichen Einstellungen später nicht wiederherstellen, wenn Sie die Rolle ändern (z. B. indem Sie Step Functions aus den Principals in der IAM-Richtlinie entfernen).

Schritt 3: Implementieren eines Workers

Erstellen Sie einen Worker. Ein Worker ist ein Programm, das für Folgendes verantwortlich ist:

  • Polling-Step-Funktionen für Aktivitäten, die die GetActivityTask API-Aktion verwenden.

  • 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 Beispiel für einen Aktivitäts-Worker 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 zur Bereitstellung der erforderlichen Anmeldeinformationen für das Werk finden Sie AWSCredentialsProviderin der AWS SDK for Java API-Referenz und unter AWS Anmeldeinformationen und Region für die Entwicklung einrichten im AWS SDK for Java Entwicklerhandbuch.

    Standardmäßig wartet das AWS SDK bei jedem Vorgang bis zu 50 Sekunden, bis es Daten vom Server empfängt. Die Operation GetActivityTask ist eine Langabfrage-Operation, die bis zu 60 Sekunden auf die nächste verfügbare Aufgabe wartet. Stellen Sie den Wert auf 70 Sekunden ein, SocketTimeout um zu verhindern, dass ein SocketTimeoutException Fehler angezeigt wird.

  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: Führen Sie die Zustandsmaschine aus

Wenn Sie die Ausführung der Zustandsmaschine starten, fragt Ihr Worker Step Functions nach Aktivitäten ab, führt seine Arbeit aus (unter Verwendung der von Ihnen bereitgestellten Eingaben) und gibt die Ergebnisse zurück.

  1. Wählen Sie auf der ActivityStateMachineSeite die Option Ausführung starten aus.

    Das Dialogfeld Ausführung starten wird angezeigt.

  2. Gehen Sie im Dialogfeld Ausführung starten wie folgt vor:

    1. (Optional) Um Ihre Ausführung zu identifizieren, können Sie im Feld Name einen Namen dafür angeben. Standardmäßig generiert Step Functions automatisch einen eindeutigen Ausführungsnamen.

      Anmerkung

      Mit Step Functions können Sie Namen für Zustandsmaschinen, Ausführungen und Aktivitäten sowie Beschriftungen erstellen, die Nicht-ASCII-Zeichen enthalten. Diese Nicht-ASCII-Namen funktionieren nicht mit Amazon. CloudWatch Um sicherzustellen, dass Sie CloudWatch Messwerte verfolgen können, wählen Sie einen Namen, der nur ASCII-Zeichen verwendet.

    2. Geben Sie im Eingabefeld die folgende JSON-Eingabe ein, um Ihren Workflow auszuführen.

      { "who": "AWS Step Functions" }
    3. Wählen Sie Start execution (Ausführung starten) aus.

    4. Die Step Functions Functions-Konsole leitet Sie zu einer Seite weiter, die mit Ihrer Ausführungs-ID betitelt ist. Diese Seite wird als Seite mit den Ausführungsdetails bezeichnet. Auf dieser Seite können Sie die Ausführungsergebnisse im Verlauf der Ausführung oder nach deren Abschluss überprüfen.

      Um die Ausführungsergebnisse zu überprüfen, wählen Sie in der Diagrammansicht einzelne Status aus und wählen Sie dann die einzelnen Registerkarten im Schrittdetails Bereich, um die Details der einzelnen Status, einschließlich Eingabe, Ausgabe und Definition, anzuzeigen. Einzelheiten zu den Ausführungsinformationen, die Sie auf der Seite mit den Ausführungsdetails einsehen können, finden Sie unterSeite mit Ausführungsdetails – Schnittstellenübersicht.

Schritt 5: Ausführen und Beenden des Workers

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 third-party Verzeichnisse lib und zu den Abhängigkeiten Ihrer Build-Datei und zu Ihrer Java-Datei hinzuCLASSPATH. Weitere Informationen finden Sie unter Herunterladen und Extrahieren des SDK im AWS SDK for Java Entwicklerhandbuch.

  3. Kompilieren Sie die Datei.

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

    $ java GreeterActivities
  5. Navigieren Sie in der Step Functions Functions-Konsole zur Seite mit den Ausführungsdetails.

  6. Wenn die Ausführung abgeschlossen ist, überprüfen Sie die Ergebnisse Ihrer Ausführung.

  7. Beenden Sie den Worker.