Usa il rilevamento di un ciclo ricorsivo 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 a una coda di Amazon Simple Queue Service (Amazon SQS), che quindi 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 cicli ricorsivi involontari possono comportare addebiti imprevisti sul tuo 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 cicli involontari, Lambda è in grado di rilevare determinati tipi di cicli ricorsivi poco dopo che si sono verificati. Per impostazione predefinita, quando Lambda rileva un ciclo ricorsivo, interrompe l'invocazione della funzione e invia una notifica. Se il tuo progetto utilizza intenzionalmente modelli 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.
Sections
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 elemento viene aggiunto a una coda Amazon SQS o a un argomento di Amazon Simple Notification Service (Amazon SNS). Lambda trasmette gli eventi alla funzione come oggetti JSON, 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 Servizio AWS supportato utilizzando una versione supportata di un SDK AWS, 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 coda Amazon SQS richiami la tua funzione Lambda. La funzione Lambda invia quindi l'evento elaborato alla stessa coda di Amazon SQS, che richiama nuovamente la funzione. In questo esempio, ogni invocazione della funzione rientra nella stessa catena di richieste.
Se la tua funzione viene richiamata più di 16 volte nella stessa catena di richieste, Lambda interrompe automaticamente la successiva invocazione della funzione in quella catena di richieste e invia una notifica all'utente. Ad esempio, se la funzione è configurata con più trigger, le invocazioni da altri trigger non sono interessate.
Nota
Quando l'impostazione di maxReceiveCount
sulla policy di reindirizzamento della coda di origine è superiore a 16, la protezione da ricorsione di Lambda non impedisce ad Amazon SQS di ritentare il messaggio dopo che un loop 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 receiveCount
sul messaggio. Lambda continua a riprovare il messaggio e continua a bloccare le chiamate di funzione, finché Amazon SQS non determina che il limite maxReceiveCount
è stato superato e invia il messaggio alla coda DLQ 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. Se configuri una destinazione o una coda DLQ per la funzione, assicurati di non utilizzare un argomento Amazon SNS o una coda Amazon SQS che la tua funzione utilizza anche come trigger di eventi o strumento di mappatura dell'origine degli eventi. Se invii eventi alla stessa risorsa che richiama la tua funzione, puoi creare un altro ciclo ricorsivo.
SDK e Servizi AWS supportati
Lambda è in grado di rilevare solo i cicli ricorsivi che includono determinati Servizi AWS supportati. Affinché i cicli ricorsivi vengano rilevati, la funzione deve utilizzare anche uno degli SDK AWS supportati.
Servizi AWS supportate
Lambda attualmente rileva i cicli ricorsivi tra le tue funzioni, Amazon SQS, Amazon 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:
Quando a far parte del ciclo è un altro Servizio AWS, come Amazon DynamoDB, Lambda non riesce a rilevarlo e interromperlo.
Poiché Lambda attualmente rileva solo cicli ricorsivi che coinvolgono Amazon SQS, Amazon S3 e Amazon SNS, è comunque possibile che i cicli ricorsivi che coinvolgono altri Servizi AWS possano comportare un utilizzo involontario delle funzioni Lambda.
Per evitare che ti vengano addebitati addebiti imprevisti sul tuo Account AWS, ti consigliamo di configurare gli allarmi Amazon CloudWatch per avvisarti di modelli di utilizzo insoliti. Ad esempio, puoi configurare CloudWatch in modo che ti avvisi dei picchi di simultaneità o invocazioni delle funzioni 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.
SDK AWS supportati
Affinché Lambda possa rilevare i cicli ricorsivi, la funzione deve utilizzare un SDK delle versioni seguenti o successive:
Runtime | Versione dell'SDK AWS minima richiesta |
---|---|
Node.js |
2.1147.0 (SDK versione 2) 3.105.0 (SDK versione 3) |
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 |
SDK V2 (usa la versione più recente) |
Alcuni runtime Lambda come Python e Node.js includono una versione dell'SDK AWS. Se la versione SDK inclusa nel runtime della funzione è inferiore al minimo richiesto, puoi aggiungere una versione supportata dell'SDK al pacchetto di implementazione della funzione. Puoi aggiungere una versione supportata dell'SDK alla funzione anche utilizzando un livello Lambda. Per un elenco degli SDK inclusi in ogni runtime Lambda, consulta la pagina Runtime Lambda.
Notifiche dei cicli ricorsivi
Quando Lambda interrompe un ciclo ricorsivo, ricevi notifiche tramite AWS Health Dashboard
Notifiche AWS Health Dashboard
Quando Lambda interrompe un'invocazione ricorsiva, AWS Health Dashboard visualizza una notifica nella pagina Stato dell'account, in Problemi aperti e recenti
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 sul ciclo ricorsivo al contatto principale dell'Account AWS e al contatto operativo alternativo. 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.
Parametri di Amazon CloudWatch
Il parametro CloudWatch RecursiveInvocationsDropped
registra il numero di invocazioni della funzione che Lambda ha interrotto perché la funzione è stata richiamata più di 16 volte in una singola catena di richieste. Lambda emette questo parametro non appena interrompe un'invocazione ricorsiva. Per visualizzare questo parametro, segui le istruzioni per la Visualizzazione dei parametri nella console CloudWatch e scegli il parametro RecursiveInvocationsDropped
.
Risposta alle notifiche di rilevamento dei cicli ricorsivi
Quando la funzione viene richiamata più di 16 volte dallo stesso evento di attivazione, Lambda interrompe la successiva invocazione della 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 AWS che richiama la tua funzione. 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 della funzione Lambda è una coda Amazon SQS, valuta la possibilità di configurare una coda DLQ 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 degli eventi è un argomento di Amazon SNS, valuta la possibilità di aggiungere una destinazione in caso di errore per la funzione.
Azzeramento della simultaneità disponibile per la funzione (console)
Aprire la pagina Functions (Funzioni)
della console Lambda. -
Scegli il nome della funzione .
-
Scegli Limitatore.
-
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)
Aprire la pagina Functions (Funzioni)
della console Lambda. -
Scegli il nome della funzione .
-
Scegli la scheda Configurazione, quindi scegli Trigger.
-
In Trigger, seleziona il trigger o la mappatura dell'origine degli eventi che desideri eliminare, quindi scegli Elimina.
-
Nella finestra di dialogo Elimina trigger, scegli Elimina.
Disabilitazione di una mappatura dell'origine degli eventi per la funzione (AWS CLI)
-
Per trovare l'UUID per la mappatura dell'origine degli eventi che desideri disabilitare, esegui il comando dell'AWS Command Line Interface (AWS CLI) list-event-source-mappings
. aws lambda list-event-source-mappings
-
Per disabilitare la mappatura dell'origine degli eventi, esegui il comando della AWS CLI update-event-source-mapping
. aws lambda update-event-source-mapping --function-name
MyFunction
\ --uuida1b2c3d4-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 modificare la configurazione predefinita di una funzione Lambda per consentirne l'invocazione ricorsiva. È preferibile evitare l'uso di cicli ricorsivi nel codice. Gli errori di implementazione possono portare a invocazioni ricorsive che utilizzano tutta la simultaneità disponibile del tuo Account AWS e alla fatturazione di addebiti imprevisti.
Importante
Se utilizzi cicli ricorsivi, trattali con attenzione. Implementa i guardrail basati sulle best practice per ridurre al minimo i rischi di errori di implementazione. Per ulteriori informazioni sulle best practice per l'utilizzo di modelli ricorsivi, consulta la pagina Schemi ricorsivi che causano funzioni Lambda indeterminate
Puoi configurare le funzioni per consentire i loop ricorsivi utilizzando la console Lambda, la AWS Command Line Interface (AWS CLI) e l'API PutFunctionRecursionConfig. Puoi configurare l'impostazione di rilevamento dei cicli ricorsivi di una funzione anche in AWS SAM e AWS CloudFormation.
Per impostazione predefinita, Lambda rileva e termina i cicli ricorsivi. A meno che il tuo progetto non utilizzi intenzionalmente un ciclo ricorsivo, ti consigliamo di non modificare la configurazione predefinita delle funzioni.
Tieni presente che quando configuri una funzione per consentire i cicli ricorsivi, il parametro CloudWatch RecursiveInvocationsDropped
non viene emesso.
Puoi riportare la configurazione della funzione all'impostazione predefinita in modo che Lambda termini i cicli ricorsivi quando li rileva. Modifica la configurazione della tua funzione utilizzando la console Lambda o la AWS CLI.
Regioni supportate per il rilevamento dei cicli ricorsivi in Lambda
Il rilevamento dei cicli ricorsivi Lambda è supportato nelle seguenti 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 Pacifico (Hong Kong)
-
Asia Pacifico (Giacarta)
-
Asia Pacifico (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)