Tutorial: Utilizzo di Lambda con Amazon SQS - AWS Lambda

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

Tutorial: Utilizzo di Lambda con Amazon SQS

In questo tutorial creerai una funzione Lambda che utilizza messaggi da una coda di Amazon Simple Queue Service (Amazon SQS). La funzione Lambda viene eseguita ogni volta che viene aggiunto un nuovo messaggio alla coda. La funzione scrive i messaggi in un flusso Amazon CloudWatch Logs. Il seguente diagramma illustra le risorse AWS utilizzate per completare il tutorial.

Diagramma che mostra il messaggio Amazon SQS, la funzione Lambda e il flusso di File di log CloudWatch

Per completare questo tutorial, completa le seguenti attività:

  1. Crea una funzione Lambda che scrive messaggi su File di log CloudWatch.

  2. Creare una coda Amazon SQS.

  3. Crea una mappatura dell'origine degli eventi Lambda. La mappatura dell'origine degli eventi legge la coda di Amazon SQS e richiama la funzione Lambda quando viene aggiunto un nuovo messaggio.

  4. Verifica la configurazione completa aggiungendo messaggi alla coda e monitorando i risultati tramite File di log CloudWatch.

Prerequisiti

Se non disponi di un Account AWS, completa le fasi seguenti per crearne uno.

Per registrarsi a un Account AWS
  1. Apri la pagina all'indirizzo https://portal.aws.amazon.com/billing/signup.

  2. Segui le istruzioni online.

    Nel corso della procedura di registrazione riceverai una telefonata, durante la quale sarà necessario inserire un codice di verifica attraverso la tastiera del telefono.

    Durante la registrazione di un Account AWS, viene creato un Utente root dell'account AWS. L'utente root dispone dell'accesso a tutte le risorse e tutti i Servizi AWSnell'account. Come best practice di sicurezza, assegna l'accesso amministrativo a un utente e utilizza solo l'utente root per eseguire attività che richiedono l'accesso di un utente root.

Al termine del processo di registrazione, riceverai un'e-mail di conferma da AWS. È possibile visualizzare l'attività corrente dell'account e gestire l'account in qualsiasi momento accedendo all'indirizzo https://aws.amazon.com/ e selezionando Il mio account.

Dopo aver effettuato la registrazione di un Account AWS, proteggi Utente root dell'account AWS, abilita AWS IAM Identity Center e crea un utente amministratore in modo da non utilizzare l'utente root per le attività quotidiane.

Protezione dell'Utente root dell'account AWS
  1. Accedi alla AWS Management Consolecome proprietario dell'account scegliendo Utente root e immettendo l'indirizzo email dell'Account AWS. Nella pagina successiva, inserisci la password.

    Per informazioni sull'accesso utilizzando un utente root, consulta la pagina Signing in as the root user della Guida per l'utente di Accedi ad AWS.

  2. Abilita l'autenticazione a più fattori (MFA) per l'utente root.

    Per ricevere istruzioni, consulta Abilitare un dispositivo MFA virtuale per l'utente root della Account AWS (console) nella Guida per l'utente IAM.

Crea un utente con accesso amministrativo
  1. Abilita Centro identità IAM.

    Per istruzioni, consulta Abilitazione di AWS IAM Identity Center nella Guida per l'utente di AWS IAM Identity Center.

  2. In IAM Identity Center, assegna l'accesso amministrativo a un utente.

    Per un tutorial sull'utilizzo di IAM Identity Center directory come origine di identità, consulta Configurazione dell'accesso utente con IAM Identity Center directory predefinito nella Guida per l'utente di AWS IAM Identity Center.

Accesso come utente amministratore
  • Per accedere con l'utente IAM Identity Center, utilizza l'URL di accesso che è stato inviato al tuo indirizzo e-mail quando hai creato l'utente IAM Identity Center.

    Per ricevere assistenza nell'accesso mediante un utente IAM Identity Center, consulta Accedere al portale di accesso AWSnella Guida per l'utente Accedi ad AWS.

Assegna l'accesso a ulteriori utenti
  1. In IAM Identity Center, crea un set di autorizzazioni conforme alla best practice dell'applicazione di autorizzazioni con il privilegio minimo.

    Segui le istruzioni riportate nella pagina Creazione di un set di autorizzazioni nella Guida per l'utente di AWS IAM Identity Center.

  2. Assegna al gruppo prima gli utenti e poi l'accesso con autenticazione unica (Single Sign-On).

    Per istruzioni, consulta Aggiungere gruppi nella Guida per l'utente di AWS IAM Identity Center.

Se non hai ancora installato l'AWS Command Line Interface, segui i passaggi indicati in Installazione o aggiornamento della versione più recente della AWS CLI per installarla.

Per eseguire i comandi nel tutorial, sono necessari un terminale a riga di comando o una shell (interprete di comandi). In Linux e macOS, utilizza la shell (interprete di comandi) e il gestore pacchetti preferiti.

Nota

Su Windows, alcuni comandi della CLI Bash utilizzati comunemente con Lambda (ad esempio, zip) non sono supportati dai terminali integrati del sistema operativo. Per ottenere una versione integrata su Windows di Ubuntu e Bash, installa il sottosistema Windows per Linux.

Creazione del ruolo di esecuzione

Passaggio 1: creazione del ruolo di esecuzione

Un ruolo di esecuzione è un ruolo AWS Identity and Access Management (IAM) che concede un'autorizzazione della funzione Lambda per l'accesso a Servizi AWS e risorse. Per consentire alla tua funzione di leggere elementi da Amazon SQS, collega la policy di autorizzazione AWSLambdaSQSQueueExecutionRole.

Creazione di un ruolo di esecuzione e collegamento di una policy di autorizzazione Amazon SQS personalizzata
  1. Aprire la pagina Roles (Ruoli) della console IAM.

  2. Scegliere Create role (Crea ruolo).

  3. Per Tipo di entità attendibile, scegli Servizio AWS.

  4. In Caso d'uso, scegli Lambda.

  5. Seleziona Next (Successivo).

  6. Nella casella di ricerca Policy di autorizzazione, inserisci AWSLambdaSQSQueueExecutionRole.

  7. Seleziona la policy AWSLambdaSQSQueueExecutionRole, quindi scegli Avanti.

  8. In Dettagli del ruolo, per Nome del ruolo inserisci lambda-sqs-role, quindi scegli Crea ruolo.

Dopo la creazione del ruolo, prendi nota del valore del nome della risorsa Amazon (ARN) del ruolo di esecuzione. Ne avrai bisogno nelle fasi successive.

Creazione della funzione

Passaggio 2: creazione della funzione Lambda

Crea una funzione Lambda che elabora i messaggi Amazon SQS. Il codice funzione registra il corpo del messaggio di Amazon SQS su File di log CloudWatch.

Questo tutorial utilizza il runtime Node.js 18.x, ma è fornito anche un codice di esempio in altri linguaggi di runtime. Per visualizzare il codice per il runtime che ti interessa, seleziona la scheda corrispondente nella casella seguente. Il codice JavaScript che utilizzerai in questa fase è il primo esempio mostrato nella scheda JavaScript.

.NET
AWS SDK for .NET
Nota

Ulteriori informazioni su GitHub. Trova l'esempio completo e scopri come eseguire la configurazione e l'esecuzione nel repository di Esempi serverless.

Utilizzo di un evento SQS con Lambda tramite .NET.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 using Amazon.Lambda.Core; using Amazon.Lambda.SQSEvents; // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace SqsIntegrationSampleCode { public async Task FunctionHandler(SQSEvent evnt, ILambdaContext context) { foreach (var message in evnt.Records) { await ProcessMessageAsync(message, context); } context.Logger.LogInformation("done"); } private async Task ProcessMessageAsync(SQSEvent.SQSMessage message, ILambdaContext context) { try { context.Logger.LogInformation($"Processed message {message.Body}"); // TODO: Do interesting work based on the new message await Task.CompletedTask; } catch (Exception e) { //You can use Dead Letter Queue to handle failures. By configuring a Lambda DLQ. context.Logger.LogError($"An error occurred"); throw; } } }
Go
SDK per Go V2
Nota

Ulteriori informazioni su GitHub. Trova l'esempio completo e scopri come eseguire la configurazione e l'esecuzione nel repository di Esempi serverless.

Utilizzo di un evento SQS con Lambda tramite Go.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 package integration_sqs_to_lambda import ( "fmt" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func handler(event events.SQSEvent) error { for _, record := range event.Records { err := processMessage(record) if err != nil { return err } } fmt.Println("done") return nil } func processMessage(record events.SQSMessage) error { fmt.Printf("Processed message %s\n", record.Body) // TODO: Do interesting work based on the new message return nil } func main() { lambda.Start(handler) }
Java
SDK per Java 2.x
Nota

Ulteriori informazioni su GitHub. Trova l'esempio completo e scopri come eseguire la configurazione e l'esecuzione nel repository di Esempi serverless.

Utilizzo di un evento SQS con Lambda tramite Java.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.SQSEvent; import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage; public class Function implements RequestHandler<SQSEvent, Void> { @Override public Void handleRequest(SQSEvent sqsEvent, Context context) { for (SQSMessage msg : sqsEvent.getRecords()) { processMessage(msg, context); } context.getLogger().log("done"); return null; } private void processMessage(SQSMessage msg, Context context) { try { context.getLogger().log("Processed message " + msg.getBody()); // TODO: Do interesting work based on the new message } catch (Exception e) { context.getLogger().log("An error occurred"); throw e; } } }
JavaScript
SDK per JavaScript (v3)
Nota

Ulteriori informazioni su GitHub. Trova l'esempio completo e scopri come eseguire la configurazione e l'esecuzione nel repository di Esempi serverless.

Utilizzo di un evento SQS con Lambda tramite JavaScript.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 exports.handler = async (event, context) => { for (const message of event.Records) { await processMessageAsync(message); } console.info("done"); }; async function processMessageAsync(message) { try { console.log(`Processed message ${message.body}`); // TODO: Do interesting work based on the new message await Promise.resolve(1); //Placeholder for actual async work } catch (err) { console.error("An error occurred"); throw err; } }

Utilizzo di un evento SQS con Lambda tramite TypeScript.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 import { SQSEvent, Context, SQSHandler, SQSRecord } from "aws-lambda"; export const functionHandler: SQSHandler = async ( event: SQSEvent, context: Context ): Promise<void> => { for (const message of event.Records) { await processMessageAsync(message); } console.info("done"); }; async function processMessageAsync(message: SQSRecord): Promise<any> { try { console.log(`Processed message ${message.body}`); // TODO: Do interesting work based on the new message await Promise.resolve(1); //Placeholder for actual async work } catch (err) { console.error("An error occurred"); throw err; } }
PHP
SDK per PHP
Nota

Ulteriori informazioni su GitHub. Trova l'esempio completo e scopri come eseguire la configurazione e l'esecuzione nel repository di Esempi serverless.

Utilizzo di un evento SQS con Lambda tramite PHP.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 <?php # using bref/bref and bref/logger for simplicity use Bref\Context\Context; use Bref\Event\InvalidLambdaEvent; use Bref\Event\Sqs\SqsEvent; use Bref\Event\Sqs\SqsHandler; use Bref\Logger\StderrLogger; require __DIR__ . '/vendor/autoload.php'; class Handler extends SqsHandler { private StderrLogger $logger; public function __construct(StderrLogger $logger) { $this->logger = $logger; } /** * @throws InvalidLambdaEvent */ public function handleSqs(SqsEvent $event, Context $context): void { foreach ($event->getRecords() as $record) { $body = $record->getBody(); // TODO: Do interesting work based on the new message } } } $logger = new StderrLogger(); return new Handler($logger);
Python
SDK per Python (Boto3)
Nota

Ulteriori informazioni su GitHub. Trova l'esempio completo e scopri come eseguire la configurazione e l'esecuzione nel repository di Esempi serverless.

Utilizzo di un evento SQS con Lambda tramite Python.

# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 def lambda_handler(event, context): for message in event['Records']: process_message(message) print("done") def process_message(message): try: print(f"Processed message {message['body']}") # TODO: Do interesting work based on the new message except Exception as err: print("An error occurred") raise err
Ruby
SDK per Ruby
Nota

Ulteriori informazioni su GitHub. Trova l'esempio completo e scopri come eseguire la configurazione e l'esecuzione nel repository di Esempi serverless.

Utilizzo di un evento SQS con Lambda tramite Ruby.

# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 def lambda_handler(event:, context:) event['Records'].each do |message| process_message(message) end puts "done" end def process_message(message) begin puts "Processed message #{message['body']}" # TODO: Do interesting work based on the new message rescue StandardError => err puts "An error occurred" raise err end end
Rust
SDK per Rust
Nota

Ulteriori informazioni su GitHub. Trova l'esempio completo e scopri come eseguire la configurazione e l'esecuzione nel repository di Esempi serverless.

Utilizzo di un evento SQS con Lambda tramite Rust.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 use aws_lambda_events::event::sqs::SqsEvent; use lambda_runtime::{run, service_fn, Error, LambdaEvent}; async fn function_handler(event: LambdaEvent<SqsEvent>) -> Result<(), Error> { event.payload.records.iter().for_each(|record| { // process the record tracing::info!("Message body: {}", record.body.as_deref().unwrap_or_default()) }); Ok(()) } #[tokio::main] async fn main() -> Result<(), Error> { tracing_subscriber::fmt() .with_max_level(tracing::Level::INFO) // disable printing the name of the module in every log line. .with_target(false) // disabling time is handy because CloudWatch will add the ingestion time. .without_time() .init(); run(service_fn(function_handler)).await }
Creazione di una funzione Lambda in Node.js
  1. Crea una directory per il progetto, quindi passa a quella directory.

    mkdir sqs-tutorial cd sqs-tutorial
  2. Copia il codice JavaScript di esempio in un nuovo file denominato index.js.

  3. Crea un pacchetto di implementazione utilizzando il seguente comando zip.

    zip function.zip index.js
  4. Crea una funzione Lambda utilizzando il comando create-function della AWS CLI. Per il role parametro, immettere l'ARN del ruolo di esecuzione creato in precedenza.

    Nota

    La funzione Lambda e la coda Amazon SQS devono trovarsi nella stessa Regione AWS.

    aws lambda create-function --function-name ProcessSQSRecord \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::111122223333:role/lambda-sqs-role

Test della funzione

Passaggio 3: esecuzione del test della funzione Lambda

Invocare la funzione Lambda manualmente utilizzando il comando invoke della AWS CLI e un evento Amazon SQS di esempio.

Invocazione della funzione Lambda con un evento di esempio
  1. Salva il seguente JSON come un file denominato input.json. Questo JSON simula un evento che Amazon SQS potrebbe inviare alla tua funzione Lambda, dove "body" contiene il messaggio effettivo dalla coda. In questo esempio, il messaggio è "test".

    Esempio Evento Amazon SQS

    Questo è un evento di test: non è necessario modificare il messaggio o il numero di account.

    { "Records": [ { "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d", "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", "body": "test", "attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1545082649183", "SenderId": "AIDAIENQZJOLO23YVJ4VO", "ApproximateFirstReceiveTimestamp": "1545082649185" }, "messageAttributes": {}, "md5OfBody": "098f6bcd4621d373cade4e832627b4f6", "eventSource": "aws:sqs", "eventSourceARN": "arn:aws:sqs:us-east-1:111122223333:my-queue", "awsRegion": "us-east-1" } ] }
  2. Esegui il comando invoke della AWS CLI. Questo comando restituisce i log di CloudWatch nella risposta. Per ulteriori informazioni sul recupero di oggetti, consulta Accedi ai log con AWS CLI.

    aws lambda invoke --function-name ProcessSQSRecord --payload file://input.json out --log-type Tail \ --query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode

    L'opzione cli-binary-format è necessaria se si utilizza la versione 2 della AWS CLI. Per rendere questa impostazione come predefinita, esegui aws configure set cli-binary-format raw-in-base64-out. Per ulteriori informazioni, consulta la pagina AWS CLI supported global command line options nella Guida per l'utente di AWS Command Line Interface versione 2.

  3. Individua il log INFO nella risposta. È qui che la funzione Lambda registra il corpo del messaggio. I log visualizzati dovrebbero essere di questo tipo:

    2023-09-11T22:45:04.271Z 348529ce-2211-4222-9099-59d07d837b60 INFO Processed message test 2023-09-11T22:45:04.288Z 348529ce-2211-4222-9099-59d07d837b60 INFO done

Creazione di una coda Amazon SQS

Passaggio 4: creazione di una coda Amazon SQS

Creare una coda Amazon SQS che la funzione Lambda può utilizzare come origine eventi. La funzione Lambda e la coda Amazon SQS devono trovarsi nella stessa Regione AWS.

Per creare una coda
  1. Apri la console Amazon SQS.

  2. Scegliere Crea coda.

  3. Inserisci un nome per la coda. Lascia tutte le altre proprietà sui valori predefiniti.

  4. Scegliere Crea coda.

Dopo aver creato la coda, prendi nota del suo ARN. Questa operazione è necessaria nella fase successiva quando si associa la coda alla funzione Lambda.

Configurazione dell'origine eventi

Passaggio 5: configurazione della mappatura dell'origine degli eventi

Collega la coda Amazon SQS alla tua funzione Lambda creando una mappatura dell'origine degli eventi. La mappatura dell'origine degli eventi legge la coda di Amazon SQS e richiama la funzione Lambda quando viene aggiunto un nuovo messaggio.

Per creare una mappatura tra la coda Amazon SQS e la funzione Lambda, esegui il comando create-event-source-mapping della AWS CLI. Esempio:

aws lambda create-event-source-mapping --function-name ProcessSQSRecord --batch-size 10 \ --event-source-arn arn:aws:sqs:us-east-1:111122223333:my-queue

Per ottenere un elenco delle mappature delle origini degli eventi, usa il comando list-event-source-mappings. Esempio:

aws lambda list-event-source-mappings --function-name ProcessSQSRecord

Invio di un messaggio di test

Passaggio 6: invio di un messaggio di test
Invio di un messaggio Amazon SQS alla funzione Lambda
  1. Apri la console Amazon SQS.

  2. Scegli la coda creata in precedenza.

  3. Scegli Invia e ricevi messaggi.

  4. Nella sezione Corpo del messaggio, inserisci un messaggio di test, ad esempio "questo è un messaggio di prova".

  5. Scegliere Send Message (Invia messaggio).

Lambda esegue il polling della coda per gli aggiornamenti. Quando c'è un nuovo messaggio, Lambda richiama la tua funzione con questi nuovi dati di evento dalla coda. Se il gestore della funzione conclude senza eccezioni, Lambda considera il messaggio elaborato correttamente e inizia a leggere nuovi messaggi nella coda. Dopo aver elaborato correttamente un messaggio, Lambda lo elimina automaticamente dalla coda. Se il gestore genera un'eccezione, Lambda considera il batch dei messaggi come non correttamente elaborato e Lambda richiama la funzione con lo stesso batch di messaggi.

Controllo dei log di CloudWatch

Passaggio 6: invio di un messaggio di test
Verifica della corretta elaborazione del messaggio da parte della funzione
  1. Aprire la pagina Functions (Funzioni) della console Lambda.

  2. Scegli la funzione ProcessSQSRecord.

  3. Scegli Monitor (Monitoraggio).

  4. Scegli Visualizza log CloudWatch.

  5. Nella console CloudWatch, scegli il Flusso di log per la funzione.

  6. Individua il log INFO. È qui che la funzione Lambda registra il corpo del messaggio. Dovresti vedere il messaggio che hai inviato dalla coda Amazon SQS. Esempio:

    2023-09-11T22:49:12.730Z b0c41e9c-0556-5a8b-af83-43e59efeec71 INFO Processed message this is a test message.

Pulizia delle risorse

Ora è possibile eliminare le risorse create per questo tutorial, a meno che non si voglia conservarle. Eliminando le risorse AWS che non si utilizzano più, è possibile evitare addebiti superflui sul proprio account Account AWS.

Per eliminare il ruolo di esecuzione
  1. Aprire la pagina Roles (Ruoli) della console IAM.

  2. Selezionare il ruolo di esecuzione creato.

  3. Scegliere Elimina.

  4. Inserisci il nome del ruolo nel campo di immissione testo e seleziona Delete (Elimina).

Per eliminare la funzione Lambda
  1. Aprire la pagina Functions (Funzioni) della console Lambda.

  2. Selezionare la funzione creata.

  3. Scegliere Operazioni, Elimina.

  4. Digita delete nel campo di immissione testo e scegli Delete (Elimina).

Per eliminare la coda Amazon SQS
  1. Accedere alla AWS Management Console e aprire la console Amazon SQS all'indirizzo https://console.aws.amazon.com/sqs/.

  2. Selezionare la coda creata.

  3. Scegliere Elimina.

  4. Inserisci confirm nel campo di immissione del testo.

  5. Scegliere Elimina.