[PYTHON] [AWS] Play with Step Functions (SAM + Lambda) Part.1 (Basic)

Qu'est-ce que les fonctions Step?

AWS Step Functions est un service de conversion de composants de microservice en workflows.

Statut

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

Services disponibles dans Task

Les services suivants peuvent être spécifiés pour les fonctions de tâche d'étape.

L'objectif de cette fois

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.

supposition

SAM Pour SAM, voir ci-dessous.

Préparer la fonction Lambda

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.

Configurer une machine d'état avec des fonctions d'étape

Préparation

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

Ajouter une définition de machine d'état

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

Ajouter une définition de machine d'état au modèle SAM

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.

je vérifierai

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.

sfn1.png

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.

sfn2.png

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.

Essayez de courir

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.

sfn3.png

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.

sfn5.png

L'exécution est terminée immédiatement et vous pouvez vérifier l'historique des événements.

sfn6.png

Si vous vérifiez la Cloud Watch liée, vous pouvez être sûr que la fonction Lambda est appelée.

Résumé

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.

Exemple de référentiel de code

https://github.com/hito-psv/sam-demo-004

Recommended Posts

[AWS] Play with Step Functions (SAM + Lambda) Part.1 (Basic)
[AWS] Play with Step Functions (SAM + Lambda) Part.2 (Paramètres)
[AWS SAM] Créer une API avec DynamoDB + Lambda + API Gateway
Grattage sans serveur régulier avec AWS lambda + scrapy Part 1.8
Application sans serveur avec AWS SAM! (APIGATEWAY + Lambda (Python))
AWS Step Functions pour apprendre avec un exemple
Supprimer les données DynamoDB après 5 minutes avec AWS Step Functions
[AWS] Essayez d'ajouter la bibliothèque Python à la couche avec SAM + Lambda (Python)
Créez rapidement une API avec Python, lambda et API Gateway à l'aide d'AWS SAM
Jouez avec une tortue avec des graphiques de tortue (partie 1)
[AWS] Créer une API avec API Gateway + Lambda
Grattage sans serveur régulier avec AWS lambda + scrapy, partie 1
Notifier HipChat avec AWS Lambda (Python)
[AWS] Utilisation de fichiers ini avec Lambda [Python]
Jouez des nombres manuscrits avec python, partie 2 (identifier)
Je veux jouer avec aws avec python
[AWS] Associez Lambda et S3 à boto3
Connectez-vous à s3 avec AWS Lambda Python
[AWS] Faites des choses de type SSI avec S3 / Lambda
Je viens de faire FizzBuzz avec AWS Lambda
[Piyopiyokai # 1] Jouons avec Lambda: création d'une fonction Lambda
Obtenez une authentification de base avec CloudFront Lambda @ Edge avec Python 3.8
LINE BOT avec Python + AWS Lambda + API Gateway
[AWS] Essayez de tracer API Gateway + Lambda avec X-Ray
J'ai essayé de connecter AWS Lambda à d'autres services
Automatisation de la construction de l'infrastructure avec CloudFromation + troposphère + AWS Lambda
Je voulais utiliser la feuille de calcul Google avec AWS lambda, alors je l'ai essayé [Partie 2]