[PYTHON] [AWS] Play with Step Functions (SAM + Lambda) Part.3 (Branch)

Examen de la partie 2

Dans Part2, nous avons principalement fait ce qui suit.

Cette fois, je partirai de la suite. Si vous partez d'ici, https://github.com/hito-psv/sam-demo-005 C'est normal d'avoir le code de `git clone``, ou vous pouvez l'essayer depuis Part2.

L'objectif de cette fois

--Lambda renvoie des résultats aléatoires

Je voudrais cibler. Pour la partie Lambda, j'aimerais jouer avec la fonction "Hello World" créée dans Part2 et essayer diverses choses.

Préparation

Modifier la fonction Lambda

Je voudrais retourner quelques modèles de chaînes dans le code actuel avec des nombres aléatoires.

hello_world/app.py


import logging
import random

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    logger.info(event)

    message_array = [
        "hello world",
        "retry"
    ]
    message = random.choice(message_array)
    logger.info(message)

    return {
        "statusCode": 200,
        "body": {
            "message": message,
        }
    }

Maintenant, le message résultant sera

L'une ou l'autre chaîne de est renvoyée.

Construire / déployer

Dans cet état, exécutez sam build, sam deploy --guided pour déployer la fonction Lambda.

Changer le comportement en fonction de la valeur de retour de la fonction Lambda

Modifier la définition de la machine d'état

Tout d'abord, modifiez la définition de la machine à états. J'expliquerai le contenu de la correction plus tard, donc j'essaierai d'abord de le corriger comme ça.

step_functions/state_machine.json


{
  "StartAt": "hello world 1",
  "States": {
    "hello world 1": {
      "Type": "Task",
      "Resource": "${HelloWorldFunction}",
      "Parameters": {
        "p1.$": $.p1,
        "p2.$": "$.p2",
        "p3": {
          "p3-1": 20,
          "p3-2": "xyz"
        },
        "all.$": "$"
      },
      "ResultPath": "$.hello_world_result",
      "OutputPath": "$",
      "Next": "check state"
    },
    "retry lambda": {
      "Type": "Task",
      "Resource": "${HelloWorldFunction}",
      "InputPath": "$",
      "ResultPath": "$.hello_world_result",
      "OutputPath": "$",
      "Next": "check state"
    },
    "check state": {
      "Type" : "Choice",
      "Choices": [
        {
          "Variable": "$.hello_world_result.body.message",
          "StringEquals": "hello world",
          "Next": "hello world 2"
        },
        {
          "Variable": "$.hello_world_result.body.message",
          "StringEquals": "retry",
          "Next": "wait state"
        }
      ],
      "Default": "fail state"
    },
    "wait state": {
      "Type": "Wait",
      "Seconds": 5,
      "Next": "retry lambda"
    },
    "hello world 2": {
      "Type": "Task",
      "Resource": "${HelloWorldFunction}",
      "InputPath": "$",
      "End": true
    },
    "fail state": {
      "Type": "Fail",
      "Cause": "No Matches!"
    }
  }
}
  1. "hello world 1" exécute l'état de "check state" vers l'état suivant
  2. Pour "vérifier l'état", si la valeur de "$ .hello_world_result.body.message" est "hello world", exécutez "hello world 2" dans l'état suivant.
  3. Pour "vérifier l'état", si la valeur de "$ .hello_world_result.body.message" est "réessayer", exécutez "état d'attente" à l'état suivant.
  4. Pour "check state", si la valeur de "$ .hello_world_result.body.message" est différente de "hello world" et "retry", exécutez "fail state" dans l'état suivant (cette fois, cela ne peut pas arriver).
  5. "wait state" exécute l'état "retry lambda" après 5 secondes.
  6. "retry lambda" exécute l'état "check state" après avoir appelé la fonction lambda
  7. "hello world 2" termine l'exécution de l'état après avoir appelé la fonction lambda
  8. "l'état d'échec" met fin à l'exécution de l'état comme arrêt anormal

Il est décrit comme. Dans "Choices"

--Variable: vérifier la cible --StringEquals: Si la chaîne est la même que cette valeur --Next: état à exécuter ensuite

Est spécifié. Les opérations pouvant être spécifiées dans la section String Equals sont le [AWS Step Functions Developer Guide](https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/amazon-states-language-" Veuillez vous référer à choice-state.html).

Construire / déployer

Dans cet état, exécutez «sam build» et «sam deploy --guided» pour déployer.

Vérification de la machine d'état

Tout d'abord, voyons à quoi ressemble la machine à états visualisée en mettant à jour la définition de la machine à états.

sf1.png

Au fur et à mesure que vous avez changé, vous pouvez voir qu'il passe de "check state" et revient à "check state" après "retry lambda".

Essayez d'exécuter la machine d'état

Exécutons la machine d'état à partir de la console de gestion. Puisque les valeurs d'entrée p1 et p2 sont utilisées pour la correction de la partie 2, veuillez spécifier l'orchidée d'entrée comme suit.

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3432373939382f64303138383561632d323261362d623039372d646435622d3135383438333539616634372e706e67.png

Voyons le résultat

Commençons par vérifier le flux visuel. Tous les chemins passent à merveille (parce que c'est aléatoire, il peut y avoir un flux de "bonjour le monde 1" → "vérifier l'état" → "bonjour le monde 2").

sf2.png

Maintenant, vérifions si le processus Choice fonctionne correctement. Tout d'abord, voici le retour de la fonction Lambda appelée à partir de l'état "hello world 1".

sf3.png

Vous pouvez voir que la partie du message du corps est "réessayer". En conséquence, "l'état d'attente" est alors exécuté, et après 5 secondes (vérification des temps # 10 et # 11), "l'état lambda de réessai" est en cours d'exécution.

sf4.png

En fait, après cela, "retry" est renvoyé deux fois de suite, mais "hello world" est renvoyé la troisième fois.

sf5.png

Après cela, vous pouvez voir que l'état de "hello world 2" est exécuté.

sf6.png

Et l'État se termine tel qu'il est.

État "Choix" nouvellement ajouté

Il y a un contenu mis à jour le 13 août 2020.

Test de valeur (contrôle de type)

Vous permet de voir le type de «Variable» dans «Choix».

Exemple


   "Variable": "$.foo",
   "IsNull|IsString|IsNumeric|IsBoolean|IsTimestamp": true|false

Contrôle d'existence

Vous permet de vérifier l'existence de «Variable» elle-même.

Exemple


  "Variable": "$.foo",
  "IsPresent": true|false

Vérification des caractères génériques

Vous permet d'effectuer une vérification de jugement à l'aide d'un joker.

Exemple


  "Variable": "$.foo",
  "StringMatches": "log-*.txt"

Comparaison avec un autre champ de saisie

Vous permet de comparer un champ d'entrée avec un autre champ d'entrée. Il peut être utilisé pour vérifier les changements de statut.

Exemple


  "Variable": "$.foo",
  "StringEqualsPath": "$.bar"

Détails

Tu peux le vérifier ici.

AWS Step Functions adds updates to ‘choice’ state, global access to context object, dynamic timeouts, result selection, and intrinsic functions to Amazon States Language

Résumé

Cette fois, j'ai essayé de créer des branches avec Choice, mais à ce stade, cela ressemble enfin à un flux de travail. Je pense qu'il est possible de définir une certaine machine à états uniquement avec le contenu de Part.1 à Part.3 jusqu'à présent. La prochaine fois, j'aimerais appeler un service autre que Lambda avec une définition de tâche.

Exemple de référentiel de code

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

Recommended Posts

[AWS] Play with Step Functions (SAM + Lambda) Part.3 (Branch)
[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
PyTorch avec AWS Lambda [importation Lambda]
[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
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]