[PYTHON] [AWS] Play with Step Functions (SAM + Lambda) Part.2 (Paramètres)

Examen de la partie 1

Dans Part1, 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-004 C'est correct d'avoir le code de `git clone``, ou vous pouvez l'essayer depuis Part1.

L'objectif de cette fois

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

Préparation

Modifier la fonction Lambda

C'est fondamentalement Hello World, mais pour vérifier le contenu des arguments, ajoutons uniquement la description qui renvoie le contenu des arguments à CloudWatch. hello_world / app.py est toujours la valeur par défaut créée à partir du modèle, alors essayez ce qui suit, y compris la refactorisation.

hello_world/app.py


import json
import logging

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

def lambda_handler(event, context):
    logger.info(event)
    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world",
        })
    }

Construire / déployer

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

Essayez de transmettre un argument fixe à Lambda

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

Tout d'abord, c'est un paramètre fixe, mais vous devez modifier la définition de la machine à états. Le changement consiste à ajouter des «paramètres».

step_functions/state_machine.json


{
    "StartAt": "hello world",
    "States": {
      "hello world": {
        "Type": "Task",
        "Resource": "${HelloWorldFunction}",
        "Parameters": {
          "p1": 100,
          "p2": "0123",
          "p3": {
            "p3-1": 20,
            "p3-2": "xyz"
          }
        },
        "End": true
      }
    }
  }

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

Exécutons la machine d'état à partir de la console de gestion. Cette fois, les paramètres à passer à la définition de la machine à états sont définis de manière fixe, donc l'entrée est correcte.

sf1.png

Consultez CloudWatch Logs

Vous pouvez passer de la machine à états aux CloudWatch Logs de la fonction Lambda exécutée, nous allons donc vérifier le contenu du journal à partir de là.

cw1.png

Vous pouvez voir que les paramètres définis dans la définition de la machine à états ont été passés au premier argument ʻevents` de la fonction Lambda.

Essayez de transmettre un argument externe à Lambda

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

Modifiez ensuite la définition de la machine à états pour utiliser la valeur d'entrée dans la machine à états pour le paramètre. Le point est

--La valeur d'entrée ne peut être utilisée que si la partie Key se termine par ". " --Pour la partie Value, spécifiez le nom de clé du paramètre d'entrée après "". --Si vous entrez "$" dans la partie Valeur de la clé qui transmet la valeur d'entrée, vous pouvez transmettre toutes les valeurs d'entrée en tant que paramètres.

est. Maintenant, corrigeons cela en tenant compte de ceux-ci.

step_functions/state_machine.json


{
    "StartAt": "hello world",
    "States": {
      "hello world": {
        "Type": "Task",
        "Resource": "${HelloWorldFunction}",
        "Parameters": {
          "p1.$": $.p1,
          "p2.$": "$.p2",
          "p3": {
            "p3-1": 20,
            "p3-2": "xyz"
          },
          "all.$": "$"
        },
        "End": true
      }
    }
  }

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

Exécutons la machine d'état à partir de la console de gestion. Cette fois, nous utiliserons p1 et p2, spécifiez donc l'orchidée d'entrée comme suit.

sf2.png

Consultez CloudWatch Logs

Jetons maintenant un coup d'œil aux journaux CloudWatch pour la fonction Lambda.

--Le nombre 9999 en p1 --La chaîne "chaînes p2". Dans p2 --Toutes les valeurs d'entrée

Vous pouvez voir que c'est réglé. L'ordre a été modifié, mais il n'y a pas de problème avec la référence en tant que données Json.

cw2.png

Que se passe-t-il si aucun paramètre n'est spécifié pour la valeur d'entrée?

Lors de l'exécution de la machine d'état

{
    "Comment": "Insert your JSON here"
}

Que se passe-t-il s'il n'y a pas de "p1" ou "p2" requis dans la définition de la machine d'état, mais que l'exécution de la machine d'état échoue. Dans ce cas, la machine à états échouera avant d'appeler la fonction Lambda.

{
  "error": "States.Runtime",
  "cause": "An error occurred while executing the state 'hello world' (entered at the event id #2). The JSONPath '$.p1' specified for the field 'p1.$' could not be found in the input '{\n    \"Comment\": \"Insert your JSON here\"\n}'"
}

Essayez de transmettre un objet de contexte à Lambda

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

Modifiez la machine à états de la même manière, mais avant cela, qu'est-ce qu'un objet de contexte? Il y a une question. Un objet de contexte est une information sur une machine d'état et son exécution. Plus précisément, les informations sur le rôle, l'heure d'exécution, le nom de la tâche, etc. Pour passer un objet de contexte à une fonction Lambda

--La valeur d'entrée ne peut être utilisée que si la partie Key se termine par ". " --Spécifiez "$" dans la partie Valeur de la clé qui transmet la valeur d'entrée

est. Maintenant, corrigeons cela en tenant compte de ceux-ci.

step_functions/state_machine.json


{
    "StartAt": "hello world",
    "States": {
      "hello world": {
        "Type": "Task",
        "Resource": "${HelloWorldFunction}",
        "Parameters": {
          "p1.$": $.p1,
          "p2.$": "$.p2",
          "p3": {
            "p3-1": 20,
            "p3-2": "xyz"
          },
          "all.$": "$",
          "context.$": "$$"
        },
        "End": true
      }
    }
  }

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

Exécutons la machine d'état à partir de la console de gestion. Spécifiez "p1" et "p2" et exécutez.

Consultez CloudWatch Logs

Jetons maintenant un coup d'œil aux journaux CloudWatch pour la fonction Lambda.

--En contexte, un objet de contexte (ce que vous pensez)

Vous pouvez voir que c'est réglé.

cw3.png

Essayez de transmettre la valeur de retour de Lambda à l'argument d'une autre tâche

Enfin, c'est ça. Cette fois, j'aimerais utiliser la fonction Lambda de HelloWorld.

Modification de la fonction Lambda

Tout d'abord, la fonction Lambda HelloWorld actuelle génère le résultat suivant.

{
  "statusCode": 200,
  "body": "{\"message\": \"hello world\"}"
}

En fait, c'est un peu gênant, et le résultat de la partie body est devenu une chaîne de caractères. Nous allons donc modifier un peu la fonction Lambda afin qu'elle puisse être renvoyée dans sa structure Json. Supprimez simplement le processus de cordage supplémentaire lors du renvoi du résultat.

hello_world/app.py


import logging

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

def lambda_handler(event, context):
    logger.info(event)
    return {
        "statusCode": 200,
        "body": {
            "message": "hello world",
        }
    }

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

Cette fois, j'appellerai la fonction HelloWorld Lambda deux fois. Les principaux changements cette fois sont les suivants.

Le ResultPath de hello_world_1 contient le résultat de la fonction Lambda avec le nom de clé hello_world_result. Utilisez ʻOutput Pathpour refléter le contenu dans tout le contenu d'entrée. Danshello_world_2, en spécifiant" $ "dans ʻInputPath, la valeur d'entrée entière de hello world 1, y compris hello_world_result, est passée à la fonction Lambda.

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": "hello world 2"
    },
    "hello world 2": {
      "Type": "Task",
      "Resource": "${HelloWorldFunction}",
      "InputPath": "$",
      "End": true
    }
  }
}

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

Exécutons la machine d'état à partir de la console de gestion. Spécifiez "p1" et "p2" et exécutez.

Tout d'abord, assurez-vous que vous êtes appelé deux fois "hello world 1" et "hello world 2".

sf5.png

Consultez CloudWatch Logs

Jetons maintenant un coup d'œil aux journaux CloudWatch pour la fonction Lambda.

--Dans hello world 1 (cadre rouge), les paramètres sont les mêmes qu'auparavant. --Dans hello_world_2 (cadre bleu), en plus du paramètre hello world 1, la réponse de hello world 1 ( hello_world_result) est ajoutée.

Vous pouvez voir que c'est réglé.

cw5.png

Résumé

Cette fois, j'ai essayé de vérifier comment passer des paramètres et comment passer des résultats. Si vous apprenez à utiliser "$", ce ne sera pas si difficile.

La prochaine fois, j'aimerais examiner le branchement dû au résultat.

Exemple de référentiel de code

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

Recommended Posts

[AWS] Play with Step Functions (SAM + Lambda) Part.2 (Paramètres)
[AWS] Play with Step Functions (SAM + Lambda) Part.3 (Branch)
[AWS] Play with Step Functions (SAM + Lambda) Part.1 (Basic)
[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
[AWS] Créer une API avec API Gateway + Lambda
Grattage sans serveur régulier avec AWS lambda + scrapy, partie 1
[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
LINE BOT avec Python + AWS Lambda + API Gateway
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]