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.
Je voudrais cibler. Pour la partie Lambda, j'aimerais jouer avec la fonction "Hello World" créée dans Part1 et essayer diverses choses.
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",
})
}
Dans cet état, exécutez sam build
, sam deploy --guided
pour déployer la fonction Lambda.
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
}
}
}
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.
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à.
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.
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 ".
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
}
}
}
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.
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.
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}'"
}
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 ".
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
}
}
}
Exécutons la machine d'état à partir de la console de gestion. Spécifiez "p1" et "p2" et exécutez.
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é.
Enfin, c'est ça. Cette fois, j'aimerais utiliser la fonction Lambda de HelloWorld.
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",
}
}
Cette fois, j'appellerai la fonction HelloWorld Lambda deux fois. Les principaux changements cette fois sont les suivants.
hello world 1
avec StartAt
ResultPath
et de ʻOutputPath à
hello world 1--Spécifiez
hello world 2 pour
Next de
hello world 1`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. Dans
hello_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
}
}
}
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".
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é.
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.
https://github.com/hito-psv/sam-demo-005