Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Utilizzo di una funzione Lambda per continuare una nuova esecuzione in Step Functions
Suggerimento
L'approccio seguente utilizza una funzione Lambda per avviare una nuova esecuzione del flusso di lavoro. Si consiglia di utilizzare lo stato Step Functions Task per avviare nuove esecuzioni del flusso di lavoro. Scopri come nel seguente tutorial: Continua i flussi di lavoro di lunga durata utilizzando l'API Step Functions (consigliato).
È possibile creare una macchina a stati che utilizza una funzione Lambda per avviare una nuova esecuzione prima che termini l'esecuzione corrente. Con questo approccio per continuare il lavoro in corso in una nuova esecuzione, puoi suddividere lavori di grandi dimensioni in flussi di lavoro più piccoli o eseguire un flusso di lavoro a tempo indeterminato.
Questo tutorial si basa sul concetto di utilizzo di una funzione Lambda esterna per modificare il flusso di lavoro, come dimostrato nel tutorial. Iterare un ciclo con una funzione Lambda in Step Functions Si utilizza la stessa funzione Lambda (Iterator) per iterare un ciclo per un numero specifico di volte. Inoltre, crei un'altra funzione Lambda per avviare una nuova esecuzione del flusso di lavoro e per diminuire un conteggio ogni volta che inizia una nuova esecuzione. La macchina a stati terminerà e riavvierà un'esecuzione per il numero di volte specificato nei dati di input.
La macchina a stati da creare implementa i seguenti stati.
| Stato | Scopo |
|---|---|
|
Uno |
|
|
Uno |
|
Uno Choice stato che utilizza un valore booleano della Iterator funzione per decidere se la macchina a stati deve continuare il lavoro di esempio o passare allo stato. ShouldRestart |
|
Uno Pass stato che rappresenta lo Task stato che eseguirebbe il lavoro in un'implementazione effettiva. |
|
Uno Choice stato che utilizza il executionCount valore per decidere se terminare un'esecuzione e avviarne un'altra o semplicemente terminare. |
|
Uno Task stato che utilizza una funzione Lambda per avviare una nuova esecuzione della macchina a stati. Anche questa funzione, come l'Iterator, decrementa i contatori. Lo Restart stato passa il valore decrementato del conteggio all'input della nuova esecuzione. |
Prerequisiti
Prima di iniziare, segui il Creazione di una macchina a stati Step Functions che utilizza Lambda tutorial per assicurarti di avere dimestichezza con l'uso combinato di Lambda e Step Functions.
Passaggio 1: crea una funzione Lambda per iterare un conteggio
Nota
Se hai completato il Iterare un ciclo con una funzione Lambda in Step Functions tutorial, puoi saltare questo passaggio e utilizzare quella funzione Lambda.
Questa sezione e il Iterare un ciclo con una funzione Lambda in Step Functions tutorial mostrano come utilizzare una funzione Lambda per tenere traccia di un conteggio, ad esempio il numero di iterazioni di un ciclo nella macchina a stati.
La seguente funzione Lambda riceve valori di input percount, eindex. step Restituisce quindi tali valori con un index aggiornato e un booleano denominato continue. La funzione Lambda viene continue impostata su true se index è minore di. count
La macchina a stati quindi implementa uno stato Choice che esegue alcune logiche di applicazione se continue è true o passa a ShouldRestart se continue è false.
Crea la funzione Iterate Lambda
-
Aprire la console Lambda
, quindi scegliere Create function (Crea funzione). -
Nella pagina Create function (Crea funzione), scegliere Author from scratch (Crea da zero).
-
Nella sezione Informazioni di base, configura la tua funzione Lambda, come segue:
-
Nel campo Function name (Nome funzione), immettere
Iterator. -
Per Runtime, scegli Node.js 16.x.
-
Mantieni tutte le selezioni predefinite nella pagina, quindi scegli la funzione Crea.
Dopo che Lambda ha creato la tua funzione, prendi nota del suo Amazon Resource Name (ARN), ad esempio:
arn:aws:lambda:region:123456789012:function:Iterator
-
-
Copia il codice seguente per la funzione Lambda nella sezione Code source della
Iteratorpagina nella 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 }) }Questo codice ammette valori di input per
count,indexestep. Incrementa l'indexdel valore distepe restituisce tali valori e il valore booleano dicontinue. Il valore dicontinueètrueseindexè inferiore acount. -
Scegli Deploy per distribuire il codice.
Prova la funzione Iterate Lambda
Per apprezzarne il funzionamento, basta eseguire la funzione Iterate con valori numerici. Puoi fornire valori di input per la tua funzione Lambda che simulano un'iterazione per vedere quale output ottieni con valori di input specifici.
Per testare la tua funzione Lambda
-
Nella finestra di dialogo Configure test event (Configura evento test), selezionare Create new test event (Crea nuovo evento test), per poi specificare
TestIteratorcome Event name (Nome evento). -
Sostituire i dati di esempio con quanto segue.
{ "Comment": "Test my Iterator function", "iterator": { "count": 10, "index": 5, "step": 1 } }Tali valori simulano quelli generati da una macchina a stati durante un'iterazione. La funzione Lambda incrementa l'indice e restituisce as.
continuetrueQuando raggiunge un valore pari o superiore acount, l'indice restituiscecontinuecomefalse. Per questo test, l'indice ha già subito un incremento a5. I risultati dovrebbero annoverare l'incremento dell'indexa6e l'impostazione dicontinuesutrue. -
Scegli Create (Crea).
-
Nella
Iteratorpagina della tua console Lambda, assicurati che TestIterator sia elencato, quindi scegli Test.I risultati del test vengono visualizzati nella pagina. Selezionare Details (Dettagli) ed esaminare i risultati.
{ "index": 6, "step": 1, "count": 10, "continue": true }Nota
Un test eseguito con l'
indeximpostato su9prevede l'incremento di taleindexa10e l'impostazione dicontinuesufalse.
Passaggio 2: creare una funzione Restart Lambda per avviare una nuova esecuzione di Step Functions
-
Aprire la console Lambda
, quindi scegliere Create function (Crea funzione). -
Nella pagina Create function (Crea funzione), scegliere Author from scratch (Crea da zero).
-
Nella sezione Informazioni di base, configura la tua funzione Lambda, come segue:
-
Nel campo Function name (Nome funzione), immettere
Restart. -
Per Runtime, scegli Node.js 16.x.
-
-
Mantieni tutte le selezioni predefinite nella pagina, quindi scegli la funzione Crea.
Dopo che Lambda ha creato la tua funzione, prendi nota del suo Amazon Resource Name (ARN), ad esempio:
arn:aws:lambda:region:123456789012:function:Iterator -
Copia il codice seguente per la funzione Lambda nella sezione Code source della
Restartpagina nella console Lambda.Il codice seguente riduce il conteggio del numero di esecuzioni e avvia una nuova esecuzione della macchina a stati, includendo il valore ridotto.
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); }); } -
Scegli Deploy per distribuire il codice.
Fase 3: Creare una macchina a stati
Ora che hai creato le tue due funzioni Lambda, crea una macchina a stati. In questa macchina a stati, gli stati ShouldRestart e Restart rispecchiano la suddivisione del lavoro in più esecuzioni.
Esempio ShouldRestart Stato di scelta
Il seguente estratto mostra lo ShouldRestart Choice stato. Questo stato determina se riavviare o meno l'esecuzione.
"ShouldRestart": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.restart.executionCount",
"NumericGreaterThan": 1,
"Next": "Restart"
}
],Il valore $.restart.executionCount è incluso nell'input dell'esecuzione iniziale. Cala di uno a ogni chiamata della funzione Restart e poi viene incluso nell'input dell'esecuzione successiva.
Esempio Stato Task Restart
Il seguente estratto mostra lo Restart Task stato. Questo stato utilizza la funzione Lambda creata in precedenza per riavviare l'esecuzione e per diminuire il conteggio per tenere traccia del numero rimanente di esecuzioni da avviare.
"Restart": {
"Type": "Task",
"Resource": "arn:aws:lambda:region:123456789012:function:Restart",
"Next": "Done"
},Per creare la macchina a stati
-
Apri la console Step Functions
, scegli State machines dal menu, quindi scegli Create state machine. Importante
Assicurati che la tua macchina a stati si trovi nello stesso AWS account e nella stessa regione delle funzioni Lambda che hai creato in precedenza nei passaggi 1 e 2.
Scegli Crea da vuoto.
Assegna un nome alla tua macchina a stati, quindi scegli Continua per modificare la tua macchina a stati in Workflow Studio.
-
Per questo tutorial, scriverai la definizione Lingua degli Stati di Amazon (ASL) della tua macchina a stati in. Editor del codice Per fare ciò, scegli Codice.
-
Rimuovi il codice standard esistente e incolla il codice seguente. Ricorda di sostituire gli ARN in questo codice con gli ARN delle funzioni Lambda che hai creato.
{ "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:", "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": "region:123456789012:function:Iteratorarn:aws:lambda:", "Next": "Done" }, "Done": { "Type": "Pass", "End": true } } }region:123456789012:function:Restart -
Specifica un nome per la tua macchina a stati. Per fare ciò, scegli l'icona di modifica accanto al nome della macchina a stati predefinita di MyStateMachine. Quindi, nella configurazione della macchina a stati, specificate un nome nella casella Nome macchina a stato.
Per questo tutorial, inserisci il nome
ContinueAsNew. -
(Facoltativo) Nella configurazione della macchina a stati, specificate altre impostazioni del flusso di lavoro, come il tipo di macchina a stati e il relativo ruolo di esecuzione.
Per questo tutorial, mantieni tutte le selezioni predefinite nelle impostazioni della macchina a stato.
Se in precedenza hai creato un ruolo IAM con le autorizzazioni corrette per la tua macchina a stati e desideri utilizzarlo, in Autorizzazioni, seleziona Scegli un ruolo esistente, quindi seleziona un ruolo dall'elenco. Oppure seleziona Inserisci un ARN per il ruolo e quindi fornisci un ARN per quel ruolo IAM.
-
Nella finestra di dialogo Conferma creazione del ruolo, scegli Conferma per continuare.
Puoi anche scegliere Visualizza le impostazioni dei ruoli per tornare alla configurazione della macchina State.
Nota
Se elimini il ruolo IAM creato da Step Functions, Step Functions non può ricrearlo in un secondo momento. Analogamente, se modifichi il ruolo (ad esempio, rimuovendo Step Functions dai principali nella policy IAM), Step Functions non può ripristinare le impostazioni originali in un secondo momento.
-
Salva l'Amazon Resource Name (ARN) di questa macchina a stati in un file di testo. Dovrai fornire l'ARN mentre fornisci l'autorizzazione alla funzione Lambda per avviare una nuova esecuzione di Step Functions.
Fase 4: Aggiornamento della politica IAM
Per assicurarti che la tua funzione Lambda disponga delle autorizzazioni per avviare una nuova esecuzione di Step Functions, allega una policy in linea al ruolo IAM che usi per la tua Restart funzione Lambda. Per ulteriori informazioni, consulta Embedding Inline Policies nella IAM User Guide.
Nota
È possibile modificare la riga Resource dell'esempio precedente, affinché includa l'ARN della macchina a stati ContinueAsNew. Così facendo, si limita la policy in modo che vengano avviate solo esecuzioni di tale macchina a stati.
-
{ "Version":"2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "states:StartExecution" ], "Resource": "arn:aws:states:us-east-2:123456789012:stateMachine:ContinueAsNew" } ] }
Fase 5: Esegui la macchina a stati
Per avviare un'esecuzione, bisogna fornire un input che includa l'ARN della macchina a stati e l'executionCount, che rappresenta il numero di volte in cui è necessario avviare una nuova esecuzione.
-
Nella ContinueAsNew pagina, scegli Avvia esecuzione.
Viene visualizzata la finestra di dialogo Avvia esecuzione.
-
Nella finestra di dialogo Avvia esecuzione, effettuate le seguenti operazioni:
-
(Facoltativo) Immettete un nome di esecuzione personalizzato per sovrascrivere il valore predefinito generato.
Non-ASCII nomi e registrazione
Step Functions accetta nomi per macchine a stati, esecuzioni, attività ed etichette che contengono caratteri non ASCII. Poiché tali caratteri impediranno ad Amazon di registrare i dati, consigliamo di utilizzare solo caratteri ASCII in modo CloudWatch da poter tenere traccia delle metriche di Step Functions.
-
Nella casella Input, inserisci il seguente input JSON per eseguire il flusso di lavoro.
{ "restart": { "StateMachineArn": "arn:aws:states:", "executionCount":region:account-id:stateMachine:ContinueAsNew4} } -
Aggiornare il campo
StateMachineArncon l'ARN della macchina a statiContinueAsNew. -
Selezionare Start execution (Avvia esecuzione).
-
La console Step Functions ti indirizza a una pagina intitolata con il tuo ID di esecuzione. Questa pagina è nota come pagina dei dettagli di esecuzione. In questa pagina, puoi esaminare i risultati dell'esecuzione man mano che l'esecuzione procede o al suo completamento.
Per esaminare i risultati dell'esecuzione, scegli i singoli stati nella vista Grafico, quindi scegli le singole schede Dettagli del passaggio nel riquadro per visualizzare i dettagli di ogni stato, inclusi rispettivamente input, output e definizione. Per i dettagli sulle informazioni sull'esecuzione, è possibile visualizzare nella pagina Dettagli di esecuzione, vederePanoramica dei dettagli di esecuzione.
La vista Grafico mostra la prima delle quattro esecuzioni. Prima del completamento, passando per lo stato
Restartverrà avviata una nuova esecuzione.
Al termine dell'esecuzione, puoi guardare la successiva esecuzione in esecuzione. Seleziona il ContinueAsNew link in alto per visualizzare l'elenco delle esecuzioni. Dovresti vedere sia l'esecuzione chiusa di recente, sia un'esecuzione in corso avviata dalla funzione
RestartLambda.Una volta completate, tutte le quattro esecuzioni saranno visibili nell'elenco. L'esecuzione avviata per prima mostra il nome scelto dall'utente; le altre, invece, presentano un nome generato.
-