Utilisation AWS CloudFormation pour créer un flux de travail dans Step Functions - AWS Step Functions

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation AWS CloudFormation pour créer un flux de travail dans Step Functions

Dans ce didacticiel, vous allez créer un AWS Lambda fonction utilisant AWS CloudFormation. Vous utiliserez le AWS CloudFormation console et YAML modèle pour créer une pile (IAMrôles, fonction Lambda et machine à états). Ensuite, vous utiliserez la console Step Functions pour démarrer l'exécution de la machine à états.

Pour plus d'informations, consultez la section CloudFormation Utilisation des modèles et la AWS::StepFunctions::StateMachine ressource du AWS CloudFormation Guide de l'utilisateur

Étape 1 : Configurez votre AWS CloudFormation modèle

Avant d'utiliser les exemples de modèles, vous devez comprendre comment déclarer les différentes parties d'un AWS CloudFormation modèle.

Pour créer un IAM rôle pour Lambda

Définissez la politique de confiance associée au IAM rôle de la fonction Lambda. Les exemples suivants définissent une politique de confiance à l'aide de YAML ouJSON.

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" } ] } }

Pour créer une fonction Lambda

Définissez les propriétés suivantes pour une fonction Lambda qui imprimera le message. Hello World

Important

Assurez-vous que votre fonction Lambda est sous la même AWS compte et Région AWS en tant que machine d'État.

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" } },

Pour créer un IAM rôle pour l'exécution de la machine à états

Définissez la politique de confiance associée au IAM rôle pour l'exécution de la machine à états.

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": "*" } ] } } ] } },

Pour créer une machine à états Lambda

Définissez la machine à états Lambda.

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" ] } } }

Étape 2 : utilisez le AWS CloudFormation modèle pour créer une machine à états Lambda

Une fois que vous aurez compris les composants du AWS CloudFormation modèle, vous pouvez les assembler et utiliser le modèle pour créer un AWS CloudFormation pile.

Pour créer la machine à états Lambda

  1. Copiez les exemples de données suivants dans un fichier nommé d'après l'MyStateMachine.yamlYAMLexemple ou MyStateMachine.json pourJSON.

    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. Ouvrez le fichier AWS CloudFormation console et choisissez Create Stack.

  3. Sur la page Sélectionner un modèle, choisissez Télécharger un modèle sur Amazon S3. Choisissez votre fichier MyStateMachine, puis choisissez Suivant.

  4. Sur la page Spécifier les détails, pour Nom de la pile, tapez MyStateMachine, puis choisissez Suivant.

  5. Dans la page Options, choisissez Suivant.

  6. Sur la page d'évaluation, choisissez Je reconnais que AWS CloudFormation peut créer des IAM ressources. puis choisissez Create.

    AWS CloudFormation commence à créer la MyStateMachine pile et affiche le statut CREATE_IN_ PROGRESS. Lorsque le processus est terminé, AWS CloudFormation affiche le COMPLETE statut CREATE_.

  7. (Facultatif) Pour afficher les ressources de votre pile, sélectionnez la pile et choisissez l'onglet Ressources.

Étape 3 : démarrer une exécution de State Machine

Après avoir créé votre machine d'état Lambda, vous pouvez commencer son exécution.

Pour démarrer l'exécution de la machine d'état

  1. Ouvrez la console Step Functions et choisissez le nom de la machine à états que vous avez créée à l'aide de AWS CloudFormation.

  2. Dans la page MyStateMachine-ABCDEFGHIJ1Kpage, choisissez Nouvelle exécution.

    La page Nouvelle exécution s'affiche.

  3. (Facultatif) Entrez un nom d'exécution personnalisé pour remplacer le nom par défaut généré.

    ASCIINon-noms et journalisation

    Step Functions accepte les noms des machines d'état, des exécutions, des activités et des étiquettes contenant des caractères autres que des ASCII caractères. Comme ces caractères ne fonctionneront pas avec Amazon CloudWatch, nous vous recommandons de n'utiliser que des ASCII caractères afin de pouvoir suivre les statistiques CloudWatch.

  4. Choisissez Démarrer une exécution.

    Une nouvelle exécution de votre machine d'état commence et une nouvelle page indiquant votre exécution en cours s'affiche.

  5. (Facultatif) Dans la section Execution Details (Détails de l'exécution), choisissez Execution Status (Statut de l'exécution) et les horodatages Started (Démarré) et Closed (Fermé).

  6. Pour afficher les résultats de votre exécution, choisissez Sortie.