web-dev-qa-db-fra.com

Comment spécifier plusieurs valeurs de chemin de résultat dans AWS Step Functions

J'ai un état de fonction d'étape AWS formaté comme suit:

"MyState": {
  "Type": "Task",
  "Resource": "<MyLambdaARN>",
  "ResultPath": "$.value1"
  "Next": "NextState"
}

Je veux ajouter une deuxième valeur, mais je ne sais pas où. Aucun des exemples AWS n'affiche plusieurs valeurs ResultPath ajoutées à la sortie.

Vais-je simplement ajouter une virgule entre eux?

"MyState": {
  "Type": "Task",
  "Resource": "<MyLambdaARN>",
  "ResultPath": "$.value1, $.value2"
  "Next": "NextState"
}

Ou existe-t-il une meilleure façon de les formater?

13
Jake T.

Répondons à cela directement: vous ne pouvez pas spécifier plusieurs valeurs ResultPath, car cela n'a pas de sens. Amazon explique très mal comment cela fonctionne, donc je comprends pourquoi cela prête à confusion.

Vous pouvez cependant renvoyer plusieurs valeurs de résultat d'un état dans votre machine d'état.

Détails généraux

L'entrée de n'importe quel État est un objet JSON. La sortie de State est un objet JSON.

ResultPath indique à la machine d'état ce qu'elle doit faire de la sortie (résultat) de l'état. Sans spécifier ResultPath, la valeur par défaut est $ ce qui signifie que toutes les entrées de l'État sont perdues, remplacées par la sortie de l'État.

Si vous souhaitez autoriser les données du JSON d'entrée à passer par votre état, vous spécifiez un ResultPath pour décrire une propriété à ajouter/écraser sur le JSON d'entrée pour passer à l'état suivant.

Votre scénario

Dans ton cas, $.value1 signifie que le JSON de sortie de votre état est le JSON d'entrée avec une propriété nouvelle/remplacée value1 contenant la sortie JSON de votre lambda.

Si vous souhaitez plusieurs valeurs dans votre sortie, votre lambda doit renvoyer un objet JSON contenant les multiples valeurs, qui sera la valeur de value1 propriété.

Si vous ne vous souciez pas de permettre aux valeurs d'entrée de passer par votre état, laissez le ResultPath par défaut $ en l'omettant. Le JSON de sortie contenant vos multiples valeurs sera l'entrée du prochain état.

Scénario de support

Voici une simple machine à états que j'utilise pour jouer avec les entrées et les sorties:

{
  "StartAt": "State1",
  "States": {
    "State1": {
      "Type": "Pass",
      "Result": { "Value1": "Yoyo", "Value2": 1 },
      "ResultPath": "$.Result",
      "Next": "State2"
    },
    "State2": {
      "Type": "Pass",
      "Result": { "Value2": 5 },
      "ResultPath": "$.Result",
      "Next": "State3"
    },
    "State3": {
      "Type": "Pass",
      "Result": "Done",
      "End": true
    }
  }    
}

Exécutez-le avec l'entrée suivante:

{
  "Input 1": 10000, 
  "Input 2": "YOLO", 
  "Input 3": true
}

Examinez les entrées et sorties de chaque étape. Vous devez observer les points suivants:

  • L'entrée est transmise jusqu'au bout, car ResultPath dirige toujours la sortie vers une propriété Result de l'entrée.
  • La sortie de State1 est écrasé par la sortie de State2. L'effet net est Result.Value1 disparaît et Result.Value2 Est mis à jour".

Espérons que cela clarifie comment utiliser ResultPath efficacement.

26
Zodman

Vous ne pouvez pas spécifier plusieurs valeurs dans ResultPath, car ResultPath définit le chemin de votre valeur de résultat dans le json. L'analogie étroite pour ResultPath est une valeur return d'une fonction, car votre étape ne peut renvoyer qu'une seule valeur, elle doit être placée dans 1 nœud dans le json résultant.

Si vous avez une entrée json

{
  "myValue": "value1",
  "myArray": [1,2,3]
}

Et définissez votre ResultPath comme $.myResult le json résultant global sera

{
  "myValue": "value1",
  "myArray": [1,2,3],
  "myResult": "result"
}

Vous pouvez maintenant tronquer ce json pour ne passer qu'une partie de celui-ci à l'étape suivante de votre fonction en utilisant OutputPath (par exemple OutputPath: "$ .myResult")

InputPath et OutputPath peuvent avoir plusieurs nœuds dans leur définition, mais ResultPath ne doit toujours avoir que 1 nœud.

1
Serg

Je pense que ce serait comme ceci, mais je ne l'ai pas fait, donc je ne peux pas le dire avec certitude.

"ResultPath": {

                 "var1" : "$.value1",
                 "var2" : "$.value2"
 },

=====

Après avoir approfondi cette question, je suis convaincu qu'il n'y a pas de moyen direct de faire ce que vous voulez faire. Voici un moyen qui pourrait vous donner les résultats souhaités.

1) Vous omettriez InputPath, OutputPath et ResultPath de votre étape. Cela signifierait que tout $. serait passé en tant qu'entrée à votre fonction step et que toute la sortie de la fonction lambda serait stockée en tant que $. Dans la fonction lambda, vous pouvez définir les champs de résultats comme vous le souhaitez. La fonction lambda doit renvoyer l'entrée modifiée en sortie.

0
Itsme2003