Best practices for working with AWS Lambda functions
Di seguito sono indicate le best practice per l'utilizzo di . AWS Lambda:
Argomenti
Codice della funzione
Sfruttare il riutilizzo del contesto di esecuzione per migliorare le prestazioni della funzione. Inizializzare i client SDK e le connessioni al database all'esterno del gestore di funzioni e memorizzare localmente nella cache gli asset statici nella directory /tmp. Le chiamate successive elaborate dalla stessa istanza della funzione possono riutilizzare queste risorse. Ciò consente di risparmiare sui costi riducendo i tempi di esecuzione delle funzioni.
Per evitare potenziali perdite di dati tra le chiamate, non utilizzare il contesto di esecuzione per archiviare dati utente, eventi o altre informazioni con implicazioni di sicurezza. Se la funzione si basa su uno stato mutabile che non può essere archiviato in memoria all'interno del gestore, considerare la possibilità di creare una funzione separata o versioni separate di una funzione per ogni utente.
Utilizzare una direttiva keep-alive per mantenere le connessioni persistenti. Lambda elimina le connessioni inattive nel tempo. Se si tenta di riutilizzare una connessione inattiva quando si richiama una funzione, si verificherà un errore di connessione. Per mantenere la connessione persistente, utilizzare la direttiva keep-alive associata al runtime. Per un esempio, vedere Riutilizzo delle connessioni con Keep-Alive in Node.js.
Utilizzare le variabili di ambiente per passare i parametri operativi alla funzione. Se ad esempio si scrive in un bucket Amazon S3 anziché impostare come hard-coded il nome del bucket in cui si esegue la scrittura, configurare tale nome come una variabile di ambiente.
Evita di usare invocazioni ricorsive nella tua funzione Lambda, in cui la funzione si richiama da sola o avvia un processo che potrebbe richiamare nuovamente la funzione. Ciò potrebbe provocare un volume non desiderato di invocazioni della funzione e un aumento dei costi. Se noti un volume indesiderato di invocazioni, imposta immediatamente la simultaneità riservata della funzione su 0 per interrompere tutte le invocazioni della funzione mentre si aggiorna il codice.
Non utilizzare API non documentate e non pubbliche nel codice della funzione Lambda. Per i tempi di esecuzione gestiti AWS Lambda, Lambda applica periodicamente aggiornamenti di sicurezza e funzionalità alle API interne di Lambda. Questi aggiornamenti API interni potrebbero essere incompatibili con le versioni precedenti, causando conseguenze indesiderate come errori di chiamata se la funzione ha una dipendenza su queste API non pubbliche. Consulta il riferimento all'API per un elenco di API disponibili pubblicamente.
Scrivi un codice idempotente. La scrittura di un codice idempotente per le tue funzioni garantisce che gli eventi duplicati vengano gestiti allo stesso modo. Il tuo codice dovrebbe convalidare correttamente gli eventi e gestire con garbo gli eventi duplicati. Per ulteriori informazioni, consulta Come posso rendere idempotente la mia funzione Lambda?
Nota
È possibile utilizzare Powertools for AWS Lambda per rendere le funzioni idempotenti. Per ulteriori informazioni, consultare:
Per le best practice relative al codice specifico di un linguaggio, consulta le seguenti sezioni:
Configurazione della funzione
La verifica delle prestazione della funzione Lambda è una fase fondamentale per garantire la scelta della configurazione delle dimensioni di memoria ottimali. Ogni aumento delle dimensioni di memoria determina un aumento equivalente della CPU disponibile per la funzione. L'utilizzo della memoria per la funzione è determinato sulla base di una singola invocazione e può essere visualizzato in Amazon CloudWatch. A ogni invocazione, verrà creata una voce REPORT:, come illustrato di seguito:
REPORT RequestId: 3604209a-e9a3-11e6-939a-754dd98c7be3 Duration: 12.34 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 18 MB
Se si analizza il campo Max Memory Used:, è possibile determinare se per la funzione è necessaria una maggiore quantità di memoria o se ne è stata riservata una quantità eccessiva.
Per trovare la giusta configurazione della memoria per le funzioni, è consigliabile usare il progetto open source AWS Lambda Power Tuning. Per ulteriori informazioni, vedere Power TuningAWS Lambda
Per ottimizzare le prestazioni della funzione, è inoltre consigliabile distribuire librerie in grado di sfruttare Advanced Vector Extensions 2 (AVX2). Ciò consente di elaborare carichi di lavoro complessi, tra cui l'inferenza di machine learning, l'elaborazione di elementi multimediali, l'elaborazione HPC (High Performance Computing), le simulazioni scientifiche e la modellazione finanziaria. Per ulteriori informazioni, consulta Creazione di funzioni AWS Lambda più veloci con AVX2
Eseguire il test della funzione Lambda per determinare un valore di timeout ottimale. È importante analizzare il runtime della funzione in modo da individuare meglio gli eventuali problemi con un servizio di dipendenza che possa aumentare la simultaneità della funzione oltre le previsioni. Ciò risulta particolarmente utile quando la funzione effettua chiamate di rete a risorse che non sono in grado di gestire il dimensionamento di Lambda. Per ulteriori informazioni sul test di carico dell'applicazione, consulta Test del carico distribuito su AWS
Utilizzare le autorizzazioni più restrittive per le impostazioni delle policy IAM. È importante comprendere le risorse e le operazioni necessarie alla funzione Lambda e limitare il ruolo di esecuzione in base a tali autorizzazioni. Per ulteriori informazioni, consulta Gestione delle autorizzazioni in AWS Lambda.
Acquisire familiarità con Quote di Lambda. Le dimensioni del payload, i descrittori di file e lo spazio /tmp sono aspetti spesso sottovalutati quando si determinano i limiti delle risorse del runtime.
Eliminare le funzioni Lambda non più utilizzate. In questo modo le funzioni non utilizzate non vengono conteggiate inutilmente ai fini del calcolo del limite delle dimensioni del pacchetto di distribuzione.
Se si sta usando Amazon Simple Queue Service come origine eventi, verificare che il valore del tempo di invocazione stimato della funzione non superi il valore Visibility Timeout (Timeout visibilità) della coda. Ciò è valido per CreateFunction e per UpdateFunctionConfiguration.
-
Nel caso di CreateFunction, AWS Lambda restituisce l'esito negativo per il processo di creazione della funzione.
-
Nel caso di UpdateFunctionConfiguration, potrebbe causare la duplicazione dei richiami della funzione.
Scalabilità delle funzioni
Informati sui vincoli di throughput a monte e a valle. Sebbene le funzioni Lambda si dimensioni perfettamente in base al carico, le dipendenze a monte e a valle potrebbero non avere le stesse capacità di throughput. Se devi limitare il valore massimo di scalabilità della tua funzione, puoi configurare la simultaneità riservata sulla funzione.
Limitazione all'acceleratore incorporata. Se la tua funzione sincrona subisce una limitazione a causa del traffico che supera la velocità di scalabilità di Lambda, puoi utilizzare le seguenti strategie per migliorare la tolleranza alla limitazione:
-
Utilizza timeout, nuovi tentativi e backoff con jitter
. L'implementazione di queste strategie semplifica le chiamate ripetute e aiuta a garantire che Lambda possa scalare in pochi secondi per ridurre al minimo le limitazioni da parte dell'utente finale. -
Utilizza la simultaneità fornita. La simultaneità fornita è il numero di ambienti di esecuzione pre-inizializzati che Lambda assegna alla tua funzione. Lambda gestisce le richieste in arrivo utilizzando la simultaneità fornita, se disponibile. Lambda può anche scalare la funzione oltre l'impostazione di simultaneità fornita, se necessario. La configurazione della simultaneità fornita comporta ulteriori addebiti sull'AWS.
Parametri e allarmi
Utilizza Utilizzo dei parametri di CloudWatch Logs con Lambda e Allarmi CloudWatch anziché creare o aggiornare un parametro dall'interno del codice della funzione Lambda. In questo modo è molto più efficiente eseguire il controllo dello stato delle funzioni Lambda, perché è possibile rilevare tempestivamente i problemi nel processo di sviluppo. È possibile ad esempio configurare un allarme in base alla durata prevista dell'esecuzione della funzione Lambda per individuare colli di bottiglia o latenze attribuibili al codice della funzione.
Emetti metriche personalizzate in modo asincrono utilizzando Embedded Metric Format (EMF). Invece di effettuare chiamate API sincrone a CloudWatch, utilizza EMF per emettere metriche attraverso i log della funzione. Questo approccio riduce la latenza e migliora le prestazioni. L'utilità Metrics in Powertools for AWS Lambda gestisce automaticamente la formattazione EMF. Per ulteriori informazioni, consulta le utilità Metriche Python, TypeScript, Java o .NET nella documentazione Powertools for AWS Lambda. Per informazioni sull'utilizzo di EMF per generare log nel formato dei parametri, consulta Pubblicazione di log con formato dei parametri incorporati nella Guida per l'utente di Amazon CloudWatch.
Usa la registrazione JSON strutturata per una migliore osservabilità. La registrazione strutturata semplifica la ricerca, il filtraggio e l'analisi dei log delle funzioni. Prendi in considerazione l'utilizzo dell'utilità Logger di Powertools for AWS Lambda per formattare automaticamente i log in JSON. Per ulteriori informazioni, consulta le utilità Logger Python, TypeScript, Java o .NET nella documentazione Powertools for AWS Lambda.
Utilizzare la libreria di registrazione e parametri e dimensioni AWS Lambda per rilevare errori di applicazione (ad esempio, ERR, ERROR, WARNING e così via)
Utilizza AWSCost Anomaly Detection per rilevare attività insolite sul tuo account. Cost Anomaly Detection utilizza il machine learning per monitorare continuamente i costi e l'utilizzo riducendo al minimo i falsi positivi. Cost Anomaly Detection utilizza dati da AWS Cost Explorer, che ha un ritardo fino a 24 ore. Di conseguenza, possono essere necessarie fino a 24 ore per rilevare un'anomalia dopo l'utilizzo. Per iniziare a utilizzare Cost Anomaly Detection, è necessario registrarsi per Cost Explorer. Quindi, accedi a Cost Anomaly Detection.
Uso di flussi
Eseguire il test con dimensioni di batch e record diverse in modo che la frequenza di polling di ogni origine eventi sia regolata in base alla velocità con cui la funzione è in grado di completare l'attività. Il parametro BatchSize CreateEventSourceMapping controlla il numero massimo di record che può essere inviato alla funzione a ogni invocazione. Una dimensione di batch maggiore può spesso assorbire in modo più efficiente il costo associato all'invocazione in un set di record più grande, aumentando in tal modo il throughput.
Per impostazione predefinita, Lambda richiama la funzione non appena i record sono disponibili. Se il batch che Lambda legge dall'origine eventi contiene un solo record, Lambda invia solo un record alla funzione. Per evitare di richiamare la funzione con pochi record è possibile, configurando un periodo di batch, chiedere all'origine eventi di memorizzare nel buffer i registri per un massimo di 5 minuti. Prima di richiamare la funzione, Lambda continua a leggere i registri dall'origine eventi fino a quando non ha raccolto un batch completo, fino alla scadenza del periodo di batch o fino a quando il batch non ha raggiunto il limite del payload di 6 MB. Per ulteriori informazioni, consulta Comportamento di batching.
avvertimento
Gli strumenti di mappatura dell'origine degli eventi elaborano ogni evento almeno una volta e può verificarsi un'elaborazione duplicata dei record. Per evitare potenziali problemi legati agli eventi duplicati, ti consigliamo vivamente di rendere idempotente il codice della funzione. Per ulteriori informazioni, consulta Come posso rendere idempotente la mia funzione Lambda
Abilita la risposta batch parziale per l'elaborazione dei flussi. Durante l'elaborazione di batch di record da flussi come Kinesis o DynamoDB Streams, abilita la risposta batch parziale per consentire a Lambda di riprovare solo i record non riusciti anziché l'intero batch. Ciò migliora l'efficienza di elaborazione e riduce le rielaborazioni non necessarie. Opzionalmente puoi utilizzare l'utilità Batch di Powertools for AWS Lambda per semplificare i modelli di elaborazione in batch.
Nota
È possibile utilizzare Powertools for AWS Lambda per l'elaborazione in batch. Per ulteriori informazioni, consultare:
Aumentare il throughput di elaborazione del flusso Kinesis tramite l'aggiunta di shard. Un flusso Kinesis è costituito da uno o più shard. La velocità con cui Lambda è in grado di leggere i dati da Kinesis si dimensiona linearmente con il numero di shard. L'aumento del numero di shard determina direttamente l'aumento del numero massimo di invocazioni di funzioni Lambda simultanee e può aumentare il throughput di elaborazione del flusso Kinesis. Per ulteriori informazioni sulle relazioni tra shard e invocazioni di funzioni, consulta Flussi di polling e batching. Se si aumenta il numero di shard in un flusso Kinesis, verificare di avere scelto una chiave di partizione opportuna (consultare l'argomento relativo alle chiavi di partizione) per i dati, in modo che i record correlati appartengano agli stessi shard e che i dati siano distribuiti in modo uniforme.
Utilizza Amazon CloudWatch in IteratorAge per determinare se il flusso Kinesis è in fase di elaborazione. Configurare ad esempio un allarme CloudWatch con un valore massimo pari a 30000 (30 secondi).
Best practice di sicurezza
Monitora l'utilizzo di AWS Lambda riguardo alle best practice di sicurezza utilizzando AWS Security Hub CSPM. Security Hub utilizza controlli di sicurezza per valutare le configurazioni delle risorse e gli standard di sicurezza per aiutarti a rispettare vari framework di conformità. Per ulteriori informazioni sull'utilizzo di Security Hub volto a valutare le risorse Lambda, consulta i controlli di AWS Lambda nella Guida per l'utente di AWS Security Hub CSPM.
Monitora i log delle attività di rete Lambda utilizzando Amazon GuardDuty Lambda Protection. La protezione Lambda per GuardDuty è utile per identificare potenziali minacce alla sicurezza quando le funzioni Lambda vengono richiamante nel tuo Account AWS. Ad esempio, se una delle tue funzioni esegue una query su un indirizzo IP associato a un'attività correlata a una criptovaluta. GuardDuty monitora i log delle attività di rete generati quando viene richiamata una funzione Lambda. Per ulteriori informazioni, consulta Protezione Lambda nella Guida per l'utente di Amazon GuardDuty.