Usa il rilevamento ricorsivo del loop Lambda per prevenire loop infiniti - 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à.

Usa il rilevamento ricorsivo del loop Lambda per prevenire loop infiniti

Quando configuri una funzione Lambda di modo che invii l'output sullo stesso servizio o risorsa che richiama la funzione, è possibile che venga creato un ciclo ricorsivo infinito. Ad esempio, una funzione Lambda potrebbe scrivere un messaggio in una coda Amazon Simple Queue Service (AmazonSQS), che a sua volta richiama la stessa funzione. Questa invocazione fa sì che la funzione scriva un altro messaggio nella coda, che a sua volta richiama nuovamente la funzione.

I loop ricorsivi involontari possono comportare la fatturazione di addebiti imprevisti a tuo favore. Account AWS I cicli ricorsivi possono anche far sì che Lambda si dimensioni e utilizzi tutta la simultaneità disponibile del tuo account. Per contribuire a ridurre l'impatto dei loop involontari, Lambda rileva alcuni tipi di loop ricorsivi poco dopo che si sono verificati. Per impostazione predefinita, quando Lambda rileva un ciclo ricorsivo, interrompe la chiamata della funzione e ti avvisa. Se il tuo progetto utilizza intenzionalmente schemi ricorsivi, puoi modificare la configurazione predefinita di una funzione per consentirne l'invocazione ricorsiva. Per ulteriori informazioni, consulta Consentire l'esecuzione di una funzione Lambda in un ciclo ricorsivo.

Comprendere il rilevamento dei cicli ricorsivi

Il rilevamento dei cicli ricorsivi in Lambda si basa sul tracciamento gli eventi. Lambda è un servizio di elaborazione basato su eventi che esegue il codice della funzione quando si verificano determinati eventi. Ad esempio, quando un articolo viene aggiunto a una SQS coda Amazon o a un argomento di Amazon Simple Notification Service (AmazonSNS). Lambda passa gli eventi alla funzione come JSON oggetti, che contengono informazioni sulla modifica dello stato del sistema. Quando un evento causa l'esecuzione di una funzione, si parla di invocazione.

Per rilevare i cicli ricorsivi, Lambda utilizza le intestazioni di tracciamento AWS X-Ray. Quando dei Servizi AWS che supportano il rilevamento dei cicli ricorsivi inviano eventi a Lambda, tali eventi vengono automaticamente annotati con metadati. Quando la funzione Lambda scrive uno di questi eventi su un altro supportato Servizio AWS utilizzando una versione supportata di an AWS SDK, aggiorna questi metadati. I metadati aggiornati includono il numero di volte in cui l'evento ha richiamato la funzione.

Nota

Non è necessario abilitare il tracciamento attivo X-Ray per far funzionare questa funzionalità. Il rilevamento dei cicli ricorsivi è attivato per impostazione predefinita per tutti i clienti AWS . L'utilizzo della funzionalità è gratuito.

Una catena di richieste è una sequenza di invocazioni Lambda causate dallo stesso evento di attivazione. Ad esempio, immagina che una SQS coda Amazon richiami la tua funzione Lambda. La tua funzione Lambda invia quindi l'evento elaborato alla stessa SQS coda Amazon, che richiama nuovamente la tua funzione. In questo esempio, ogni invocazione della funzione rientra nella stessa catena di richieste.

Se la tua funzione viene richiamata circa 16 volte nella stessa catena di richieste, Lambda interrompe automaticamente la successiva chiamata di funzione in quella catena di richieste e ti avvisa. Ad esempio, se la funzione è configurata con più trigger, le invocazioni da altri trigger non sono interessate.

Nota

Anche quando l'maxReceiveCountimpostazione della politica di redrive della coda di origine è superiore a 16, la protezione da ricorsione Lambda non impedisce ad Amazon SQS di ritentare il messaggio dopo che un ciclo ricorsivo è stato rilevato e terminato. Quando Lambda rileva un ciclo ricorsivo e annulla le chiamate successive, restituisce RecursiveInvocationException allo strumento di mappatura dell'origine degli eventi. Questo incrementa il valore del messaggio. receiveCount Lambda continua a riprovare il messaggio e continua a bloccare le chiamate di funzione, finché SQS Amazon non determina che maxReceiveCount il limite è stato superato e invia il messaggio alla coda di lettere morte configurata.

Se hai configurato una destinazione in caso di errore o una coda DLQ per la funzione, Lambda invia anche l'evento dall'invocazione interrotta alla destinazione o alla coda DLQ. Quando configuri una coda di destinazione o di lettere morte per la tua funzione, assicurati di non utilizzare un argomento Amazon SNS o una SQS coda Amazon che la tua funzione utilizza anche come trigger di eventi o mappatura dell'origine degli eventi. Se invii eventi alla stessa risorsa che richiama la tua funzione, puoi creare un altro ciclo ricorsivo.

Supportato e Servizi AWS SDKs

Lambda è in grado di rilevare solo i loop ricorsivi che includono determinati loop supportati. Servizi AWS Affinché i loop ricorsivi vengano rilevati, la funzione deve utilizzare anche uno dei circuiti supportati. AWS SDKs

Supportato Servizi AWS

Lambda attualmente rileva loop ricorsivi tra le tue funzioni, Amazon, Amazon SQS S3 e Amazon. SNS Lambda rileva anche i cicli ricorsivi composti solo da funzioni Lambda, che possono richiamarsi reciprocamente in modo sincrono o asincrono. I diagrammi seguenti mostrano alcuni esempi di ciclo ricorsivo che Lambda è in grado di rilevare:

Diagrammi di loop ricorsivi tra una funzione Lambda, AmazonSNS, Amazon S3 e una coda Amazon. SQS

Quando un altro Servizio AWS tipo Amazon DynamoDB fa parte del ciclo, Lambda al momento non è in grado di rilevarlo e fermarlo.

Poiché attualmente Lambda rileva solo loop ricorsivi che coinvolgono Amazon, Amazon S3 e SQS SNS Amazon, è comunque possibile che i loop che Servizi AWS coinvolgono altri possano comportare un utilizzo involontario delle funzioni Lambda.

Per evitare che ti vengano addebitati addebiti imprevisti Account AWS, ti consigliamo di configurare gli CloudWatchallarmi Amazon per avvisarti di modelli di utilizzo insoliti. Ad esempio, puoi CloudWatch configurare la notifica dei picchi nella concorrenza o nelle chiamate della funzione Lambda. Puoi anche configurare un avviso di fatturazione che ti segnali quando la spesa nel tuo account supera una soglia da te specificata. In alternativa, puoi utilizzare AWS Cost Anomaly Detection per ricevere avvisi in merito a schemi di fatturazione insoliti.

Supportato AWS SDKs

Affinché Lambda rilevi i loop ricorsivi, la funzione deve utilizzare una delle seguenti versioni o successive: SDK

Runtime Versione minima richiesta AWS SDK

Node.js

2.1147.0 (versione 2) SDK

3.105.0 (versione 3) SDK

Python

1.24.46 (boto3)

1.27.46 (botocore)

Java 8 e Java 11

2.17.135

Java 17

2,20,81

Java 21

2,21,24

.NET

3,7,293,0

Ruby

3,134,0

PHP

3,232,0

Go

SDKV2 (usa la versione più recente)

Alcuni runtime Lambda come Python e Node.js includono una versione di. AWS SDK Se la SDK versione inclusa nel runtime della funzione è inferiore a quella minima richiesta, puoi aggiungere una versione supportata di SDK al pacchetto di distribuzione della funzione. Puoi anche aggiungere una SDK versione supportata alla tua funzione utilizzando un livello Lambda. Per un elenco dei componenti SDKs inclusi in ogni runtime Lambda, consulta. Runtime Lambda

Notifiche dei cicli ricorsivi

Quando Lambda interrompe un ciclo ricorsivo, ricevi notifiche tramite AWS Health Dashboard e tramite e-mail. Puoi anche utilizzare le CloudWatch metriche per monitorare il numero di chiamate ricorsive interrotte da Lambda.

AWS Health Dashboard notifiche

Quando Lambda interrompe una chiamata ricorsiva, AWS Health Dashboard visualizza una notifica nella pagina Lo stato del tuo account, in Problemi aperti e recenti. Tieni presente che possono essere necessarie fino a tre ore dopo che Lambda interrompe un'invocazione ricorsiva prima che venga visualizzata questa notifica. Per ulteriori informazioni sulla visualizzazione degli eventi dell'account in AWS Health Dashboard, consulta Getting started with your AWS Health Dashboard — Lo stato del tuo account nella AWS Health User Guide.

Avvisi via e-mail

Quando Lambda interrompe per la prima volta un'invocazione ricorsiva della funzione, ti invia un avviso e-mail. Lambda invia un massimo di un'e-mail ogni 24 ore per ogni funzione del tuo Account AWS. Dopo l'invio di una notifica e-mail da parte di Lambda, non riceverai altre e-mail per la stessa funzione per altre 24 ore, anche se Lambda interrompe ulteriori invocazioni ricorsive della funzione. Tieni presente che possono essere necessarie fino a tre ore dopo che Lambda interrompe un'invocazione ricorsiva prima che tu riceva questo avviso via e-mail.

Lambda invia avvisi e-mail a ciclo ricorsivo al contatto principale Account AWS dell'account e al contatto operativo alternativo del tuo account. Per informazioni sulla visualizzazione o l'aggiornamento degli indirizzi e-mail nel tuo account, consulta la pagina Aggiornamento delle informazioni di contatto della Guida generale di AWS .

CloudWatch Metriche Amazon

La CloudWatch metrica RecursiveInvocationsDropped registra il numero di chiamate di funzioni che Lambda ha interrotto perché la funzione è stata richiamata più di circa 16 volte in una singola catena di richieste. Lambda emette questo parametro non appena interrompe un'invocazione ricorsiva. Per visualizzare questa metrica, segui le istruzioni relative alla visualizzazione delle metriche sulla console e scegli la metrica. CloudWatch RecursiveInvocationsDropped

Risposta alle notifiche di rilevamento dei cicli ricorsivi

Quando la funzione viene richiamata più di circa 16 volte dallo stesso evento di attivazione, Lambda interrompe la successiva chiamata di funzione per quell'evento per interrompere il ciclo ricorsivo. Per evitare il ripetersi di un ciclo ricorsivo interrotto da Lambda, procedi come segue:

  • Riduci la simultaneità disponibile della funzione a zero, il che limita tutte le invocazioni future.

  • Rimuovi o disabilita il trigger o la mappatura dell'origine degli eventi che richiama la tua funzione.

  • Identifica e correggi i difetti del codice che riscrivono gli eventi nella risorsa che richiama la tua funzione AWS . Una fonte comune di difetti è l'utilizzo di variabili per definire l'origine e la destinazione degli eventi di una funzione. Verifica di non utilizzare lo stesso valore per entrambe le variabili.

Inoltre, se l'origine degli eventi per la tua funzione Lambda è una SQS coda Amazon, prendi in considerazione la possibilità di configurare una coda di lettere non scritte nella coda di origine.

Nota

Assicurati di configurare la coda DLQ sulla coda di origine, non sulla funzione Lambda. La coda DLQ che si configura su una funzione viene utilizzata per la coda di invocazione asincrona della funzione, non per le code di origine eventi.

Se l'origine dell'evento è un SNS argomento di Amazon, prendi in considerazione l'aggiunta di una destinazione in caso di errore per la tua funzione.

Azzeramento della simultaneità disponibile per la funzione (console)
  1. Aprire la pagina Funzioni della console Lambda.

  2. Scegli il nome della funzione .

  3. Scegli Limitatore.

  4. Nella finestra di dialogo Limita la tua funzione, scegli Conferma.

Rimozione di un trigger o di una mappatura dell'origine degli eventi per la funzione (console)
  1. Aprire la pagina Funzioni della console Lambda.

  2. Scegli il nome della funzione .

  3. Scegli la scheda Configurazione, quindi scegli Trigger.

  4. In Trigger, seleziona il trigger o la mappatura dell'origine degli eventi che desideri eliminare, quindi scegli Elimina.

  5. Nella finestra di dialogo Elimina trigger, scegli Elimina.

Disabilitazione di una mappatura dell'origine degli eventi per la funzione (AWS CLI)
  1. Per trovare la UUID mappatura della fonte dell'evento che desideri disabilitare, esegui il comando AWS Command Line Interface (AWS CLI) list-event-source-mappings.

    aws lambda list-event-source-mappings
  2. Per disabilitare la mappatura delle sorgenti degli eventi, esegui il comando seguente AWS CLI update-event-source-mapping.

    aws lambda update-event-source-mapping --function-name MyFunction \ --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 --no-enabled

Consentire l'esecuzione di una funzione Lambda in un ciclo ricorsivo

Se il tuo progetto utilizza intenzionalmente un ciclo ricorsivo, puoi configurare una funzione Lambda per consentirne l'invocazione ricorsiva. Ti consigliamo di evitare l'uso di loop ricorsivi nel tuo progetto. Gli errori di implementazione possono portare a invocazioni ricorsive che utilizzano tutta la concorrenza disponibile e alla fatturazione di Account AWS addebiti imprevisti sul tuo account.

Importante

Se utilizzi loop ricorsivi, trattali con cautela. Implementa i guard rail basati sulle migliori pratiche per ridurre al minimo i rischi di errori di implementazione. Per ulteriori informazioni sulle migliori pratiche per l'utilizzo di modelli ricorsivi, consulta Modelli ricorsivi che causano funzioni Lambda di esecuzione in Serverless Land.

È possibile configurare funzioni per consentire loop ricorsivi utilizzando la console Lambda, il AWS Command Line Interface ()AWS CLI e il. PutFunctionRecursionConfigAPI Puoi anche configurare l'impostazione di rilevamento ricorsivo del loop di una funzione in and. AWS SAM AWS CloudFormation

Per impostazione predefinita, Lambda rileva e termina i loop ricorsivi. A meno che il progetto non utilizzi intenzionalmente un loop ricorsivo, ti consigliamo di non modificare la configurazione predefinita delle funzioni.

Nota che quando configuri una funzione per consentire i loop ricorsivi, la metrica non viene emessa. CloudWatch RecursiveInvocationsDropped

Console
Per consentire l'esecuzione di una funzione in un ciclo ricorsivo (console)
  1. Aprire la pagina Funzioni della console Lambda.

  2. Scegliete il nome della funzione per aprire la pagina dei dettagli della funzione.

  3. Scegli la scheda Configurazione, quindi scegli Rilevamento di concorrenza e ricorsione.

  4. Oltre al rilevamento ricorsivo del loop, scegli Modifica.

  5. Seleziona Consenti loop ricorsivi.

  6. Seleziona Salva.

AWS CLI

È possibile utilizzare il PutFunctionRecursionConfigAPIper consentire alla funzione di essere richiamata in un ciclo ricorsivo. Specificare Allow il parametro del ciclo ricorsivo. Ad esempio, puoi chiamarlo API con il put-function-recursion-config AWS CLI comando:

aws lambda put-function-recursion-config --function-name yourFunctionName --recursive-loop Allow

Puoi riportare la configurazione della funzione all'impostazione predefinita in modo che Lambda termini i loop ricorsivi quando li rileva. Modifica la configurazione della tua funzione utilizzando la console Lambda o il. AWS CLI

Console
Per configurare una funzione in modo che i loop ricorsivi vengano terminati (console)
  1. Aprire la pagina Funzioni della console Lambda.

  2. Scegliete il nome della funzione per aprire la pagina dei dettagli della funzione.

  3. Scegli la scheda Configurazione, quindi scegli Rilevamento di concorrenza e ricorsione.

  4. Oltre al rilevamento ricorsivo del loop, scegli Modifica.

  5. Seleziona Termina i loop ricorsivi.

  6. Seleziona Salva.

AWS CLI

Puoi usare il PutFunctionRecursionConfigAPIper configurare la tua funzione in modo che Lambda termini i loop ricorsivi quando li rileva. Specificare il parametro Terminate del ciclo ricorsivo. Ad esempio, puoi chiamarlo API con il put-function-recursion-config AWS CLI comando:

aws lambda put-function-recursion-config --function-name yourFunctionName --recursive-loop Terminate

Regioni supportate per il rilevamento ricorsivo del loop Lambda

Il rilevamento ricorsivo del loop Lambda è supportato nei seguenti casi. Regioni AWS

  • Stati Uniti orientali (Virginia settentrionale)

  • Stati Uniti orientali (Ohio)

  • Stati Uniti occidentali (California settentrionale)

  • Stati Uniti occidentali (Oregon)

  • Africa (Città del Capo)

  • Asia Pacific (Hong Kong)

  • Asia Pacific (Mumbai)

  • Asia Pacific (Osaka)

  • Asia Pacific (Seul)

  • Asia Pacifico (Singapore)

  • Asia Pacifico (Sydney)

  • Asia Pacifico (Tokyo)

  • Canada (Centrale)

  • Europa (Francoforte)

  • Europa (Irlanda)

  • Europa (Londra)

  • Europa (Milano)

  • Europa (Parigi)

  • Europa (Stoccolma)

  • Medio Oriente (Bahrein)

  • Sud America (San Paolo)