Bewährte Methoden für 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.

Bewährte Methoden für Step Functions

Die folgenden Themen sind bewährte Methoden, die Sie bei der Verwaltung und Optimierung Ihrer Step Functions Functions-Workflows unterstützen sollen.

Optimierung der Kosten mithilfe von Express Workflows

Step Functions bestimmt die Preise für Standard- und Express-Workflows auf der Grundlage des Workflowtyps, den Sie zum Erstellen Ihrer Zustandsmaschinen verwenden. Um die Kosten Ihrer serverlosen Workflows zu optimieren, können Sie eine oder beide der folgenden Empfehlungen befolgen:

Informationen dazu, wie sich die Wahl eines Standard- oder Express-Workflowtyps auf die Abrechnung auswirkt, finden Sie unter AWS Step Functions Preisgestaltung.

Nest Express-Workflows innerhalb von Standard-Workflows

Step Functions führt Workflows aus, die eine begrenzte Dauer und Anzahl von Schritten haben. Einige Workflows können die Ausführung innerhalb eines kurzen Zeitraums abschließen. Andere erfordern möglicherweise eine Kombination aus langwierigen high-event-rate Workflows und Workflows. Mit Step Functions können Sie große, komplexe Workflows aus mehreren kleineren, einfacheren Workflows erstellen.

Um beispielsweise einen Workflow für die Auftragsabwicklung zu erstellen, können Sie alle Aktionen, die nicht idempotent sind, in einen Standard-Workflow aufnehmen. Dies könnte Aktionen wie die Genehmigung von Bestellungen durch menschliche Interaktion und die Bearbeitung von Zahlungen beinhalten. Anschließend können Sie eine Reihe idempotenter Aktionen, wie das Senden von Zahlungsbenachrichtigungen und die Aktualisierung des Produktbestands, in einem Express-Workflow kombinieren. Sie können diesen Express-Workflow innerhalb des Standard-Workflows verschachteln. In diesem Beispiel wird der Standard-Workflow als Parent State Machine bezeichnet. Der verschachtelte Express-Workflow wird als Child State Machine bezeichnet.

Konvertieren Sie Standard-Workflows in Express-Workflows

Sie können Ihre vorhandenen Standard-Workflows in Express-Workflows konvertieren, wenn sie die folgenden Anforderungen erfüllen:

  • Der Workflow muss seine Ausführung innerhalb von fünf Minuten abschließen.

  • Der Workflow entspricht einem at-least-onceAusführungsmodell. Das bedeutet, dass jeder Schritt im Workflow mehr als genau einmal ausgeführt werden kann.

  • Der Workflow verwendet nicht die .waitForTaskToken oder .sync Service-Integrationsmuster.

Wichtig

Express-Workflows verwenden Amazon CloudWatch Logs, um Ausführungsverläufe aufzuzeichnen. Bei der Verwendung CloudWatch von Logs fallen zusätzliche Kosten an.

Um einen Standard-Workflow mithilfe der Konsole in einen Express-Workflow zu konvertieren
  1. Öffnen Sie die Step Functions Functions-Konsole.

  2. Wählen Sie auf der Seite State Machines einen State-Machine vom Typ Standard aus, um ihn zu öffnen.

    Tipp

    Wählen Sie in der Dropdownliste Beliebiger Typ die Option Standard aus, um die Liste der Zustandsmaschinen zu filtern und nur Standard-Workflows anzuzeigen.

  3. Wählen Sie „In neu kopieren“.

    Workflow Studio wird geöffnet und Entwurfsmodus zeigt den Workflow der ausgewählten Zustandsmaschine an.

  4. (Optional) Aktualisieren Sie den Workflow-Entwurf.

  5. Geben Sie einen Namen für Ihre Zustandsmaschine an. 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.

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

    Stellen Sie sicher, dass Sie als Typ die Option Express wählen. Behalten Sie alle anderen Standardauswahlen in den State-Machine-Einstellungen bei.

    Anmerkung

    Wenn Sie einen Standard-Workflow konvertieren, der zuvor in definiert wurde AWS CDK oder AWS SAM, müssen Sie den Wert Type und den Resource Namen von ändern.

  7. Wählen Sie im Dialogfeld „Rollenerstellung bestätigen“ die Option „Bestätigen“, 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 Prinzipalen in der IAM Richtlinie entfernen).

Weitere Informationen zu bewährten Methoden und Richtlinien für die Verwaltung der Kostenoptimierung für Ihre Workflows finden Sie unter Kostengünstig gestalten AWS Step Functions Workflows.

Zustandsmaschinen und Aktivitäten in Step Functions kennzeichnen

AWS Step Functions unterstützt die Kennzeichnung von Zustandsmaschinen (sowohl Standard als auch Express) und Aktivitäten. Mithilfe von Tags können Sie Ihre Ressourcen verfolgen und verwalten und für mehr Sicherheit in Ihrem AWS Identity and Access Management (IAM) Richtlinien. Nachdem Sie die Ressourcen von Step Functions markiert haben, können Sie sie verwalten mit AWS Resource Groups. Wie das geht, erfahren Sie im AWS Resource Groups Benutzerleitfaden.

Bei der Tag-basierten Autorisierung erben die Ressourcen zur Ausführung von Zustandsmaschinen, wie im folgenden Beispiel gezeigt, die einem Zustandsmaschine zugewiesenen Tags.

arn:<partition>:states:<Region>:<account-id>:execution:<StateMachineName>:<ExecutionId>

Wenn Sie aufrufen DescribeExecutionoder eine andere, APIs in der Sie die Ausführungsressource angebenARN, verwendet Step Functions Tags, die der Zustandsmaschine zugeordnet sind, um die Anfrage anzunehmen oder abzulehnen, während die Tag-basierte Autorisierung durchgeführt wird. Auf diese Weise können Sie den Zugriff auf Zustandsmaschinenausführungen auf Zustandsmaschinen-Ebene zulassen oder verweigern.

Weitere Informationen zu Einschränkungen in Bezug auf das Markieren von Ressourcen finden Sie unter Einschränkungen im Zusammenhang mit dem Tagging.

Markieren für die Kostenzuordnung

Mithilfe von Tags zur Kostenzuweisung können Sie den Zweck einer Zustandsmaschine identifizieren und diese Organisation in Ihrem Unternehmen wiedergeben AWS Rechnung. Melde dich an, um deine zu bekommen AWS Kontorechnung, die die Tag-Schlüssel und -Werte enthält. Weitere Informationen finden Sie unter Einen monatlichen Kostenverteilungsbericht einrichten im AWS Billing Einzelheiten zur Einrichtung von Berichten finden Sie im Benutzerhandbuch.

Sie könnten beispielsweise wie folgt Tags hinzufügen, die Ihre Kostenstelle und den Zweck Ihrer Step Functions Functions-Ressourcen repräsentieren.

Ressource Schlüssel Wert
StateMachine1 Cost Center 34567
Application Image processing
StateMachine2 Cost Center 34567
Application Rekognition processing

Markieren für-Sicherheit

IAMunterstützt die Steuerung des Zugriffs auf Ressourcen anhand von Tags. Um den Zugriff anhand von Tags zu steuern, geben Sie Informationen zu Ihren Ressourcen-Tags im Bedingungselement einer IAM Richtlinie an.

Sie könnten beispielsweise den Zugriff auf alle Step Functions-Ressourcen einschränken, die ein Tag mit dem Schlüssel environment und dem Wert enthaltenproduction.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "states:TagResource", "states:DeleteActivity", "states:DeleteStateMachine", "states:StopExecution" ], "Resource": "*", "Condition": { "StringEquals": {"aws:ResourceTag/environment": "production"} } } ] }

Weitere Informationen finden Sie im IAM Benutzerhandbuch unter Steuern des Zugriffs mithilfe von Tags.

Verwaltung von Tags in der Step Functions Functions-Konsole

Sie können Tags für Ihre Zustandsmaschinen in der Step Functions Functions-Konsole anzeigen und verwalten. Wählen Sie auf der Seite Details eines Zustandsautomaten die Option Tags aus.

Verwaltung von Tags mit Step Functions API Functions-Aktionen

Verwenden Sie die folgenden API AktionenAPI, um Tags mithilfe der Step Functions zu verwalten:

Verwendung von Timeouts zur Vermeidung von festgefahrenen Step Functions Functions-Workflow-Ausführungen

Standardmäßig gibt die Sprache von Amazon States keine Timeouts für State-Machine-Definitionen an. Ohne ein explizites Timeout verlassen sich Step Functions oft ausschließlich auf die Antwort eines Aktivitätsmitarbeiters, um zu wissen, dass eine Aufgabe abgeschlossen ist. Wenn etwas schief geht und das TimeoutSeconds Feld nicht für den Task Status Activity oder angegeben ist, bleibt eine Ausführung hängen und wartet auf eine Antwort, die niemals kommen wird.

Um diese Situation zu vermeiden, geben Sie ein angemessenes Timeout an, wenn Sie eine Task Zustandsmaschine erstellen. Beispielsweise:

"ActivityState": { "Type": "Task", "Resource": "arn:aws:states:us-east-1:123456789012:activity:HelloWorld", "TimeoutSeconds": 300, "Next": "NextState" }

Wenn Sie einen Callback mit einem Task-Token verwenden (. waitForTaskToken), empfehlen wir, Heartbeats zu verwenden und das HeartbeatSeconds Feld zu Ihrer Task Statusdefinition hinzuzufügen. Sie können einen Wert festlegenHeartbeatSeconds, der unter dem Zeitlimit für die Aufgabe liegt. Wenn Ihr Workflow also mit einem Heartbeat-Fehler fehlschlägt, wissen Sie, dass es am Aufgabenfehler liegt und nicht daran, dass die Ausführung der Aufgabe viel Zeit in Anspruch nimmt.

{ "StartAt": "Push to SQS", "States": { "Push to SQS": { "Type": "Task", "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken", "HeartbeatSeconds": 600, "Parameters": { "MessageBody": { "myTaskToken.$": "$$.Task.Token" }, "QueueUrl": "https://sqs.us-east-1.amazonaws.com/123456789012/push-based-queue" }, "ResultPath": "$.SQS", "End": true } } }

Weitere Informationen finden Sie Workflow-Status der Aufgabe in der Sprachdokumentation von Amazon States.

Anmerkung

Sie können mithilfe des TimeoutSeconds Felds in Ihrer Amazon States-Sprachdefinition ein Timeout für Ihren State Machine festlegen. Weitere Informationen finden Sie unter Zustandsmaschinenstruktur in Amazon States Language für Step Functions Functions-Workflows.

Amazon S3 verwenden, ARNs anstatt große Nutzlasten in Step Functions zu übergeben

Ausführungen, die große Datennutzlasten zwischen Zuständen übergeben, können beendet werden. Wenn die Daten, die Sie zwischen Bundesstaaten übertragen, auf über 256 KB anwachsen könnten, verwenden Sie Amazon Simple Storage Service (Amazon S3), um die Daten zu speichern, und analysieren Sie den Amazon-Ressourcennamen (ARN) des Buckets im Payload Parameter, um den Bucket-Namen und den Schlüsselwert abzurufen. Alternativ passen Sie Ihre Implementierung an, sodass Sie in Ihren Ausführungen kleinere Nutzlasten übergeben.

Im folgenden Beispiel übergibt eine Zustandsmaschine Eingaben an eine AWS Lambda Funktion, die eine JSON Datei in einem Amazon S3 S3-Bucket verarbeitet. Nachdem Sie diese Zustandsmaschine ausgeführt haben, liest die Lambda-Funktion den Inhalt der JSON Datei und gibt den Dateiinhalt als Ausgabe zurück.

So erstellen Sie die Lambda-Funktion:

Die folgende Lambda-Funktion mit dem Namen pass-large-payload liest den Inhalt einer JSON Datei, die in einem bestimmten Amazon S3 S3-Bucket gespeichert ist.

Anmerkung

Nachdem Sie diese Lambda-Funktion erstellt haben, stellen Sie sicher, dass Sie ihrer IAM Rolle die entsprechende Berechtigung zum Lesen aus einem Amazon S3 S3-Bucket erteilen. Fügen Sie beispielsweise die ReadOnlyAccessAmazonS3-Berechtigung der Rolle der Lambda-Funktion hinzu.

import json import boto3 import io import os s3 = boto3.client('s3') def lambda_handler(event, context): event = event['Input'] final_json = str() s3 = boto3.resource('s3') bucket = event['bucket'].split(':')[-1] filename = event['key'] directory = "/tmp/{}".format(filename) s3.Bucket(bucket).download_file(filename, directory) with open(directory, "r") as jsonfile: final_json = json.load(jsonfile) os.popen("rm -rf /tmp") return final_json
Erstellen Sie die Zustandsmaschine

Die folgende Zustandsmaschine ruft die Lambda-Funktion auf, die Sie zuvor erstellt haben.

{ "StartAt":"Invoke Lambda function", "States":{ "Invoke Lambda function":{ "Type":"Task", "Resource":"arn:aws:states:::lambda:invoke", "Parameters":{ "FunctionName":"arn:aws:lambda:us-east-2:123456789012:function:pass-large-payload", "Payload":{ "Input.$":"$" } }, "OutputPath": "$.Payload", "End":true } } }

Anstatt eine große Datenmenge in der Eingabe zu übergeben, könnten Sie diese Daten in einem Amazon S3 S3-Bucket speichern und den Amazon-Ressourcennamen (ARN) des Buckets im Payload Parameter übergeben, um den Bucket-Namen und den Schlüsselwert zu erhalten. Ihre Lambda-Funktion kann dies dann verwenden, ARN um direkt auf die Daten zuzugreifen. Im Folgenden finden Sie eine Beispieleingabe für die State-Machine-Ausführung, bei der die Daten data.json in einem Amazon S3 S3-Bucket mit dem Namen gespeichert werdenamzn-s3-demo-large-payload-json.

{ "key": "data.json", "bucket": "arn:aws:s3:::amzn-s3-demo-large-payload-json" }

Neue Ausführungen starten, um zu verhindern, dass das Verlaufsquota in Step Functions erreicht wird

AWS Step Functions hat ein festes Kontingent von 25.000 Einträgen im Verlauf der Ausführungsereignisse. Wenn eine Ausführung 24.999 Ereignisse erreicht, wartet sie auf das nächste Ereignis.

  • Wenn die Ereignisnummer 25.000 lautetExecutionSucceeded, wird die Ausführung erfolgreich abgeschlossen.

  • Wenn die Ereignisnummer 25.000 nicht angegeben istExecutionSucceeded, wird das ExecutionFailed Ereignis protokolliert und die Ausführung der Zustandsmaschine schlägt fehl, da das Verlaufslimit erreicht ist

Um zu verhindern, dass dieses Kontingent für lang andauernde Ausführungen erreicht wird, können Sie eine der folgenden Problemumgehungen ausprobieren:

Behandeln Sie vorübergehende Lambda-Serviceausnahmen

AWS Lambda kann gelegentlich zu vorübergehenden Servicefehlern kommen. In diesem Fall führt der Aufruf von Lambda zu einem 500-Fehler, z. B.ClientExecutionTimeoutException, ServiceExceptionAWSLambdaException, oder. SdkClientException Es hat sich bewährt, diese Ausnahmen in Ihrer Zustandsmaschine proaktiv zu behandeln, um Ihre Lambda-Funktion Retry aufzurufen oder um den Fehler zu Catch beheben.

Lambda-Fehler werden als Lambda.ErrorName gemeldet. Um einen Lambda-Serviceausnahmefehler erneut zu versuchen, können Sie den folgenden Retry Code verwenden.

"Retry": [ { "ErrorEquals": [ "Lambda.ClientExecutionTimeoutException", "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException"], "IntervalSeconds": 2, "MaxAttempts": 6, "BackoffRate": 2 } ]
Anmerkung

Unbehandelte Fehler in Lambda werden wie Lambda.Unknown in der Fehlerausgabe gemeldet. Dazu gehören out-of-memory Fehler und Funktions-Timeouts. Sie können nach, oder abgleichen Lambda.UnknownStates.ALL, States.TaskFailed um diese Fehler zu behandeln. Wenn Lambda die maximale Anzahl von Aufrufen erreicht, lautet der Fehler. Lambda.TooManyRequestsException Weitere Informationen zu Lambda Handled und Unhandled Fehlern finden Sie FunctionError in der AWS Lambda Leitfaden für Entwickler.

Weitere Informationen finden Sie hier:

Vermeidung von Latenz bei der Abfrage von Aktivitätsaufgaben

Der GetActivityTask API ist so konzipiert, dass er taskTokengenau einmal zur Verfügung steht. Wenn ein taskToken während der Kommunikation mit einem Aktivitäts-Worker verloren geht, können mehrere GetActivityTask-Anfragen für 60 Sekunden blockiert werden, die auf eine Antwort warten, bis ein Timeout für GetActivityTask stattfindet.

Wenn Sie nur eine kleine Anzahl von Abrufen haben, die auf eine Antwort warten, ist es möglich, dass alle Anforderungen hinter der blockierten Anforderung auflaufen und anhalten. Wenn Sie jedoch eine große Anzahl ausstehender Umfragen für jede Aktivität haben Amazon Resource Name (ARN) und ein gewisser Prozentsatz Ihrer Anfragen wartet, können noch viele weitere Anfragen bearbeitet werden taskToken und mit der Bearbeitung beginnen.

Für Produktionssysteme empfehlen wir mindestens 100 offene Umfragen pro Aktivität ARN zu jedem Zeitpunkt. Wenn ein Abruf blockiert wird, und einen Teil dieser Abrufe dahinter auflaufen, gibt es nach wie vor viele weitere Anfragen, die ein taskToken erhalten, um weiterzuarbeiten, während die GetActivityTask-Anfrage blockiert ist.

So vermeiden Sie diese Art von Latenzproblemen beim Abrufen von Aufgaben

  • Implementieren Sie Ihre Poller als separate Threads aus der Arbeit in Ihrer Aktivitäts-Worker-Implementierung.

  • Führen Sie zu jedem Zeitpunkt mindestens 100 offene Umfragen pro Aktivität ARN durch.

    Anmerkung

    Die Skalierung auf 100 offene Umfragen pro Person ARN kann teuer sein. Beispielsweise ARN ist das Abfragen von 100 Lambda-Funktionen pro 100 Mal teurer als eine einzige Lambda-Funktion mit 100 Abfrage-Threads. Um sowohl die Latenz zu reduzieren als auch die Kosten zu minimieren, verwenden Sie eine Sprache mit asynchronem E/A und implementieren pro Worker mehrere Abfrage-Threads. Ein Beispiel für einen Aktivitäts-Worker, in dem die Poller-Threads unabhängig von der Arbeitsthreads sind, finden Sie unter Beispiel: Activity Worker in Ruby.

Weitere Informationen zu Aktivitäten und Aktivitäts-Workern finden Sie unter Erfahren Sie mehr über Aktivitäten in Step Functions.

CloudWatch Protokolliert die Größenbeschränkungen der Ressourcenrichtlinie

Wenn Sie eine Zustandsmaschine mit Protokollierung erstellen oder eine vorhandene Zustandsmaschine aktualisieren, um die Protokollierung zu aktivieren, muss Step Functions Ihre CloudWatch Logs-Ressourcenrichtlinie mit der von Ihnen angegebenen Protokollgruppe aktualisieren. CloudWatch Die Ressourcenrichtlinien für Protokolle sind auf 5.120 Zeichen begrenzt.

Wenn CloudWatch Logs feststellt, dass sich eine Richtlinie der Größenbeschränkung nähert, aktiviert CloudWatch Logs automatisch die Protokollierung für Protokollgruppen, die mit beginnen. /aws/vendedlogs/

Sie können Ihren CloudWatch Logs-Protokollgruppennamen ein Präfix voranstellen/aws/vendedlogs/, um die Größenbeschränkung der CloudWatch Logs-Ressourcenrichtlinie zu umgehen. Wenn Sie in der Step Functions Functions-Konsole eine Protokollgruppe erstellen, wird dem vorgeschlagenen Protokollgruppennamen bereits ein Präfix /aws/vendedlogs/states vorangestellt.

CloudWatch Logs hat außerdem ein Kontingent von 10 Ressourcenrichtlinien pro Region und Konto. Wenn Sie versuchen, die Protokollierung auf einem Zustandsmaschine zu aktivieren, der in einer Region bereits über 10 CloudWatch Logs-Ressourcenrichtlinien für ein Konto verfügt, wird der Zustandsmaschine nicht erstellt oder aktualisiert. Weitere Informationen zur Protokollierung von Zitaten finden Sie unter CloudWatch Protokollkontingente.

Wenn Sie Probleme beim Senden von Protokollen an CloudWatch Logs haben, finden Sie weitere Informationen unterTroubleshooting state machine logging to CloudWatch Logs. Weitere Informationen zur Protokollierung im Allgemeinen finden Sie unter Protokollierung aktivieren von AWS Dienste.