AWS Step Functions ist ein Service zum Konvertieren von Microservice-Komponenten in Workflows.
Mit Schrittfunktionen können Sie je nach Status verschiedene Aktionen steuern. Die Zustände sind wie folgt.
Status | Steuerung |
---|---|
Task | Arbeiten Sie an der Zustandsmaschine |
Choice | Wählen Sie zwischen Ausführungsoptionen |
Fail or Succeed | Beenden Sie die Ausführung bei Fehler oder Erfolg |
Pass | Übergeben Sie einfach die Eingabe an die Ausgabe oder geben Sie einige feste Daten aus |
Wait | Feste Zeit oder festgelegte Zeit/Geben Sie eine Verzögerung bis zum Datum an |
Parallel | Starten Sie einen parallelen Ausführungszweig |
Map | Schritte dynamisch wiederholen |
Die folgenden Dienste können für Task of Step-Funktionen angegeben werden.
Step Functions hat eine sehr große Bandbreite, und selbst wenn Sie Step Functions + Lambda allein betrachten, ist es ziemlich breit. Da der Inhalt des Beitrags sehr groß sein kann, werden wir den folgenden Inhalt für diesen Beitrag verwenden. Das nächste Mal möchte ich die Teile wie das Übergeben von Parametern, das Ändern von Aufgaben in Abhängigkeit von den Bedingungen und das Ausführen eines anderen Dienstes behandeln.
--Erstellen Sie die Lambda-Funktion (SAM)
SAM Für SAM siehe unten.
Erstellen Sie zunächst ein Hello World-Projekt mit Runtime in Python (3.8).
$ sam init --runtime=python3.8
Which template source would you like to use?
1 - AWS Quick Start Templates
2 - Custom Template Location
Choice: 1
Project name [sam-app]:
Cloning app templates from https://github.com/awslabs/aws-sam-cli-app-templates.git
AWS quick start application templates:
1 - Hello World Example
2 - EventBridge Hello World
3 - EventBridge App from scratch (100+ Event Schemas)
4 - Step Functions Sample App (Stock Trader)
5 - Elastic File System Sample App
Template selection: 1
-----------------------
Generating application:
-----------------------
Name: sam-app
Runtime: python3.8
Dependency Manager: pip
Application Template: hello-world
Output Directory: .
Next steps can be found in the README file at ./sam-app/README.md
Dieses Mal benötigen wir kein API-Gateway. Bearbeiten Sie daher die Datei "template.yml" wie folgt. Sie müssen "Ereignisse" nicht in "AWS :: Serverless :: Function" definieren. Auch "Outputs" selbst sind nicht erforderlich.
template.yml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
sam-app
Sample SAM Template for sam-app
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
Timeout: 3
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.8
Führen Sie nach dem Speichern "sam build" und "sam deploy --guided" aus, um sie bereitzustellen.
Lassen Sie uns zunächst die notwendigen Vorbereitungen treffen, um die Zustandsmaschine zu konfigurieren.
Es wird eine Rollendefinition hinzugefügt, damit diese über die Schrittfunktion als Einstellung für die Lambda-Funktion aufgerufen werden kann.
In Hello World erstellte Vorlagen weisen der Lambda-Funktion eine Standardrolle zu, sodass Sie sie explizit erstellen und zuweisen müssen.
Spielen wir jetzt mit template.yml
.
template.yml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
sam-app
Sample SAM Template for sam-app
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
Timeout: 3
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.8
Role: !GetAtt HelloWorldFunctionRole.Arn
HelloWorldFunctionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- sts:AssumeRole
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
- arn:aws:iam::aws:policy/AWSStepFunctionsReadOnlyAccess
Erstellen Sie als Nächstes die Zustandsmaschinendefinition im Json-Format. Erstellen Sie zunächst ein Verzeichnis, in dem die Dateien abgelegt werden, und erstellen Sie dort eine neue Datei.
$ mkdir step_functions
$ touch step_functions/state_machine.json
Definieren Sie als Nächstes die Zustandsmaschine.
step_functions/state_machine.json
{
"StartAt": "hello world",
"States": {
"hello world": {
"Type": "Task",
"Resource": "${HelloWorldFunction}",
"End": true
}
}
}
template.yml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
sam-app
Sample SAM Template for sam-app
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
Timeout: 3
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.8
Role: !GetAtt HelloWorldFunctionRole.Arn
HelloWorldFunctionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- sts:AssumeRole
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
- arn:aws:iam::aws:policy/AWSStepFunctionsReadOnlyAccess
StateMachine:
Type: AWS::Serverless::StateMachine
Properties:
DefinitionUri: step_functions/state_machine.json
DefinitionSubstitutions:
HelloWorldFunction: !GetAtt HelloWorldFunction.Arn
Role: !GetAtt StateMachineRole.Arn
StateMachineRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- states.amazonaws.com
Action:
- sts:AssumeRole
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaRole
- arn:aws:iam::aws:policy/CloudWatchLogsFullAccess
Hinzufügen einer Zustandsmaschinendefinition zu einer SAM-Vorlage Zum Schluss fügen wir template.yml
eine Zustandsmaschinendefinition hinzu. Führen Sie dann "sam build" und "sam deploy --guided" aus. Lassen Sie uns zuerst den aktuellen Status überprüfen. Wählen Sie in der Verwaltungskonsole "Schrittfunktionen".
Sie können sehen, dass die Zustandsmaschine bereitgestellt wird.
Schauen wir uns hier den Inhalt der Zustandsmaschine an. Wenn ich mir den Inhalt der "Definition" anschaue, denke ich, dass es wie folgt aussieht.
Sie können sehen, dass hello_world
heißt.
Sie können auch sehen, dass der "Resource" -Teil des Json-Inhalts von "Definition" durch den ARN der Lambda-Funktion ersetzt wurde.
Lassen Sie uns nun die Zustandsmaschine ausführen. Klicken Sie auf der Registerkarte Ausführen auf die Schaltfläche Ausführung starten, um die Zustandsmaschine auszuführen.
Dieses Mal werden die Parameter usw. nicht auf der Lambda-Seite empfangen, daher ist es in Ordnung, die Eingabe so auszuführen, wie sie ist.
Die Ausführung ist sofort abgeschlossen und Sie können den Ereignisverlauf überprüfen.
Wenn Sie die verknüpfte Cloud Watch überprüfen, können Sie sicher sein, dass die Lambda-Funktion aufgerufen wird.
Dieses Mal halte ich es für wichtig, diesen Punkt zuerst fest zu unterdrücken, da dies die grundlegende Operation in den Grundlagen ist. Das nächste Mal möchte ich das Einstellen von Parametern, das Aufrufen anderer als Lambda von Task und die bedingte Verzweigung diskutieren.
https://github.com/hito-psv/sam-demo-004
Recommended Posts