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

Invocazione asincrona

Molti Servizi AWS, come Amazon Simple Storage Service (Amazon S3) e Amazon Simple Notification Service (Amazon SNS), richiamano le funzioni in modo asincrono per elaborare gli eventi. Quando si richiama una funzione in modo asincrono, non si attende una risposta dal codice della funzione. Si passa l'evento a Lambda e Lambda si occupa del resto. Puoi configurare il modo in cui Lambda gestisce gli errori e inviare i record di chiamata a una risorsa downstream come Amazon Simple Queue Service (Amazon SQS) o Amazon EventBridge () per concatenare i componenti della tua applicazione. EventBridge

Come Lambda gestisce le chiamate asincrone

Il seguente diagramma mostra i client che richiamano una funzione Lambda in modo asincrono. Lambda accoda gli eventi prima di inviarli alla funzione.

I client invocano una funzione in modo asincrono. Lambda accoda gli eventi prima di inviarli alla funzione.

Per l'invocazione asincrona, Lambda inserisce l'evento in una coda e restituisce una risposta di esito positivo senza ulteriori informazioni. Un processo separato legge gli eventi dalla coda ed esegue la funzione. Per invocare una funzione in modo asincrono, impostare il parametro tipo di invocazione su Event.

aws lambda invoke \ --function-name my-function \ --invocation-type Event \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json

L'cli-binary-formatopzione è obbligatoria se utilizzi la versione 2. 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.

{ "StatusCode": 202 }

Il file di output (response.json) non contiene informazioni, ma è comunque creato quando si esegue il comando. Se Lambda non è in grado di aggiungere l'evento alla coda, il messaggio di errore viene visualizzato nell'output del comando.

Lambda gestisce la coda di eventi asincroni della funzione e tenta di riprovare in caso di errori. Se la funzione restituisce un errore, Lambda tenta di eseguirlo altre due volte, con un minuto di attesa tra i primi due tentativi e due minuti tra il secondo e il terzo. Gli errori di funzione includono gli errori restituiti dal codice della funzione e gli errori restituiti dal runtime della funzione, ad esempio timeout.

Se la funzione non dispone di sufficiente concorrenza per elaborare tutti gli eventi, ulteriori richieste saranno sottoposte a throttling. Per gli errori di throttling (429) e gli errori di sistema (serie 500), Lambda restituisce l'evento alla coda e tenta di eseguire nuovamente la funzione per un massimo di 6 ore. L'intervallo tra i tentativi aumenta esponenzialmente da 1 secondo dopo il primo tentativo a un massimo di 5 minuti. Se la coda contiene molte voci, Lambda aumenta l'intervallo dei tentativi e riduce la velocità con cui legge gli eventi dalla coda.

Anche se la funzione non restituisce un errore, è possibile che riceva lo stesso evento da Lambda più volte perché la coda stessa alla fine è coerente. Se la funzione non è in grado di seguire gli eventi in entrata, gli eventi possono anche essere eliminati dalla coda senza essere inviati alla funzione. Verificare che il codice della funzione gestisca normalmente gli eventi duplicati e che si disponga di sufficiente concorrenza per gestire tutte le invocazioni.

Quando la coda è molto lunga, i nuovi eventi potrebbero diventare datati prima che Lambda abbia la possibilità di inviarli alla funzione. Quando un evento scade o fallisce tutti i tentativi di elaborazione, Lambda lo scarta. È possibile configurare la gestione degli errori per una funzione per ridurre il numero di tentativi eseguiti da Lambda o per eliminare più rapidamente gli eventi non elaborati.

È anche possibile configurare Lambda in modo che invii un record di invocazione a un altro servizio. Lambda supporta le seguenti destinazioni per l'invocazione asincrona. Tieni presente che le code FIFO SQS e gli argomenti FIFO SNS non sono supportati.

  • Amazon SQS: una coda SQS standard.

  • Amazon SNS: un argomento SNS standard.

  • AWS Lambda: una funzione Lambda.

  • Amazon EventBridge: un bus per EventBridge eventi.

Il record di invocazione contiene dettagli sulla richiesta e la risposta in formato JSON. È possibile configurare destinazioni separate per gli eventi che vengono elaborati correttamente e per quelli che restituiscono un errore a ogni tentativo di elaborazione. In alternativa, è possibile configurare una coda standard di Amazon SQS o un argomento standard di Amazon SNS come coda DLQ per gli eventi scartati. Per le code DLQ, Lambda invia solo il contenuto dell'evento, senza dettagli sulla risposta.

Se Lambda non è in grado di inviare un record a una destinazione che hai configurato, invia una DestinationDeliveryFailures metrica ad Amazon. CloudWatch Ciò può verificarsi se la configurazione include un tipo di destinazione non supportato, ad esempio una coda FIFO di Amazon SQS o un argomento FIFO di Amazon SNS. Gli errori di recapito possono verificarsi anche a causa di errori di autorizzazioni e limiti di dimensione. Per ulteriori informazioni sui parametri di invocazione Lambda, consulta Parametri di invocazione.

Nota

Per impedire l'attivazione di una funzione, è possibile impostare la simultaneità riservata della funzione su zero. Quando si imposta la simultaneità riservata su zero per una funzione chiamata in modo asincrono, Lambda inizia a inviare i nuovi eventi alla coda DLQ configurata o alla destinazione degli eventi in caso di errore, senza nuovi tentativi. Per elaborare gli eventi inviati mentre la simultaneità riservata era impostata su zero, è necessario utilizzare gli eventi dalla coda DLQ o dalla destinazione degli eventi in caso di errore.

Configurazione della gestione degli errori per la chiamata asincrona

Utilizzare la console Lambda per configurare le impostazioni di gestione degli errori per una funzione, una versione o un alias.

Per configurare la gestione degli errori
  1. Aprire la pagina Funzioni della console Lambda.

  2. Scegliere una funzione.

  3. Scegliere Configuration (Configurazione), quindi scegli Asynchronous invocation (Chiamata asincrona).

  4. In Asynchronous invocation (Chiamata asincrona), scegliere Edit (Modifica).

  5. Configura le impostazioni seguenti.

    • Maximum age of event (Età massima dell'evento): il tempo massimo per cui Lambda conserva un evento nella coda degli eventi asincroni, fino a 6 ore.

    • Retry attempts (Nuovi tentativi): il numero di tentativi che Lambda effettua quando la funzione restituisce un errore, tra 0 e 2.

  6. Scegliere Save (Salva).

Quando un evento di invocazione supera l'età massima o fallisce tutti i nuovi tentativi, Lambda lo scarta. Per conservare una copia degli eventi eliminati, configurare una destinazione evento non riuscita.

Configurazione delle destinazioni per l'invocazione asincrona

Per mantenere i record delle chiamate asincrone, aggiungi una destinazione alla funzione. È possibile scegliere di inviare a una destinazione le chiamate riuscite o non riuscite. Ogni funzione può avere più destinazioni, quindi è possibile configurare destinazioni separate per eventi riusciti e non riusciti. Ogni record inviato alla destinazione è un documento JSON con i dettagli relativi alla chiamata. Come per le impostazioni di gestione degli errori, è possibile impostare le destinazioni su una funzione, una versione della funzione o un alias.

La tabella seguente elenca le destinazioni supportate per i record di chiamata asincrona. Affinché Lambda invii correttamente i record alla destinazione prescelta, assicurati che il ruolo di esecuzione della funzione disponga anche delle autorizzazioni pertinenti. La tabella descrive anche il modo in cui ogni tipo di destinazione riceve il record di chiamata JSON.

Tipo di destinazione Autorizzazione richiesta Formato JSON specifico della destinazione

Coda Amazon SQS

seghe: SendMessage

Lambda passa il record di chiamata come Message alla destinazione.

Argomento Amazon SNS

sns:Publish

Lambda passa il record di chiamata come Message alla destinazione.

Funzione Lambda

InvokeFunction

Lambda passa il record di chiamata come payload alla funzione.

EventBridge

eventi: PutEvents

  • Lambda passa il record di invocazione come nella detail chiamata. PutEvents

  • Il valore per il campo di eventi source è lambda.

  • Il valore per il campo dell'evento detail-type è "Risultato della chiamata della funzione Lambda - Successo" o "Risultato della chiamata della funzione Lambda - Errore".

  • Il campo dell'evento resource contiene i nomi della risorsa Amazon (ARN) della funzione e della destinazione.

  • Per altri campi relativi agli eventi, consulta Amazon EventBridge events.

L'esempio seguente mostra un record di invocazione per un evento che non è stato possibile elaborare per tre volte a causa di un errore di funzione. Il record di invocazione contiene dettagli sull'evento, la risposta e il motivo per cui il record è stato inviato.

{ "version": "1.0", "timestamp": "2019-11-14T18:16:05.568Z", "requestContext": { "requestId": "e4b46cbf-b738-xmpl-8880-a18cdf61200e", "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:$LATEST", "condition": "RetriesExhausted", "approximateInvokeCount": 3 }, "requestPayload": { "ORDER_IDS": [ "9e07af03-ce31-4ff3-xmpl-36dce652cb4f", "637de236-e7b2-464e-xmpl-baf57f86bb53", "a81ddca6-2c35-45c7-xmpl-c3a03a31ed15" ] }, "responseContext": { "statusCode": 200, "executedVersion": "$LATEST", "functionError": "Unhandled" }, "responsePayload": { "errorMessage": "RequestId: e4b46cbf-b738-xmpl-8880-a18cdf61200e Process exited before completing request" } }

I passaggi seguenti descrivono come configurare una destinazione per una funzione utilizzando la console Lambda.

Configurazione di una destinazione per i record di chiamata asincrona
  1. Aprire la pagina Funzioni della console Lambda.

  2. Scegliere una funzione.

  3. In Function overview (Panoramica delle funzioni), scegliere Add destination (Aggiungi destinazione).

  4. Per Source (Origine), scegliere Asynchronous invocation (Chiamata asincrona).

  5. Per Condition (Condizione) scegliere tra le seguenti opzioni:

    • In caso di errore: viene inviato un record quando l'evento fallisce tutti i tentativi di elaborazione o supera l'età massima.

    • On success (In caso di esito positivo): viene inviato un record quando la funzione elabora correttamente un'invocazione asincrona.

  6. Per Destination type (Tipo di destinazione), scegliere il tipo di risorsa che riceve il record di invocazione.

  7. Per Destination (Destinazione), scegliere una risorsa.

  8. Scegliere Save (Salva).

Quando un'invocazione corrisponde alla condizione, Lambda invia un documento JSON con i dettagli sull'invocazione alla destinazione.

Formato JSON specifico della destinazione
  • Per Amazon SQS e Amazon SNS (SnsDestination e SqsDestination), il record di invocazione viene trasferito come Message fino alla destinazione.

  • Per Lambda (LambdaDestination), il record di invocazione viene trasferito come payload alla funzione.

  • Per EventBridge (EventBridgeDestination), il record di invocazione viene passato come contenuto detail nella chiamata. PutEvents Il valore per il campo di eventi source è lambda. Il valore per il campo dell'evento detail-type è Risultato dell'invocazione della funzione Lambda - Successo o Risultato dell'invocazione della funzione Lambda - Errore. Il campo dell'evento resource contiene i nomi della risorsa Amazon (ARN) della funzione e della destinazione. Per altri campi relativi agli eventi, consulta Amazon EventBridge events.

L'esempio seguente mostra un record di invocazione per un evento che non è stato possibile elaborare per tre volte a causa di un errore di funzione.

Esempio record di invocazione
{ "version": "1.0", "timestamp": "2019-11-14T18:16:05.568Z", "requestContext": { "requestId": "e4b46cbf-b738-xmpl-8880-a18cdf61200e", "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function:$LATEST", "condition": "RetriesExhausted", "approximateInvokeCount": 3 }, "requestPayload": { "ORDER_IDS": [ "9e07af03-ce31-4ff3-xmpl-36dce652cb4f", "637de236-e7b2-464e-xmpl-baf57f86bb53", "a81ddca6-2c35-45c7-xmpl-c3a03a31ed15" ] }, "responseContext": { "statusCode": 200, "executedVersion": "$LATEST", "functionError": "Unhandled" }, "responsePayload": { "errorMessage": "RequestId: e4b46cbf-b738-xmpl-8880-a18cdf61200e Process exited before completing request" } }

Il record di invocazione contiene dettagli sull'evento, la risposta e il motivo per cui il record è stato inviato.

Tracciamento delle richieste verso le destinazioni

È possibile utilizzare AWS X-Ray per visualizzare una vista connessa di ogni richiesta mentre viene messa in coda, elaborata da una funzione Lambda e inviata al servizio di destinazione. Quando si attiva il tracciamento X-Ray per una funzione o un servizio che richiama una funzione, Lambda aggiunge un'intestazione X-Ray alla richiesta e passa l'intestazione al servizio di destinazione. Le tracce dei servizi upstream vengono collegate automaticamente alle tracce delle funzioni Lambda a valle e dei servizi di destinazione, creando una end-to-end visualizzazione dell'intera applicazione. Per ulteriori informazioni sul tracciamento, consulta Visualizza le chiamate alla funzione Lambda utilizzando AWS X-Ray.

API di configurazione delle chiamate asincrone

Per gestire le impostazioni di chiamata asincrona con AWS CLI o AWS SDK, utilizza le seguenti operazioni API.

Per configurare l'invocazione asincrona con, usa il comando. AWS CLIput-function-event-invoke-config Nell'esempio seguente viene configurata una funzione con una durata massima dell'evento di 1 ora e senza ulteriori tentativi.

aws lambda put-function-event-invoke-config --function-name error \ --maximum-event-age-in-seconds 3600 --maximum-retry-attempts 0

Verrà visualizzato l'output seguente:

{ "LastModified": 1573686021.479, "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:error:$LATEST", "MaximumRetryAttempts": 0, "MaximumEventAgeInSeconds": 3600, "DestinationConfig": { "OnSuccess": {}, "OnFailure": {} } }

Il comando put-function-event-invoke-config sovrascrive qualsiasi configurazione esistente sulla funzione, versione o alias. Per configurare un'opzione senza reimpostarne altre, utilizzare update-function-event-invoke-config. Nell'esempio seguente Lambda viene configurato per inviare un record a una coda SQS standard denominata destination quando non è possibile elaborare un evento.

aws lambda update-function-event-invoke-config --function-name error \ --destination-config '{"OnFailure":{"Destination": "arn:aws:sqs:us-east-2:123456789012:destination"}}'

Verrà visualizzato l'output seguente:

{ "LastModified": 1573687896.493, "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:error:$LATEST", "MaximumRetryAttempts": 0, "MaximumEventAgeInSeconds": 3600, "DestinationConfig": { "OnSuccess": {}, "OnFailure": { "Destination": "arn:aws:sqs:us-east-2:123456789012:destination" } } }

Code DLQ

In alternativa a una destinazione in caso di errore, è possibile configurare la funzione con una coda DLQ per salvare gli eventi eliminati per ulteriori elaborazioni. Una coda DLQ agisce allo stesso modo di una destinazione in caso di errore in quanto viene utilizzata quando un evento non riesce a tutti i tentativi di elaborazione o scade senza essere elaborato. Tuttavia, una coda DLQ fa parte della configurazione specifica della versione di una funzione, quindi viene bloccata quando si pubblica una versione. Le destinazioni in caso di errore supportano anche destinazioni aggiuntive e includono dettagli sulla risposta della funzione nel record di invocazione.

Per rielaborare gli eventi in una coda DLQ, è possibile impostarla come fonte degli eventi per la funzione Lambda. In alternativa, è possibile recuperare gli eventi manualmente.

È possibile scegliere una coda standard di Amazon SQS o un argomento standard di Amazon SNS per la coda DLQ. Le code FIFO e gli argomenti FIFO di Amazon SNS non sono supportati. Se non si dispone di una coda o un argomento, crearne uno. Scegliere il tipo di destinazione che corrisponde al caso d'uso specifico.

  • Coda Amazon SQS: una coda conserva gli eventi non riusciti finché non vengono richiamati. Scegli una coda standard Amazon SQS se prevedi che una singola entità, come una funzione Lambda o un CloudWatch allarme, elabori l'evento non riuscito. Per ulteriori informazioni, consulta Utilizzo di Lambda con Amazon SQS.

    Creare una coda nella console di Amazon SQS.

  • Argomento Amazon SNS – Un argomento invia gli eventi non riusciti a una o più destinazioni. Scegli un argomento standard di Amazon SNS se ti aspetti che più entità agiscano su un evento non riuscito. Per esempio, è possibile configurare un argomento in modo tale che invii gli eventi a un indirizzo e-mail, a una funzione Lambda e/o a un endpoint HTTP. Per ulteriori informazioni, consulta Richiamo di funzioni Lambda con le notifiche di Amazon SNS.

    Creare un argomento nella console di Amazon SNS.

Per inviare gli eventi a una coda o argomento, la funzione necessita di autorizzazioni aggiuntive. Aggiungere una policy con le autorizzazioni necessarie per il ruolo di esecuzione di una funzione.

Se la coda o l'argomento di destinazione sono crittografati con una chiave gestita dal cliente, il ruolo di esecuzione deve essere anche un utente nella policy basata sulle risorse della chiave.

Dopo aver creato il target e l'aggiornamento del ruolo di esecuzione della funzione, aggiungere la coda DLQ alla funzione. È possibile configurare più funzioni per l'invio di eventi allo stesso oggetto.

Per configurare una coda dead-letter
  1. Aprire la pagina Funzioni della console Lambda.

  2. Scegliere una funzione.

  3. Scegliere Configuration (Configurazione), quindi scegli Asynchronous invocation (Chiamata asincrona).

  4. In Asynchronous invocation (Chiamata asincrona), scegliere Edit (Modifica).

  5. Impostare la risorsa DLQ su Amazon SQS o Amazon SNS.

  6. Scegliere l'argomento o la coda target.

  7. Scegliere Save (Salva).

Per configurare una coda di lettere non scritte con, usa il AWS CLI comando. update-function-configuration

aws lambda update-function-configuration --function-name my-function \ --dead-letter-config TargetArn=arn:aws:sns:us-east-2:123456789012:my-topic

Lambda invia l'evento alla coda DLQ così com'è, con ulteriori informazioni negli attributi. Queste informazioni possono essere utilizzate per identificare l'errore restituito dalla funzione o correlare l'evento ai log o a una traccia AWS X-Ray .

Attributi dei messaggi della coda DLQ
  • RequestID (String) – L'ID della richiesta di invocazione. Gli ID della richiesta appaiono nei log della funzione. È inoltre possibile utilizzare l'SDK X-Ray per registrare l'ID di richiesta su un attributo nella traccia. Si possono quindi cercare le tracce in base all'ID richiesta nella console X-Ray.

  • ErrorCode(Numero) — Il codice di stato HTTP.

  • ErrorMessage(String) — Il primo 1 KB del messaggio di errore.

Attributi degli eventi della coda DLQ nella console Amazon SQS.

Se Lambda non riesce a inviare un messaggio alla coda delle lettere non scritte, elimina l'evento ed emette la metrica Errors. DeadLetter Questo può accadere a causa di mancanza di autorizzazioni oppure se le dimensioni totali del messaggio superano il limite per la coda o l'argomento target. Ad esempio, supponiamo che una notifica Amazon SNS con un corpo di dimensioni prossime a 256 KB attivi una funzione che genera un errore. In tal caso, i dati relativi a eventi aggiunti da Amazon SNS, combinati con gli attributi aggiunti da Lambda, possono far sì che il messaggio superi le dimensioni massime consentite nella coda DLQ.

Se si utilizza Amazon SQS come origine eventi, configurare una coda DLQ sulla coda Amazon SQS stessa e non sulla funzione Lambda. Per ulteriori informazioni, consultare Utilizzo di Lambda con Amazon SQS.