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 uno stato Step Functions Task per avviare nuove esecuzioni di workflow. Scopri come nel seguente tutorial: Continua i flussi di lavoro di lunga durata utilizzando Step Functions API (consigliato).
È possibile creare una macchina a stati che utilizza una funzione Lambda per avviare una nuova esecuzione prima del termine dell'esecuzione corrente. Con questo approccio per continuare il lavoro in corso in una nuova esecuzione, è possibile 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 Iterare un ciclo con una funzione Lambda in Step Functions tutorial. Utilizzate la stessa funzione Lambda (Iterator
) per iterare un ciclo per un numero specifico di volte. Inoltre, crei un'altra funzione Lambda per iniziare una nuova esecuzione del flusso di lavoro e per diminuire il 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 a funzionare l'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 iniziarne 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 familiarità con l'uso congiunto di Lambda e Step Functions.
Passaggio 1: creare 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 la 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 per count
index
, e. step
Restituisce quindi tali valori con un index
aggiornato e un booleano denominato continue
. La funzione Lambda viene impostata continue
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
.
Creare 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 sulla pagina, quindi scegli Crea funzione.
Quando viene creata la funzione Lambda, prendi nota del relativo Amazon Resource Name (ARN) nell'angolo in alto a destra della pagina, ad esempio:
arn:aws:lambda:us-east-1:123456789012:function:Iterator
-
-
Copiate il codice seguente per la funzione Lambda nella sezione Code source del
Iterator
pagina 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
,index
estep
. Incrementa l'index
del valore distep
e restituisce tali valori e il valore booleano dicontinue
. Il valore dicontinue
ètrue
seindex
è 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 imitano 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
TestIterator
come 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.
continue
true
Quando raggiunge un valore pari o superiore acount
, l'indice restituiscecontinue
comefalse
. Per questo test, l'indice ha già subito un incremento a5
. I risultati dovrebbero annoverare l'incremento dell'index
a6
e l'impostazione dicontinue
sutrue
. -
Scegli Create (Crea) .
-
Sul
Iteratore
nella tua console Lambda, assicurati che TestIteratorsia presente nell'elenco, quindi scegli Test.I risultati del test vengono visualizzati nella parte superiore della pagina. Selezionare Details (Dettagli) ed esaminare i risultati.
{ "index": 6, "step": 1, "count": 10, "continue": true }
Nota
Un test eseguito con l'
index
impostato su9
prevede l'incremento di taleindex
a10
e l'impostazione dicontinue
sufalse
.
Fase 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 sulla pagina, quindi scegli Crea funzione.
Quando viene creata la funzione Lambda, prendi nota del relativo Amazon Resource Name (ARN) nell'angolo in alto a destra della pagina, ad esempio:
arn:aws:lambda:us-east-1:123456789012:function:Iterator
-
Copiate il codice seguente per la funzione Lambda nella sezione Code source del
Restart
pagina 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 della scelta
Il seguente estratto mostra lo stato. ShouldRestart
Choice
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 stato. Restart
Task
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:us-east-1:123456789012:function:Restart
",
"Next": "Done"
},
Per creare la macchina a stati
-
Apri la console Step Functions
e scegli Crea macchina a stati. Nella finestra di dialogo Scegli un modello, seleziona Vuoto.
Scegliete Seleziona per aprire Workflow Studio inmodalità di progettazione.
-
In questo tutorial, scriverai la definizione Amazon States Language (ASL) della tua macchina a stati inEditor del codice. Per fare ciò, scegli Code.
-
Rimuovi il codice boilerplate esistente e incolla il codice seguente. Ricordati di sostituirle ARNs in questo codice con le ARNs 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: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 } } } -
Specificate un nome per la vostra 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, specifica un nome nella casella Nome macchina a stati.
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 stati.
Se in precedenza hai creato un IAM ruolo 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 ruolo ARN e quindi fornisci un ruolo ARN per quel IAM ruolo.
-
Nella finestra di dialogo Conferma creazione del ruolo, scegli Conferma per continuare.
Puoi anche scegliere Visualizza le impostazioni del ruolo per tornare alla configurazione della macchina a stati.
Nota
Se elimini il IAM ruolo creato da Step Functions, Step Functions non può ricrearlo in un secondo momento. Allo stesso modo, se modifichi il ruolo (ad esempio, rimuovendo Step Functions dai principi della IAM politica), 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 al ARN contempo l'autorizzazione alla funzione Lambda per avviare una nuova esecuzione di Step Functions.
Fase 4: aggiornamento della policy IAM
Per assicurarti che la tua funzione Lambda disponga delle autorizzazioni necessarie per avviare una nuova esecuzione di Step Functions, allega una policy in linea al IAM ruolo che usi per la tua funzione Lambda. Restart
Per ulteriori informazioni, consulta Incorporare le politiche in linea nella Guida per l'utente. IAM
Nota
È possibile aggiornare la Resource
riga dell'esempio precedente per fare riferimento alla macchina ARN a ContinueAsNew
stati. 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:123456789012stateMachine:ContinueAsNew
" } ] }
Passaggio 5: Esegui la macchina a stati
Per avviare un'esecuzione, fornisci un input che includa il nome ARN della macchina a stati e un executionCount
numero di volte in cui deve iniziare una nuova esecuzione.
-
Nella ContinueAsNewpagina, scegli Avvia esecuzione.
Viene visualizzata la finestra di dialogo Avvia esecuzione.
-
Nella finestra di dialogo Avvia esecuzione, effettuate le seguenti operazioni:
-
(Facoltativo) Inserite un nome di esecuzione personalizzato per sovrascrivere il valore predefinito generato.
ASCIINomi diversi e registrazione
Step Functions accetta nomi per macchine a stati, esecuzioni, attività ed etichette che contengono non ASCII caratteri. Poiché tali caratteri non funzionano con Amazon CloudWatch, ti consigliamo di utilizzare solo ASCII caratteri in modo da poter tenere traccia delle metriche. CloudWatch
-
Nella casella Input, inserisci il seguente JSON input per eseguire il flusso di lavoro.
{ "restart": { "StateMachineArn": "
arn:aws:states:us-east-1:123456789012:stateMachine:ContinueAsNew
", "executionCount":4
} } -
Aggiorna il
StateMachineArn
campo con il ARN per la tua macchina aContinueAsNew
stati. -
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 è possibile esaminare i risultati dell'esecuzione man mano che l'esecuzione procede o dopo il suo completamento.
Per esaminare i risultati dell'esecuzione, scegliete i singoli stati nella vista Grafico, quindi scegliete 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 che è 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
Restart
verrà avviata una nuova esecuzione.Una volta completata questa esecuzione, puoi esaminare l'esecuzione successiva in esecuzione. Seleziona il ContinueAsNewlink in alto per visualizzare l'elenco delle esecuzioni. Dovresti vedere sia l'esecuzione chiusa di recente che l'esecuzione in corso avviata dalla funzione
Restart
Lambda.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.
-