Erstellen einer Lambda-Zustandsmaschine für Step Functions mitAWS CloudFormation - 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 einer Lambda-Zustandsmaschine für Step Functions mitAWS CloudFormation

In diesem Tutorial erfahren Sie, wie Sie mit AWS CloudFormationeine einfache AWS Lambda-Funktion erstellen können. Du wirst das benutzenAWS CloudFormationKonsole und eine YAML-Vorlage zum Erstellen desstapeln(IAM-Rollen, die Lambda-Funktion und die Zustandsmaschine). Dann benutzen Sie denAWS Step Functions-Konsole zum Starten der Ausführung des Zustandsautomaten.

Weitere Informationen finden Sie unterArbeiten mit CloudFormation Vorlagenund derAWS::StepFunctions::StateMachineRessource in derAWS CloudFormationBenutzerhandbuch.

Schritt 1: Einrichten IhrerAWS CloudFormationMuster

Bevor Sie die Beispielvorlagen verwenden, sollten Sie verstehen, wie die verschiedenen Teile einer AWS CloudFormation-Vorlage deklariert werden.

So erstellen Sie eine IAM-Rolle für Lambda

Definieren Sie die der IAM-Rolle für die Lambda-Funktion zugeordnete Vertrauensrichtlinie. In den folgenden Beispielen wird eine Vertrauensrichtlinie mit YAML oder JSON definiert.

YAML
LambdaExecutionRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: "sts:AssumeRole"
JSON
"LambdaExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } }

So erstellen Sie eine Lambda-Funktion:

Definieren Sie die folgenden Eigenschaften für eine Lambda-Funktion, die die Nachricht ausgibtHello World.

Wichtig

Stellen Sie sicher, dass Ihre Lambda-Funktion unter derselben stehtAWS-Konto undAWSDie Region als Ihre Zustandsmaschine.

YAML
MyLambdaFunction: Type: "AWS::Lambda::Function" Properties: Handler: "index.handler" Role: !GetAtt [ LambdaExecutionRole, Arn ] Code: ZipFile: | exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; Runtime: "nodejs12.x" Timeout: "25"
JSON
"MyLambdaFunction": { "Type": "AWS::Lambda::Function", "Properties": { "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "LambdaExecutionRole", "Arn" ] }, "Code": { "ZipFile": "exports.handler = (event, context, callback) => {\n callback(null, \"Hello World!\");\n};\n" }, "Runtime": "nodejs12.x", "Timeout": "25" } },

So erstellen Sie eine IAM-Rolle für die State-Machine-Ausführung

Definieren Sie die Vertrauensrichtlinie, die der IAM-Rolle für die State-Machine-Ausführung zugeordnet ist.

YAML
StatesExecutionRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: - !Sub states.${AWS::Region}.amazonaws.com Action: "sts:AssumeRole" Path: "/" Policies: - PolicyName: StatesExecutionPolicy PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - "lambda:InvokeFunction" Resource: "*"
JSON
"StatesExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ { "Fn::Sub": "states.${AWS::Region}.amazonaws.com" } ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "StatesExecutionPolicy", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "*" } ] } } ] } },

So erstellen Sie eine Lambda-Zustandsmaschine

Definieren Sie die Lambda-Zustandsmaschine.

YAML
MyStateMachine: Type: "AWS::StepFunctions::StateMachine" Properties: DefinitionString: !Sub - |- { "Comment": "A Hello World example using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "${lambdaArn}", "End": true } } } - {lambdaArn: !GetAtt [ MyLambdaFunction, Arn ]} RoleArn: !GetAtt [ StatesExecutionRole, Arn ]
JSON
"MyStateMachine": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { "DefinitionString": { "Fn::Sub": [ "{\n \"Comment\": \"A Hello World example using an AWS Lambda function\",\n \"StartAt\": \"HelloWorld\",\n \"States\": {\n \"HelloWorld\": {\n \"Type\": \"Task\",\n \"Resource\": \"${lambdaArn}\",\n \"End\": true\n }\n }\n}", { "lambdaArn": { "Fn::GetAtt": [ "MyLambdaFunction", "Arn" ] } } ] }, "RoleArn": { "Fn::GetAtt": [ "StatesExecutionRole", "Arn" ] } } }

Schritt 2: Verwenden derAWS CloudFormationVorlage zum Erstellen einer Lambda State Machine

Sobald Sie die Komponenten derAWS CloudFormationVorlage können Sie sie zusammenstellen und die Vorlage verwenden, um eineAWS CloudFormation-Stack.

So erstellen Sie die Lambda-Zustandsmaschine

  1. Kopieren Sie die folgenden Beispieldaten in eine Datei mit dem Namen MyStateMachine.yaml für das YAML-Beispiel oder MyStateMachine.json für JSON.

    YAML
    AWSTemplateFormatVersion: "2010-09-09" Description: "An example template with an IAM role for a Lambda state machine." Resources: LambdaExecutionRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: "sts:AssumeRole" MyLambdaFunction: Type: "AWS::Lambda::Function" Properties: Handler: "index.handler" Role: !GetAtt [ LambdaExecutionRole, Arn ] Code: ZipFile: | exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; Runtime: "nodejs12.x" Timeout: "25" StatesExecutionRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: - !Sub states.${AWS::Region}.amazonaws.com Action: "sts:AssumeRole" Path: "/" Policies: - PolicyName: StatesExecutionPolicy PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - "lambda:InvokeFunction" Resource: "*" MyStateMachine: Type: "AWS::StepFunctions::StateMachine" Properties: DefinitionString: !Sub - |- { "Comment": "A Hello World example using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "${lambdaArn}", "End": true } } } - {lambdaArn: !GetAtt [ MyLambdaFunction, Arn ]} RoleArn: !GetAtt [ StatesExecutionRole, Arn ]
    JSON
    { "AWSTemplateFormatVersion": "2010-09-09", "Description": "An example template with an IAM role for a Lambda state machine.", "Resources": { "LambdaExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } } }, "MyLambdaFunction": { "Type": "AWS::Lambda::Function", "Properties": { "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "LambdaExecutionRole", "Arn" ] }, "Code": { "ZipFile": "exports.handler = (event, context, callback) => {\n callback(null, \"Hello World!\");\n};\n" }, "Runtime": "nodejs12.x", "Timeout": "25" } }, "StatesExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ { "Fn::Sub": "states.${AWS::Region}.amazonaws.com" } ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "StatesExecutionPolicy", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "*" } ] } } ] } }, "MyStateMachine": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { "DefinitionString": { "Fn::Sub": [ "{\n \"Comment\": \"A Hello World example using an AWS Lambda function\",\n \"StartAt\": \"HelloWorld\",\n \"States\": {\n \"HelloWorld\": {\n \"Type\": \"Task\",\n \"Resource\": \"${lambdaArn}\",\n \"End\": true\n }\n }\n}", { "lambdaArn": { "Fn::GetAtt": [ "MyLambdaFunction", "Arn" ] } } ] }, "RoleArn": { "Fn::GetAtt": [ "StatesExecutionRole", "Arn" ] } } } } }
  2. Öffnen Sie die AWS CloudFormation-Konsole und wählen Sie Create Stack (Stack erstellen) aus.

  3. Wählen Sie auf der Seite Select Template (Vorlage auswählen) Upload a template to Amazon S3 (Eine Vorlage zu Amazon S3 hochladen) aus. Wählen Sie Ihre Datei MyStateMachine und anschließend Next aus.

  4. Geben Sie auf der Seite Specify Details (Details angeben) unter Stack name (Stack-Name) MyStateMachine ein und wählen Sie dann Next (Weiter) aus.

  5. Wählen Sie auf der Seite Options Weiter.

  6. Auf derPrüfenSeite, wählenIch erkenne dies anAWS CloudFormationkönnte IAM-Ressourcen erstellen.und dann wählenErstellen.

    AWS CloudFormation beginnt mit der Erstellung des MyStateMachine-Stacks und zeigt den Status CREATE_IN_PROGRESS an. Wenn der Prozess abgeschlossen ist, zeigt AWS CloudFormation den Status CREATE_COMPLETE an.

  7. (Optional) Wählen Sie zum Anzeigen der Ressourcen in Ihrem Stack den Stack und anschließend die Registerkarte Resources aus.

    
                Anzeige von Ressourcen

Schritt 3: Starten einer State-Machine-Ausführung

Nachdem Sie Ihren Lambda Zustandsautomaten erstellt haben, können Sie mit der Ausführung beginnen.

Starten der Ausführung des Zustandsautomaten

  1. Öffnen derStep Functionsund wählen Sie den Namen des Zustandsautomaten aus, mit der Sie erstellt habenAWS CloudFormation.

  2. Auf derMyStateMachine- ABCDEFGHIJ 1 KMSeite, wählenNeue Ausführung.

    Die Seite New execution wird angezeigt.

  3. (Optional) Um Ihre Ausführung zu identifizieren, können Sie einen Namen dafür in derNameBox. Standardmäßig generiert Step Functions automatisch einen eindeutigen Ausführungsnamen.

    Anmerkung

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

  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. (Optional) Überprüfen Sie unter Execution Details (Ausführungsdetails) den Execution Status (Ausführungsstatus) sowie die Zeitstempel Started (Gestartet) und Closed (Geschlossen).

  6. Um die Ergebnisse Ihrer Ausführung anzuzeigen, wählen Sie Output (Ausgabe).