AWS Step Functions est un service de conversion de composants de microservice en workflows.
Avec Step Functions, vous pouvez contrôler diverses actions en fonction de l'état. Les états sont les suivants.
Statut | contrôle |
---|---|
Task | Travaillez sur la machine d'état |
Choice | Choisissez entre les options d'exécution |
Fail or Succeed | Arrêter l'exécution en cas d'échec ou de succès |
Pass | Passez simplement l'entrée à la sortie ou sortez des données fixes |
Wait | Heure fixe ou heure spécifiée/Fournir un délai jusqu'à la date |
Parallel | Démarrer une branche d'exécution parallèle |
Map | Répéter les étapes de manière dynamique |
Les services suivants peuvent être spécifiés pour les fonctions de tâche d'étape.
Step Functions a une très large gamme, et même si vous regardez uniquement Step Functions + Lambda, elle est assez large. Étant donné que le contenu de l'article peut être énorme, nous ciblerons le contenu suivant pour cet article. La prochaine fois, j'aimerais couvrir les parties telles que la transmission de paramètres, la modification des tâches en fonction des conditions et l'exécution d'autres services.
SAM Pour SAM, voir ci-dessous.
Tout d'abord, créez un projet Hello World avec Runtime en 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
Cette fois, nous n'avons pas besoin d'API Gateway, alors éditez template.yml
comme suit.
ʻAWS :: Serverless :: Function n'a pas besoin de définir ʻEvents
.
De plus, les «sorties» lui-même sont inutiles.
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
Une fois enregistré, exécutez sam build
et sam deploy --guided
pour déployer.
Tout d'abord, faisons les préparatifs nécessaires pour configurer la machine à états.
Il ajoute une définition de rôle afin qu'il puisse être appelé à partir de la fonction Step en tant que paramètre de la fonction Lambda.
Les modèles créés dans Hello World attribuent un rôle par défaut à la fonction Lambda, vous devez donc le créer et l'attribuer explicitement.
Jouons maintenant avec 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
Ensuite, créez la définition de machine d'état au format Json. Commencez par créer un répertoire dans lequel les fichiers seront placés, puis créez-y un nouveau fichier.
$ mkdir step_functions
$ touch step_functions/state_machine.json
Ensuite, définissez la machine à états. La définition ci-dessous est une définition très simple qui appelle simplement la fonction Lambda de hello_world et la termine, sans conditions ni paramètres.
step_functions/state_machine.json
{
"StartAt": "hello world",
"States": {
"hello world": {
"Type": "Task",
"Resource": "${HelloWorldFunction}",
"End": true
}
}
}
Enfin, ajoutons la définition de la machine d'état à 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
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
Puis exécutez vers sam build
, sam deploy --guided
.
Tout d'abord, vérifions l'état actuel. Dans la console de gestion, sélectionnez «Step Functions». Vous pouvez voir que la machine d'état est déployée.
Jetons un coup d'œil au contenu de la machine à états ici. En regardant le contenu de la «définition», je pense que cela ressemble à ce qui suit.
Vous pouvez voir que hello_world
est appelé.
Vous pouvez également voir que la partie Resource
du contenu Json de" Definition "a été remplacée par l'ARN de la fonction Lambda.
Maintenant, exécutons la machine à états. Appuyez sur le bouton Démarrer l'exécution de l'onglet Exécuter pour exécuter la machine d'état.
Cette fois, les paramètres, etc. ne sont pas reçus du côté Lambda, il est donc possible d'exécuter l'entrée telle quelle.
L'exécution est terminée immédiatement et vous pouvez vérifier l'historique des événements.
Si vous vérifiez la Cloud Watch liée, vous pouvez être sûr que la fonction Lambda est appelée.
Cette fois, puisqu'il s'agit de l'opération de base dans les bases, je pense qu'il est important de supprimer fermement ce point en premier. La prochaine fois, j'aimerais discuter de la configuration des paramètres, des appels autres que Lambda à partir de Task et du branchement conditionnel.
https://github.com/hito-psv/sam-demo-004