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.
Liste der bewährten Methoden
- Optimierung der Kosten mithilfe von Express Workflows
- Zustandsmaschinen und Aktivitäten in Step Functions kennzeichnen
- Verwendung von Timeouts zur Vermeidung von festgefahrenen Step Functions Functions-Workflow-Ausführungen
- Amazon S3 verwenden, ARNs anstatt große Nutzlasten in Step Functions zu übergeben
- Neue Ausführungen starten, um zu verhindern, dass das Verlaufsquota in Step Functions erreicht wird
- Behandeln Sie vorübergehende Lambda-Serviceausnahmen
- Vermeidung von Latenz bei der Abfrage von Aktivitätsaufgaben
- CloudWatch Protokolliert die Größenbeschränkungen der Ressourcenrichtlinie
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
-
Öffnen Sie die Step Functions Functions-Konsole
. -
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.
-
Wählen Sie „In neu kopieren“.
Workflow Studio wird geöffnet und Entwurfsmodus zeigt den Workflow der ausgewählten Zustandsmaschine an.
-
(Optional) Aktualisieren Sie den Workflow-Entwurf.
-
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.
-
(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 denResource
Namen von ändern. -
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
liest den Inhalt einer JSON Datei, die in einem bestimmten Amazon S3 S3-Bucket gespeichert ist.pass-large-payload
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 werden
.amzn-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 lautet
ExecutionSucceeded
, wird die Ausführung erfolgreich abgeschlossen. -
Wenn die Ereignisnummer 25.000 nicht angegeben ist
ExecutionSucceeded
, wird dasExecutionFailed
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:
-
Verwenden Sie den Status Map im Modus Verteilt. In diesem Modus führt der
Map
Status jede Iteration als untergeordnete Workflow-Ausführung aus, wodurch eine hohe Parallelität von bis zu 10.000 parallel untergeordneten Workflow-Ausführungen ermöglicht wird. Jede untergeordnete Workflow-Ausführung hat ihren eigenen Ausführungsverlauf, der von dem des übergeordneten Workflows getrennt ist. -
Starten Sie eine neue State-Machine-Ausführung direkt vom
Task
Status einer laufenden Ausführung aus. Um solche verschachtelten Workflow-Ausführungen zu starten, verwenden Sie dieStartExecution
API Aktion von Step Functions in der übergeordneten Zustandsmaschine zusammen mit den erforderlichen Parametern. Weitere Informationen zur Verwendung verschachtelter Workflows finden Sie unter Starten Sie Workflow-Ausführungen von einem Aufgabenstatus aus in Step Functions oder Verwenden einer Step Functions API Functions-Aktion, um ein neues Ausführungs-Tutorial fortzusetzen.Tipp
So stellen Sie ein Beispiel für einen verschachtelten Workflow in Ihrem AWS-Konto, siehe Modul 13 — Verschachtelte Express-Workflows
. -
Implementieren Sie ein Muster, das eine verwendet AWS Lambda Funktion, die eine neue Ausführung Ihrer Zustandsmaschine starten kann, um die laufende Arbeit auf mehrere Workflow-Ausführungen aufzuteilen. Weitere Informationen finden Sie im Tutorial Verwenden einer Lambda-Funktion, um eine neue Ausführung in Step Functions fortzusetzen.
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
, ServiceException
AWSLambdaException
, 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.
gemeldet. Um einen Lambda-Serviceausnahmefehler erneut zu versuchen, können Sie den folgenden ErrorName
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.Unknown
States.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 taskToken
genau 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.