con AWS Step Functions e Amazon SQS

Livello: Intermedio
Durata: 10 minuti

Questo tutorial illustra come usare AWS Step Functions e Amazon SQS per progettare ed eseguire un flusso di lavoro serverless che coordini un microservizio basato su una coda di messaggi. Step Functions è un servizio di gestione serverless che consente di coordinare facilmente più servizi AWS in flussi di lavoro flessibili, di cui è semplice eseguire il debug, e facili da modificare. Amazon SQS è un servizio AWS che consente ai componenti di applicazioni di comunicare con il cloud.

Questo tutorial simulerà le richieste di verifica dell'inventario dagli ordini in entrata in un'applicazione di e-commerce come parte di un flusso di lavoro di elaborazione degli ordini. Step Functions invierà le richieste di verifica inventario a una coda su SQS. Una funzione AWS Lambda agirà da microservizio di inventario che utilizza una cosa per memorizzare le richieste nel buffer. Quando richiama una richiesta, controlla l'inventario e quindi restituisce il risultato a Step Functions. Se un’attività in Step Functions è configurata in questo modo, allora è detta modello di callback. I modelli di callback consentono di integrare attività asincrone nel flusso di lavoro, ad esempio il microservizio di verifica dell'inventario di questo tutorial.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-diagram

Questo tutorial richiede un account AWS

Crea un account gratuito

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

Visualizza i dettagli del piano gratuito di AWS »

a. Apri la Console di gestione AWS e tieni sotto mano questa guida dettagliata. Quando viene caricata la schermata, inserisci nome utente e password per iniziare. Successivamente, digita SQS nella casella di ricerca e seleziona Servizio di coda semplice per aprire la console del servizio.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-1a

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-1a

b. Se viene mostrata la pagina principale della console di SQS, come appare nello screenshot, fai clic su Inizia subito. Se non visualizzi questa pagina, passa alla fase successiva.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-1b

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-1b

In questa fase, creerai e configurerai una coda di Amazon SQS. Una coda è un buffer affidabile e a scalabilità elevata che memorizza i messaggi durante il trasferimento fra applicazioni distribuite o microservizi. Le code aiutano a disaccoppiare le applicazioni, collegare microservizi, attività batch o memorizzare le notifiche.
Il nostro caso d’uso per SQS in questo tutorial simulerà le richieste di verifica dello storage dell'inventario dagli ordini in entrata in un'applicazione di e-commerce.


a. Per prima cosa, verrà creata una semplice coda che memorizza gli ordini inseriti nel negozio. Immetti Ordini nel campo del Nome coda.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2a

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2a

b. Per questo tutorial, non è necessario un ordinamento rigoroso, quindi verrà apportata alcuna modifica al tipo di coda. Lascia selezionata la coda standard.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2b

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2b

c. È possibile configurare la coda per modificare impostazioni come il periodo di conservazione, la dimensione massima del messaggio e i ritardi nella consegna. Per questo tutorial, si manterranno i parametri predefiniti. SelezionaCoda di creazione rapida.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2c

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2c

d. La nuova coda viene creata e selezionata nell'elenco delle code.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2d

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-2d

La fase successiva consiste nel progettare un flusso di lavoro che descriva in che modo desideri processare i tuoi ordini e-commerce. I flussi di lavoro descrivono un processo come una serie di attività distinte che possono essere ripetute più volte.
Quindi, progetterai il tuo flusso di lavoro in AWS Step Functions. Il flusso di lavoro richiederà la verifica dell’inventario da un microservizio. Numerosi microservizi utilizzano le code per ricevere le richieste. In questo tutorial, utilizzeremo una funzione AWS Lambda che rappresenta il microservizio.


a. Apri la console AWS Step Functions. Seleziona Autore con frammenti di codice, quindi assegna il nome InventoryStateMachine alla macchina a stati.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3c

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3c

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

Questa macchina a stati utilizza uno stato di attività per inserire un messaggio in una coda SQS. Lo stato dell’attività è configurato per un modello di callback. Quando aggiungi .waitForTaskToken alla tua risorsa, Step Functions aggiungerà un token dell’attività al payload JSON e attenderà un callback. Il microservizio potrà quindi restituire un risultato a Step Functions richiamando l’API Step Functions.

{
  "Comment": "An example of the Amazon States Language for starting a callback task.",
  "StartAt": "Check Inventory",
  "States": {
    "Check Inventory": {
      "Type": "Task",
      "Resource": "arn:aws:states:::sqs:sendMessage.waitForTaskToken",
      "Parameters": {
        "QueueUrl": "<INSERT SQS QUEUE URL HERE>",
        "MessageBody": {
          "MessageTitle": "Callback Task started by Step Functions",
          "TaskToken.$": "$$.Task.Token"
        }
      },
      "Next": "Notify Success",
      "Catch": [
      {
        "ErrorEquals": [ "States.ALL" ],
        "Next": "Notify Failure"
      }
      ]
    },
    "Notify Success": {
      "Type": "Pass",
      "Result": "Callback Task started by Step Functions succeeded",
      "End": true
    },
    "Notify Failure": {
      "Type": "Pass",
      "Result": "Callback Task started by Step Functions failed",
      "End": true
    }
  }
}
tmt-orchestrate-microservices-with-message-queues-on-step-functions-3d

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3d

c. Copia l’URL della coda SQS dalla console SQS e incollalo nella definizione di macchina a stati.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3e

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3e

d. Fai clic sul pulsante Aggiorna per consentire a Step Functions di tradurre la definizione della macchina a stati ASL in un flusso di lavoro visivo. Puoi facilmente verificare se il processo sia descritto o meno nel modo controllando il flusso di lavoro visivo. Quando il microservizio restituisce un risultato, la macchina a stati avanzerà verso il basso nel ramo riuscito. Se qualcosa va storto, puoi catturare l'eccezione e scendere nel ramo giusto per intraprendere le azioni correttive.

Fai clic su Successivo.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3f

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3f

e. Successivamente, aggiungerai un ruolo IAM al tuo flusso di lavoro. Seleziona Crea un ruolo IAM e rinominalo in delivery-state-machine-role. Step Functions analizzerà il tuo flusso di lavoro e genererà una policy IAM che include le risorse utilizzate dal flusso di lavoro stesso. Fai clic su Crea macchina a stati. Sulla schermata apparirà un banner verde a conferma dell’avvenuta creazione della macchina a stati.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3g

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-3g

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 SQS.


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 del servizio.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4a

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4a

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

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4b

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4b

c. Sulla schermata Crea ruoli, lascia selezionato Servizio AWS, seleziona Lambda quindi fai clic su Successivo: Autorizzazioni.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4c

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4c

d. Nella schermata Crea ruolo, allega
le policy AmazonSQSFullAccess e AWSStepFunctionsFullAccess. Fai clic su Successivo: Tag quindi su Successivo: Verifica.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4d

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4d

e. Come nome ruolo immetti inventory-lambda-role e fai clic su Crea ruolo.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4e

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-4e

In questa fase, creerai una funzione Lambda che simulerà un microservizio di inventario. La funzione Lambda richiama i messaggi da SQS e restituisce un messaggio a Step Functions con il risultato della richiesta.


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

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5a

b. Seleziona Crea funzione.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5b

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5b

c. Lascia selezionato Crea da zero. Quindi, configura la funzione Lambda come segue:

Per Nome, digita Inventory.
Per Runtime, scegli Node.js 8.10.
Per Ruolo, seleziona Usa un ruolo esistente.

Seleziona inventory-lambda-role dall’elenco.
Fai clic su Crea funzione.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5c

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5c

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

console.log('Loading function');
          const aws = require('aws-sdk');

          exports.handler = (event, context, callback) => {
              const stepfunctions = new aws.StepFunctions();

              for (const record of event.Records) {
                  const messageBody = JSON.parse(record.body);
                  const taskToken = messageBody.TaskToken;

                  const params = {
                      output: "\"Callback task completed successfully.\"",
                      taskToken: taskToken
                  };

                  console.log(`Calling Step Functions to complete callback task with params ${JSON.stringify(params)}`);

                  stepfunctions.sendTaskSuccess(params, (err, data) => {
                      if (err) {
                          console.error(err.message);
                          callback(err.message);
                          return;
                      }
                      console.log(data);
                      callback(null);
                  });
              }
          };
tmt-orchestrate-microservices-with-message-queues-on-step-functions-5d

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5d

e. Seleziona il trigger SQS. Seleziona Abilita per la coda Ordini. Fai clic su Aggiungi quindi seleziona Salva.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5e

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-5e

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 Servizi, digita Step nella casella di ricerca, quindi seleziona Step Functions per aprire la console del servizio.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6a

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6a

b. Nella schermata Macchine a stati fai clic su InventoryStateMachine.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6b

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6b

c. Fai clic su Avvia esecuzione.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6c

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6c

d. Viene visualizzata una nuova finestra di dialogo di esecuzione dove puoi inserire l’input per la macchina a stati. Questa macchina a stati non dipende dall’input. Puoi utilizzare l’input predefinito. Fai clic su Avvia esecuzione.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6d

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6d

e. Quando il tuo flusso di lavoro è in esecuzione, ciascuna fase cambierà colore nel riquadro del 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 flusso di lavoro.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6e

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6e

f. 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 in Dettagli fase. Puoi vedere che il payload di input nella macchina a stati è passato da ciascuna fase a quella successiva e che il payload viene aggiornato man mano che ogni fase viene completata.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6f

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6f

g. Scorri fino alla sezione Storico eventi di esecuzione. Fai clic su ciascuna fase dell'esecuzione per vedere come Step Functions ha chiamato SQS e ha passato i payload tra le fasi.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6g

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6g

h. In base all’output di InventoryStateMachine, il completamento del flusso di lavoro può avere esisto positivo o negativo.
In uno scenario del mondo reale, potresti decidere di riprovare l'attività o di intraprendere altre azioni, a seconda del messaggio di errore ricevuto.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6h

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-6h

In questa fase interromperai le tue risorse relative ad AWS Step Functions e AWS Lambda.
Importante: l'arresto 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.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7a

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7a

b. Nella finestra Macchine a stati, fai clic su InventoryStateMachine e seleziona Elimina. Conferma l'azione selezionando Elimina macchina a stati nella finestra di dialogo. 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.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7b

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7b

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

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7c

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7c

d. Nella schermata Funzioni, fai clic sulla funzione Inventario creata per questo tutorial, quindi seleziona Azioni e poi Elimina. Conferma l'eliminazione facendo di nuovo clic su Elimina.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7d

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7d

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

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7e

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7e

f. Seleziona i ruoli IAM creati per questo tutorial, quindi fai clic su Elimina ruolo. Conferma l'eliminazione facendo clic su Sì, elimina nella finestra di dialogo.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7f

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7f

g. Nell'elenco delle code, seleziona la coda Ordini. Quindi, da Azioni coda, seleziona Elimina coda.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7g

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7g

h. Sarà visualizzata la finestra di dialogo Elimina code. Puoi eliminare la coda anche se vi sono ancora dei messaggi. Scegli Sì, elimina la coda. La coda è stata eliminata.

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7h

(fai clic per ingrandire)

tmt-orchestrate-microservices-with-message-queues-on-step-functions-7h

Hai coordinato un microservizio nel cloud con una coda di messaggi utilizzando AWS Step Functions e Amazon SQS. Step Functions può essere un’ottima soluzione quando hai bisogno di coordinare risorse applicative che devono garantire produttività e agilità.

Ora che hai imparato a coordinare i microservizi basati sulle code, puoi passare al prossimo tutorial dove imparerai a usare Step Functions per gestire gli errori. 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.