View a markdown version of this page

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, crei una Lambda Event Function che utilizza i messaggi da una coda Amazon Simple Queue Service (Amazon SQS). La funzione evento 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 di eventi Lambda e il flusso di log. CloudWatch

Per completare questo tutorial, completa le seguenti attività:

  1. Crea una funzione evento Lambda che scriva CloudWatch messaggi nei registri.

  2. Creare una coda Amazon SQS.

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

  4. Verifica la configurazione aggiungendo messaggi alla coda e monitorando i risultati in Logs. CloudWatch

Prerequisiti

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

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 Windows-integrated versione di Ubuntu e Bash, installa il sottosistema Windows per Linux.

Creazione del ruolo di esecuzione

Fase 1: creare il ruolo di esecuzione.

Un ruolo di esecuzione è un ruolo AWS Identity and Access Management (IAM) che concede a una Lambda Event Function l'autorizzazione all' Servizi AWS accesso e alle risorse. Per consentire alla tua funzione di leggere articoli da Amazon SQS, allega la politica di AWSLambdaSQSQueueExecutionRoleautorizzazione.

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 Crea ruolo.

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

  4. In Caso d'uso, scegli Lambda.

  5. Scegli Avanti.

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

  7. Seleziona la AWSLambdaSQSQueueExecutionRolepolitica, 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.

Crea la funzione dell'evento

Fase 2: creare la funzione evento Lambda.

Crea una funzione evento Lambda che elabori i tuoi messaggi Amazon SQS. Il codice della funzione registra il corpo del messaggio CloudWatch Amazon SQS in Logs.

Questo tutorial utilizza il runtime Node.js 24, ma abbiamo anche fornito 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 JavaScript codice che utilizzerai in questo passaggio è nel primo esempio mostrato nella JavaScriptscheda.

.NET
SDK per .NET
Nota

C'è altro 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

C'è dell'altro 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

C'è dell'altro 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

C'è altro da fare. GitHub Trova l’esempio completo e scopri come eseguire la configurazione e l’esecuzione nel repository di Esempi serverless.

Consumo di un evento SQS con JavaScript Lambda utilizzando.

// 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; } }

Consumo di un evento SQS con TypeScript Lambda utilizzando.

// 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

C'è altro da fare. 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

C'è dell'altro 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

C'è dell'altro 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

C'è altro da fare. 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 }
Per creare una funzione Node.js evento Lambda
  1. Crea una directory per il progetto, quindi passa a quella directory.

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

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

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

    Nota

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

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

Prova la funzione Event

Fase 3: testare la funzione di eventi Lambda.

Richiama manualmente la tua Lambda Event Function utilizzando invoke AWS CLI il comando e un evento Amazon SQS di esempio.

Per richiamare la funzione Lambda Event 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 Lambda Event Function, "body" dove 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 seguente comando invoke. AWS CLI Questo comando restituisce CloudWatch i log 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'cli-binary-formatopzione è obbligatoria se si utilizza la AWS CLI versione 2. 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 di eventi 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

Fase 4: creare la coda Amazon SQS.

Crea una coda Amazon SQS che la Lambda Event Function può utilizzare come origine di eventi. La funzione Lambda Event e la coda Amazon SQS devono trovarsi nella stessa posizione. Regione AWS

Come 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. Ne hai bisogno nel passaggio successivo quando associ la coda alla tua Lambda Event Function.

Configurazione dell'origine eventi

Passaggio 5: configura la mappatura delle sorgenti degli eventi.

Connetti la coda Amazon SQS alla tua Lambda Event Function creando una mappatura delle sorgenti degli eventi. La mappatura delle sorgenti degli eventi legge la coda di Amazon SQS e richiama la tua funzione di evento Lambda quando viene aggiunto un nuovo messaggio.

Per creare una mappatura tra la coda Amazon SQS e la Lambda Event Function, usa il comando create-event-source-mapping. 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: invia un messaggio Amazon SQS di prova per richiamare la funzione di eventi Lambda utilizzando la console Amazon SQS.
Per inviare un messaggio Amazon SQS alla funzione eventi 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 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.

Controlla i log CloudWatch

Fase 7: Verifica che la Lambda Event Function abbia elaborato il messaggio Amazon SQS controllando CloudWatch il gruppo di log Logs.
Per confermare che la Event Function ha elaborato il messaggio
  1. Apri la pagina Event Functions della console Lambda.

  2. Scegli la funzione ProcessSQSRecord.

  3. Scegli Monitor (Monitoraggio).

  4. Scegli Visualizza CloudWatch registri.

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

  6. Individua il log INFO. È qui che la funzione di eventi 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 AWS le risorse che non utilizzi più, eviti addebiti inutili ai tuoi. Account AWS

Come eliminare il ruolo di esecuzione
  1. Aprire la pagina 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 Elimina.

Per eliminare la funzione evento Lambda
  1. Apri la pagina Event Functions della console Lambda.

  2. Seleziona la funzione di evento che hai creato.

  3. Scegliere Operazioni, Elimina.

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

Per eliminare la coda Amazon SQS
  1. Accedi Console di gestione AWS e apri 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. Scegli Delete (Elimina).