Creazione di un flusso di lavoro serverless

con AWS Step Functions e AWS Lambda

Questo tutorial illustra come usare AWS Step Functions per progettare ed eseguire un flusso di lavoro serverless che coordini più funzioni AWS Lambda. AWS Lambda è un servizio di elaborazione che consente di eseguire codice senza dover effettuare il provisioning né gestire server.

Nel nostro esempio, sei uno sviluppatore a cui è stato chiesto di creare un'applicazione serverless per automatizzare la gestione delle richieste di supporto in un call center. Sebbene potresti usare una funzione Lambda che chiama l'altra, ti preoccupi che la gestione di tutte queste connessioni diventi impegnativa man mano che l'applicazione del call center diventa più sofisticata. Inoltre, qualsiasi cambiamento nel flusso dell'applicazione richiederà modifiche in più punti e potresti finire per scrivere lo stesso codice più e più volte.

Per risolvere questo problema, decidi di utilizzare AWS Step Functions. Step Functions è un servizio di orchestrazione serverless che consente di coordinare facilmente più funzioni Lambda in flussi di lavoro flessibili, di cui è semplice eseguire il debug, e facili da modificare. Step Functions manterrà le tue funzioni Lambda prive di logica aggiuntiva, attivando e tracciando ogni fase della tua applicazione al posto tuo.

Nei prossimi 10 minuti, creerai una macchina a stati Step Functions per descrivere l'attuale processo del call center, creerai alcune semplici funzioni Lambda che simulano le attività del team di supporto e passerai i dati tra ogni funzione Lambda per tracciare l'avanzamento del caso di supporto. Quindi, eseguirai diversi test del flusso di lavoro per osservare come risponde ai diversi input. Infine, eliminerai le risorse AWS che hai usato nel tutorial.

In questo tutorial userai AWS Step Functions e AWS Lambda. Questi servizi sono compresi nel piano gratuito di AWS.

Questo tutorial richiede un account AWS

Non sono previsti costi aggiuntivi per l'utilizzo di Step Functions o Lambda. Le risorse create in questo tutorial sono idonee per il piano gratuito. 

Ulteriori informazioni sul piano gratuito >>


Fase 1. Creazione di una macchina a stati e flusso di lavoro serverless

La prima fase è quella di progettare un flusso di lavoro che descriva come vuoi che vengano gestite le richieste di supporto nel call center. I flussi di lavoro descrivono un processo come una serie di attività distinte che possono essere ripetute più volte.

Potrai sederti con il responsabile del call center per parlare delle best practice per la gestione dei casi di supporto. Utilizzando i flussi di lavoro visivi in Step Functions come riferimento intuitivo, definirete insieme il flusso di lavoro.

Quindi, progetterai il tuo flusso di lavoro in AWS Step Functions. Il tuo flusso di lavoro chiamerà una funzione AWS Lambda per creare un caso di supporto, richiamerà un'altra funzione per assegnare il caso a un rappresentante del supporto per la risoluzione, e così via. Inoltre, passerà i dati tra le funzioni Lambda per tenere traccia dello stato del caso di supporto durante il processo di risoluzione.


a. Apri la console AWS Step Functions. Seleziona Autore con frammenti di codice. Nella casella di testo Nome, digita CallCenterStateMachine.

01c
01c

(fai clic per ingrandire l'immagine)


b. Sostituisci il contenuto della finestra Definizione della macchina a stati con la definizione della macchina a stati Amazon States Language (ASL) seguente. Amazon States Language è un linguaggio strutturato basato su JSON, utilizzato per definire la tua macchina a stati.

Questa macchina a stati usa una serie di Stati delle attività per aprire, assegnare e lavorare su un caso di supporto. Quindi, viene usato uno Stato di scelta per stabilire se il caso può essere chiuso oppure no. Altri due Stati delle attività chiuderanno o faranno salire di priorità un caso di supporto quando sarà opportuno.

 

{
  "Comment": "A simple AWS Step Functions state machine that automates a call center support session.",
  "StartAt": "Open Case",
  "States": {
    "Open Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next": "Assign Case"
    }, 
    "Assign Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next": "Work on Case"
    },
    "Work on Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next": "Is Case Resolved"
    },
    "Is Case Resolved": {
        "Type" : "Choice",
        "Choices": [ 
          {
            "Variable": "$.Status",
            "NumericEquals": 1,
            "Next": "Close Case"
          },
          {
            "Variable": "$.Status",
            "NumericEquals": 0,
            "Next": "Escalate Case"
          }
      ]
    },
     "Close Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "End": true
    },
    "Escalate Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next": "Fail"
    },
    "Fail": {
      "Type": "Fail",
      "Cause": "Engage Tier 2 Support."    }   
  }
}
03b
03b

(fai clic per ingrandire l'immagine)


c. Fai clic sul pulsante di aggiornamento per mostrare la definizione della macchina a stati ASL come flusso di lavoro visivo. Nel nostro scenario, puoi verificare facilmente che il processo sia descritto correttamente rivedendo il flusso di lavoro visivo con il responsabile del call center.

d. Fai clic su Fase successiva.

03c
03c

(fai clic per ingrandire l'immagine)


Fase 2. Creazione di un ruolo AWS Identity and Access Management (IAM)

AWS IAM è un servizio Web che permette di controllare in modo sicuro l'accesso alle risorse AWS. In questa fase, creerai un ruolo IAM che consentirà a Step Functions di accedere a Lambda.


a. In un'altra finestra del browser, apri la Console di gestione AWS. Una volta caricata la schermata, digita IAM nella barra di ricerca, quindi seleziona IAM per aprire la console di servizio.

02a
02a

(fai clic per ingrandire l'immagine)


b. Fai clic su Ruoli quindi fai clic su Crea ruolo.

02b
02b

(fai clic per ingrandire l'immagine)


c. Sulla schermata Crea ruoli, lascia selezionato Servizio AWS, seleziona Step Functions quindi fai clic su Successivo: Autorizzazioni. Sulla schermata successiva, fai clic su Successivo: Rivedi.

02c
02c

(fai clic per ingrandire l'immagine)


d. Inserisci il nome del ruolo in Nome ruolo come step_functions_basic_execution e scegli Crea ruolo. Sulla schermata successiva, fai clic su Successivo: Rivedi.

02d
02d

(fai clic per ingrandire l'immagine)


e. Il tuo ruolo è stato creato e compare nella lista. Seleziona il nome del ruolo per vederlo. 

02e
02e

(fai clic per ingrandire l'immagine)


f. Copia il valore ARN ruolo sulla schermata successiva.

02f
02f

(fai clic per ingrandire l'immagine)


Fase 3. Aggiungere il ruolo IAM alla macchina a stati

Successivamente, aggiungerai l'ARN del ruolo IAM creato alla macchina a stati in AWS Step Functions.


a. Seleziona la scheda del browser con la console Step Functions.

b. Incolla l'ARN copiato nella casella ARN ruolo IAM.

c. Fai clic su Crea macchina a stati.

03a
03a

(fai clic per ingrandire l'immagine)


Fase 4. Creazione delle funzioni AWS Lambda

Ora che hai creato la tua macchina a stati, puoi decidere come vuoi che funzioni. Puoi collegare la tua macchina a stati alle funzioni AWS Lambda e ad altri microservizi già esistenti nel tuo ambiente, oppure crearne di nuovi. In questo tutorial, creerai alcune semplici funzioni Lambda che simulano le varie fasi per gestire le chiamate di supporto, come l'assegnazione del caso al rappresentante del servizio clienti.


a. Fai clic su Servizi, digita Lambda nella casella di ricerca, quindi seleziona Lambda per aprire la console di servizio.

04a
04a

(fai clic per ingrandire l'immagine)


b. Fai clic su Crea funzione.

04b
04b

(fai clic per ingrandire l'immagine)


c. Seleziona Crea da zero.

d. Configura la tua prima funzione Lambda con queste impostazioni:

NomeOpenCaseFunction.
RuntimeNode.js 4.3.
RuoloCrea ruolo personalizzato.

Compare una nuova finestra IAM.

e. Per Nome ruolo, mantieni lambda_basic_execution e fai clic su Consenti.
Vieni automaticamente riportato alla console Lambda.

f. Fai clic su Crea funzione.

04c
04c

(fai clic per ingrandire l'immagine)


g. Sostituisci il contenuto della finestra Codice funzione con il seguente codice, quindi fai clic su Salva.

exports.handler = (event, context, callback) => {
    // Create a support case using the input as the case ID, then return a confirmation message   
   var myCaseID = event.inputCaseID;
   var myMessage = "Case " + myCaseID + ": opened...";   
   var result = {Case: myCaseID, Message: myMessage};
   callback(null, result);    
};
04d
04d

(fai clic per ingrandire l'immagine)


h. Sulla parte superiore della pagina, fai clic su Funzioni.

04e
04e

(fai clic per ingrandire l'immagine)


i. Ripeti le fasi 4b-4d per creare altre quattro funzioni Lambda, usando il ruolo IAM lambda_basic_execution creato nella fase 4c.

Definisci AssignCaseFunction come:

exports.handler = (event, context, callback) => {    
    // Assign the support case and update the status message    
    var myCaseID = event.Case;    
    var myMessage = event.Message + "assigned...";    
    var result = {Case: myCaseID, Message: myMessage};
    callback(null, result);        
};

Definisci WorkOnCaseFunction come:

exports.handler = (event, context, callback) => {    
    // Generate a random number to determine whether the support case has been resolved, then return that value along with the updated message.
    var min = 0;
    var max = 1;    
    var myCaseStatus = Math.floor(Math.random() * (max - min + 1)) + min;
    var myCaseID = event.Case;
    var myMessage = event.Message;
    if (myCaseStatus == 1) {
        // Support case has been resolved    
        myMessage = myMessage + "resolved...";
    } else if (myCaseStatus == 0) {
        // Support case is still open
        myMessage = myMessage + "unresolved...";
    } 
    var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
    callback(null, result); 
};

Definisci CloseCaseFunction come:

exports.handler = (event, context, callback) => { 
    // Close the support case    
    var myCaseStatus = event.Status;    
    var myCaseID = event.Case;    
    var myMessage = event.Message + "closed.";    
    var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
    callback(null, result);
};

Definisci EscalateCaseFunction come:

exports.handler = (event, context, callback) => {    
    // Escalate the support case 
    var myCaseID = event.Case;    
    var myCaseStatus = event.Status;    
    var myMessage = event.Message + "escalating.";    
    var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
    callback(null, result);
};

Al termine, dovresti avere cinque funzioni Lambda.

04f
04f

(fai clic per ingrandire l'immagine)


Fase 5. Popolamento del flusso di lavoro

La fase successiva consiste nel popolare gli stati delle attività nel flusso di lavoro Step Functions con le funzioni Lambda appena create.


a. Fai clic su Servizi, digita Step nella casella di ricerca, quindi seleziona Step Functions per aprire la console di servizio.

05a
05a

(fai clic per ingrandire l'immagine)


b. Sulla schermata Macchine a stati, seleziona CallCenterStateMachine e fai clic su Modifica.

05b
05b

(fai clic per ingrandire l'immagine)


c. Nella sezione Definizione macchina a stati, individua la riga sotto lo stato Caso aperto che inizia con Risorsa.

Sostituisci l'ARN con l'ARN di OpenCaseFunction.

Se fai clic sull'ARN di esempio, comparirà un elenco delle funzioni AWS Lambda nel tuo account e potrai selezionarla dall'elenco.

05c
05c

(fai clic per ingrandire l'immagine)


d. Ripeti la fase precedente per aggiornare gli ARN della funzione Lambda per gli Stati delle attività Assegna caso, Lavora su caso, Chiudi caso e Aumenta priorità caso nella tua macchina a stati, quindi fai clic su Salva.

05d
05d

(fai clic per ingrandire l'immagine)


Fase 6. Eseguire il flusso di lavoro

Il tuo flusso di lavoro serverless è pronto per essere eseguito. L'esecuzione di una macchina a stati è un'istanza del tuo flusso di lavoro e si verifica ogni volta che una macchina a stati Step Functions viene eseguita ed esegue le sue attività. Ogni macchina a stati Step Functions può avere più esecuzioni simultanee che si possono avviare dalla console Step Functions (che è quello che farai dopo), oppure utilizzando gli SDK AWS, le azioni API di Step Functions, o il CLI AWS. Un'esecuzione riceve input JSON e produce JSON output.


a. Fai clic su Start execution (Avvia esecuzione).

06a
06a

(fai clic per ingrandire l'immagine)


b. Compare una finestra di dialogo Nuova esecuzione. Per fornire un ID al tuo caso di supporto, inserisci il contenuto sotto nella finestra di dialogo Nuova esecuzione nella finestra Input, quindi fai clic su Avvia esecuzione.

{
"inputCaseID": "001"
}
06b
06b

(fai clic per ingrandire l'immagine)


c. Quando il tuo flusso di lavoro è in esecuzione, ciascuna fare cambierà colore nel riquadro Flusso di lavoro visivo. Attendi il completamento dell'esecuzione per alcuni secondi. Quindi, nel riquadro Dettagli esecuzione, fai clic su Input e Output per visualizzare gli input e i risultati del tuo flusso di lavoro.

06c
06c

(fai clic per ingrandire l'immagine)


d. Step Functions ti consente di ispezionare ciascuna fase dell'esecuzione del flusso di lavoro, compresi gli input e gli output di ciascuno stato. Fai clic su ciascuna attività nel tuo flusso di lavoro ed espandi i campi Input e Output sotto Dettagli fase. Puoi vedere che l'ID del caso che hai inserito nella macchina a stati è passato da ciascuna fase a quella successiva e che i messaggi vengono aggiornati man mano che la funzione Lambda completa le sue attività.

06d
06d

(fai clic per ingrandire l'immagine)


e. Scorri fino alla sezione Cronologia eventi di esecuzione. Fai clic su ciascuna fase dell'esecuzione per vedere come Step Functions ha chiamato le tue funzioni Lambda e ha passato i dati tra le funzioni.

06e
06e

(fai clic per ingrandire l'immagine)


f. A seconda dell'output della tua funzione WorkOnCaseFunction, il tuo flusso di lavoro potrebbe essere terminato con la risoluzione del caso di supporto e la chiusura della richiesta, o con il passaggio della priorità della richiesta al livello di supporto successivo. Puoi eseguire nuovamente l'esecuzione altre volte per osservare questo diverso comportamento. Questa immagine mostra un'esecuzione del flusso di lavoro in cui il caso di supporto è stato aumentato di priorità, causando l'uscita del flusso di lavoro con uno stato Fail.

In uno scenario reale, potresti decidere di continuare a lavorare sul caso fino a quando non sarà risolto, invece di far fallire il flusso di lavoro. Per farlo, potresti eliminare lo stato di Fail e modificare l'attività Aumenta priorità caso nella tua macchina a stati per tornare allo stato Lavora su caso. Non dovrebbero essere necessarie modifiche alle tue funzioni Lambda. Le funzioni che abbiamo costruito per questo tutorial sono solo degli esempi, quindi passeremo alla fase successiva del tutorial.

06f
06f

(fai clic per ingrandire l'immagine)


Fase 7. Interruzione delle risorse

In questa fase interromperai le tue risorse relative ad AWS Step Functions e AWS Lambda.

Importante: l'interruzione delle risorse che non vengono utilizzate attivamente consente di ridurre i costi e costituisce una best practice. La mancata interruzione delle risorse potrebbe determinare costi non desiderati.


a. Nella parte superiore della finestra della console AWS Step Functions, fai clic su Macchine a stati.

07a
07a

(fai clic per ingrandire l'immagine)


b. Nella finestra Macchine a stati, seleziona CallCenterStateMachine e fai clic su Elimina. Per confermare l'eliminazione della macchina a stati, nella finestra di dialogo che compare, fai clic su Elimina macchina a stati. La tua macchina a stati verrà eliminata entro uno o due minuti, dopo che Step Functions avrà confermato che qualsiasi esecuzione in corso è stata completata.

07b
07b

(fai clic per ingrandire l'immagine)


c. Successivamente, eliminerai le funzioni Lambda. Dal menu della console di gestione AWS, fai clic su Servizi e seleziona Lambda.

07c
07c

(fai clic per ingrandire l'immagine)


d. Nella schermata Funzioni, fai clic su ciascuna delle funzioni create per questo tutorial e seleziona Azioni, quindi Elimina. Conferma l'eliminazione facendo di nuovo clic su Elimina.

07d
07d

(fai clic per ingrandire l'immagine)


e. Infine, eliminerai i tuoi ruoli IAM. Dal menu della console di gestione AWS, fai clic su Servizi e seleziona IAM.

07e
07e

(fai clic per ingrandire l'immagine)


f. Seleziona entrambi i ruoli AEM creati per questo tutoria, quindi fai clic su Elimina ruolo. Conferma l'eliminazione facendo clic su Sì, elimina sulla finestra di dialogo.


Ora, puoi disconnetterti dalla console di gestione AWS.

07f
07f

(fai clic per ingrandire l'immagine)


Complimenti!

Ottimo lavoro! Hai appena creato un flusso di lavoro serverless usando AWS Step Functions che attiva più funzioni AWS Lambda. Il tuo flusso di lavoro ha coordinato per te tutte le tue funzioni secondo la logica che hai definito e ha passato i dati da uno stato all'altro: questo significa che non hai avuto bisogno di scrivere il codice in ogni singola funzione.

Ora che hai imparato a progettare e a eseguire un flusso di lavoro serverless, puoi passare al prossimo tutorial dove imparerai a usare Step Functions per gestire gli errori della funzione Lambda. Creerai una macchina a stati con i campi Riprova e Rileva che rispondono a codici di risposta a un'API fittizia basata sul tipo di messaggio di errore: un metodo chiamato gestione degli errori di funzione.