Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Utiliser une fonction Lambda pour poursuivre une nouvelle exécution dans Step Functions
Vous pouvez créer une machine à états qui utilise une fonction Lambda pour démarrer une nouvelle exécution avant la fin de l'exécution en cours. L'utilisation de cette approche pour poursuivre votre travail en cours dans le cadre d'une nouvelle exécution vous permet de disposer d'une machine à états capable de diviser les tâches volumineuses en flux de travail plus petits, ou d'avoir une machine à états qui fonctionne indéfiniment.
Ce didacticiel repose sur le concept d'utilisation d'une fonction Lambda externe pour modifier votre flux de travail, qui a été démontré dans le Itérer une boucle avec une fonction Lambda dans Step Functions didacticiel. Vous utilisez la même fonction Lambda (Iterator
) pour itérer une boucle un certain nombre de fois. En outre, vous créez une autre fonction Lambda pour démarrer une nouvelle exécution de votre flux de travail et pour décrémenter un nombre à chaque fois qu'il commence une nouvelle exécution. En définissant le nombre d'exécutions dans l'entrée, cette machine d'état termine et redémarre une exécution un nombre de fois spécifié.
La machine d'état que vous allez créer implémente les états suivants.
État | Objectif |
---|---|
|
|
|
|
|
Choice État qui utilise une valeur booléenne issue de la Iterator fonction pour décider si la machine à états doit continuer le travail d'exemple ou passer à l'ShouldRestart état. |
|
Pass État qui représente l'Task état qui exécuterait le travail dans le cadre d'une implémentation réelle. |
|
Choice État qui utilise la executionCount valeur pour décider s'il doit mettre fin à une exécution et en démarrer une autre, ou simplement se terminer. |
|
Task État qui utilise une fonction Lambda pour démarrer une nouvelle exécution de votre machine à états. Comme la fonction Iterator , cette fonction décrémente également un nombre. L'Restart état transmet la valeur décrémentée du décompte à l'entrée de la nouvelle exécution. |
Prérequis
Avant de commencer, suivez le Création d'une machine d'état Step Functions utilisant Lambda didacticiel pour vous assurer que vous êtes familiarisé avec l'utilisation conjointe de Lambda et de Step Functions.
Rubriques
Étape 1 : créer une fonction Lambda pour itérer un décompte
Note
Si vous avez terminé le Itérer une boucle avec une fonction Lambda dans Step Functions didacticiel, vous pouvez ignorer cette étape et utiliser cette fonction Lambda.
Cette section et le Itérer une boucle avec une fonction Lambda dans Step Functions didacticiel montrent comment utiliser une fonction Lambda pour suivre un décompte, par exemple le nombre d'itérations d'une boucle dans votre machine à états.
La fonction Lambda suivante reçoit les valeurs d'entrée pour count
index
, et. step
Elle renvoie ces valeurs avec un index
mis à jour et une valeur booléenne nommée continue
. La fonction Lambda est définie continue
sur true
si le index
est inférieur à. count
Votre machine d'état implémente alors un état Choice
qui exécute une certaine logique d'application si continue
a la valeur true
, ou de déplace à ShouldRestart
si continue
a la valeur false
.
Création de la fonction Iterate Lambda
-
Ouvrez la console Lambda
, puis choisissez Create function (Créer une fonction. -
Sur la page Create function, sélectionnez Author from scratch.
-
Dans la section Informations de base, configurez votre fonction Lambda comme suit :
-
Sous Nom de la fonction, saisissez
Iterator
. -
Pour Exécution, choisissez Node.js 16.x.
-
Conservez toutes les sélections par défaut sur la page, puis choisissez Créer une fonction.
Lorsque votre fonction Lambda est créée, notez son nom de ressource Amazon (ARN) dans le coin supérieur droit de la page, par exemple :
arn:aws:lambda:us-east-1:123456789012:function:Iterator
-
-
Copiez le code suivant pour la fonction Lambda dans la section Code source du
Iterator
page dans la console Lambda.exports.handler = function iterator (event, context, callback) { let index = event.iterator.index; let step = event.iterator.step; let count = event.iterator.count; index = index + step; callback(null, { index, step, count, continue: index < count }) }
Le code accepte les valeurs d'entrée pour
count
,index
etstep
. Il incrémenteindex
de la valeur destep
et retourne ces valeurs, et la valeur booléennecontinue
. La valeur decontinue
esttrue
siindex
est inférieur àcount
. -
Choisissez Deploy pour déployer le code.
Tester la fonction Iterate Lambda
Pour vérifier le fonctionnement de votre fonction Iterate
, exécutez-la avec des valeurs numériques. Vous pouvez fournir des valeurs d'entrée pour votre fonction Lambda qui imitent une itération pour voir quelle sortie vous obtenez avec des valeurs d'entrée spécifiques.
Pour tester votre fonction Lambda
-
Dans la boîte de dialogue Configure test event, choisissez Create new test event, puis entrez
TestIterator
pour Event name. -
Remplacez les données de l'exemple par les suivantes.
{ "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }
Ces valeurs simulent ce qui provient de votre machine d'état au cours d'une itération. La fonction Lambda incrémente l'index et renvoie sous la forme.
continue
true
Quand l'index n'est pas inférieur àcount
, la fonction renvoiecontinue
avec la valeurfalse
. Pour ce test, l'index a déjà été incrémenté à5
. Les résultats doivent incrémenterindex
à6
et définircontinue
avec la valeurtrue
. -
Sélectionnez Create (Créer).
-
Sur le
Itérateur
page de votre console Lambda, assurez-vous qu'elle TestIteratorest répertoriée, puis choisissez Test.Les résultats du test sont affichés en haut de la page. Choisissez Details et vérifiez le résultat.
{ "index": 6, "step": 1, "count": 10, "continue": true }
Note
Si vous définissez
index
avec la valeur9
pour ce test,index
s'incrémente à10
etcontinue
a la valeurfalse
.
Étape 2 : Création d'une fonction Restart Lambda pour démarrer une nouvelle exécution de Step Functions
-
Ouvrez la console Lambda
, puis choisissez Create function (Créer une fonction. -
Sur la page Create function, sélectionnez Author from scratch.
-
Dans la section Informations de base, configurez votre fonction Lambda comme suit :
-
Sous Nom de la fonction, saisissez
Restart
. -
Pour Exécution, choisissez Node.js 16.x.
-
-
Conservez toutes les sélections par défaut sur la page, puis choisissez Créer une fonction.
Lorsque votre fonction Lambda est créée, notez son nom de ressource Amazon (ARN) dans le coin supérieur droit de la page, par exemple :
arn:aws:lambda:us-east-1:123456789012:function:Iterator
-
Copiez le code suivant pour la fonction Lambda dans la section Code source du
Restart
page dans la console Lambda.Le code suivant décrémente le compte du nombre d'exécutions et démarre une nouvelle exécution de votre machine d'état, valeur décrémentée incluse.
var aws = require('aws-sdk'); var sfn = new aws.StepFunctions(); exports.restart = function(event, context, callback) { let StateMachineArn = event.restart.StateMachineArn; event.restart.executionCount -= 1; event = JSON.stringify(event); let params = { input: event, stateMachineArn: StateMachineArn }; sfn.startExecution(params, function(err, data) { if (err) callback(err); else callback(null,event); }); }
-
Choisissez Deploy pour déployer le code.
Étape 3 : Création d'une machine à états
Maintenant que vous avez créé vos deux fonctions Lambda, créez une machine à états. Dans cette machine d'état, les états ShouldRestart
et Restart
se rapportent à la façon dont vous scindez votre tâche en plusieurs exécutions.
Exemple ShouldRestart État du choix
L'extrait suivant montre l'ShouldRestart
Choice
état. Cet état détermine si vous devez ou non redémarrer l'exécution.
"ShouldRestart": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.restart.executionCount",
"NumericGreaterThan": 1,
"Next": "Restart"
}
],
La valeur $.restart.executionCount
est incluse dans les données d'entrée de l'exécution initiale. Elle est décrémenté d'une unité chaque fois que la fonction Restart
est appelée, puis placée dans l'entrée pour chaque exécution suivante.
Exemple Redémarrer l'état de la tâche
L'extrait suivant montre l'Restart
Task
état. Cet état utilise la fonction Lambda que vous avez créée précédemment pour redémarrer l'exécution et décrémenter le nombre d'exécutions afin de suivre le nombre d'exécutions restantes à démarrer.
"Restart": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart
",
"Next": "Done"
},
Pour créer la machine d'état
-
Ouvrez la console Step Functions
et choisissez Create state machine. Dans la boîte de dialogue Choisir un modèle, sélectionnez Vide.
Choisissez Sélectionner pour ouvrir Workflow Studio dansMode de conception.
-
Pour ce didacticiel, vous allez écrire la définition Amazon States Language (ASL) de votre machine à états dans leÉditeur de code. Pour ce faire, sélectionnez Code.
-
Supprimez le code standard existant et collez le code suivant. N'oubliez pas de remplacer ARNs le contenu de ce code par les ARNs fonctions Lambda que vous avez créées.
{ "Comment": "Continue-as-new State Machine Example", "StartAt": "ConfigureCount", "States": { "ConfigureCount": { "Type": "Pass", "Result": { "count": 100, "index": -1, "step": 1 }, "ResultPath": "$.iterator", "Next": "Iterator" }, "Iterator": { "Type": "Task", "Resource": "
arn:aws:lambda:us-east-1:123456789012:function:Iterator
", "ResultPath": "$.iterator", "Next": "IsCountReached" }, "IsCountReached": { "Type": "Choice", "Choices": [ { "Variable": "$.iterator.continue", "BooleanEquals": true, "Next": "ExampleWork" } ], "Default": "ShouldRestart" }, "ExampleWork": { "Comment": "Your application logic, to run a specific number of times", "Type": "Pass", "Result": { "success": true }, "ResultPath": "$.result", "Next": "Iterator" }, "ShouldRestart": { "Type": "Choice", "Choices": [ { "Variable": "$.restart.executionCount", "NumericGreaterThan": 0, "Next": "Restart" } ], "Default": "Done" }, "Restart": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:Restart
", "Next": "Done" }, "Done": { "Type": "Pass", "End": true } } } -
Spécifiez un nom pour votre machine à états. Pour ce faire, cliquez sur l'icône d'édition à côté du nom de la machine à états par défaut de MyStateMachine. Ensuite, dans Configuration de la machine d'état, spécifiez un nom dans le champ Nom de la machine d'état.
Pour ce didacticiel, saisissez le nom
ContinueAsNew
. -
(Facultatif) Dans Configuration de la machine à états, spécifiez d'autres paramètres de flux de travail, tels que le type de machine à états et son rôle d'exécution.
Pour ce didacticiel, conservez toutes les sélections par défaut dans les paramètres State Machine.
Si vous avez déjà créé un IAM rôle avec les autorisations appropriées pour votre machine d'état et que vous souhaitez l'utiliser, dans Autorisations, sélectionnez Choisir un rôle existant, puis sélectionnez un rôle dans la liste. Vous pouvez également sélectionner Entrer un rôle, ARN puis fournir un ARN pour ce IAM rôle.
-
Dans la boîte de dialogue Confirmer la création du rôle, choisissez Confirmer pour continuer.
Vous pouvez également choisir Afficher les paramètres des rôles pour revenir à la configuration de la machine State.
Note
Si vous supprimez le IAM rôle créé par Step Functions, Step Functions ne pourra pas le recréer ultérieurement. De même, si vous modifiez le rôle (par exemple, en supprimant Step Functions des principes de la IAM politique), Step Functions ne pourra pas restaurer ses paramètres d'origine ultérieurement.
-
Enregistrez le nom de ressource Amazon (ARN) de cette machine d'état dans un fichier texte. Vous devez ARN tout en autorisant la fonction Lambda à démarrer une nouvelle exécution de Step Functions.
Étape 4 : Mise à jour de la stratégie IAM
Pour vous assurer que votre fonction Lambda est autorisée à démarrer une nouvelle exécution de Step Functions, associez une politique en ligne au IAM rôle que vous utilisez pour votre fonction LambdaRestart
. Pour plus d'informations, consultez la section Intégration de politiques intégrées dans le guide de l'IAMutilisateur.
Note
Dans l'exemple précédent, vous pouvez mettre à jour la Resource
ligne pour faire référence à votre machine à ContinueAsNew
états. ARN Cette limite la stratégie afin qu'elle ne puisse démarrer qu'une exécution de cette machine d'état spécifique.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "states:StartExecution" ], "Resource": "
arn:aws:states:us-east-2:123456789012stateMachine:ContinueAsNew
" } ] }
Étape 5 : Exécutez la machine d'état
Pour démarrer une exécution, fournissez une entrée qui inclut le ARN nom de la machine à états et le nombre de fois où elle doit démarrer une nouvelle exécution. executionCount
-
Sur la ContinueAsNewpage, choisissez Démarrer l'exécution.
La boîte de dialogue Démarrer l'exécution s'affiche.
-
Dans la boîte de dialogue Démarrer l'exécution, procédez comme suit :
-
(Facultatif) Pour identifier votre exécution, vous pouvez spécifier un nom ou utiliser le nom d'exécution généré par défaut.
Note
Step Functions accepte les noms des machines d'état, des exécutions, des activités et des étiquettes contenant des caractères autres que des ASCII caractères. Étant donné que les noms ne contenant pas de ASCII caractères ne fonctionneront pas avec Amazon CloudWatch, nous vous recommandons de n'utiliser que ASCII des caractères afin de pouvoir suivre les statistiques. CloudWatch
-
Dans la zone de saisie, entrez l'JSONentrée suivante pour exécuter votre flux de travail.
{ "restart": { "StateMachineArn": "
arn:aws:states:us-east-1:123456789012:stateMachine:ContinueAsNew
", "executionCount":4
} } -
Mettez à jour le
StateMachineArn
champ avec le ARN correspondant à votre machineContinueAsNew
d'état. -
Choisissez Start execution (Démarrer l'exécution).
-
La console Step Functions vous dirige vers une page intitulée avec votre ID d'exécution. Cette page est connue sous le nom de page Détails de l'exécution. Sur cette page, vous pouvez consulter les résultats de l'exécution au fur et à mesure que l'exécution progresse ou une fois celle-ci terminée.
Pour consulter les résultats de l'exécution, choisissez des états individuels dans la vue graphique, puis choisissez les onglets individuels du Détails de l'étape volet pour afficher les détails de chaque état, y compris les entrées, les sorties et la définition respectivement. Pour plus de détails sur les informations d'exécution que vous pouvez consulter sur la page Détails de l'exécution, voirPage de détails d'exécution — Vue d'ensemble de l'interface.
La vue graphique affiche la première des quatre exécutions. Avant de se terminer, il va transmettre l'état
Restart
et démarrer une nouvelle exécution.Au fur et à mesure que cette exécution est terminée, vous pouvez regarder la prochaine exécution en cours. Cliquez ContinueAsNewsur le lien en haut pour voir la liste des exécutions. Vous devriez voir à la fois l'exécution récemment clôturée et une exécution en cours lancée par la fonction
Restart
Lambda.Une fois toutes les exécutions terminées, vous devez voir quatre exécutions réussies dans la liste. La première exécution démarrée affiche le nom que vous avez choisi et un nom a été généré pour les exécutions suivantes.
-