Definisci il gestore di funzioni Lambda in Python - 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à.

Definisci il gestore di funzioni Lambda in Python

Il gestore di funzioni Lambda è il metodo nel codice della funzione che elabora gli eventi. Quando viene richiamata la funzione, Lambda esegue il metodo del gestore. La funzione viene eseguita fino a quando il gestore non restituisce una risposta, termina o scade.

È possibile utilizzare la seguente sintassi generale quando si crea un gestore di funzioni in Python:

def handler_name(event, context): ... return some_value

Denominazione

Il nome del gestore di funzioni Lambda specificato al momento della creazione di una funzione Lambda deriva da quanto segue:

  • il nome del file in cui si trova la funzione del gestore Lambda.

  • il nome della funzione del gestore Python.

Un gestore di funzioni può essere qualsiasi nome; tuttavia, il nome predefinito sulla console Lambda è lambda_function.lambda_handler. Questo nome del gestore funzioni riflette il nome della funzione (lambda_handler) e il file in cui è memorizzato il codice del gestore è memorizzato (lambda_function.py).

Se si crea una funzione nella console utilizzando un nome di file o un nome del gestore di funzione diverso, è necessario modificare il nome del gestore predefinito.

Modifica del nome del gestore funzioni (console)
  1. Apri la pagina Funzioni della console Lambda e scegli la tua funzione.

  2. Scegli la scheda Codice.

  3. Scorri verso il basso fino al riquadro Impostazioni di runtime e scegli Modifica.

  4. In Gestore, inserisci il nuovo nome per il tuo gestore di funzioni.

  5. Seleziona Salva.

Come funziona

Quando il gestore di funzioni viene richiamato da Lambda, il Runtime Lambda passa due argomenti al gestore di funzioni:

  • Il primo argomento è l'oggetto evento. Un evento è un documento in JSON formato elettronico che contiene dati da elaborare per una funzione Lambda. Il runtime Lambda converte l'evento in un oggetto e lo passa al codice della funzione. Di solito è del tipo Python dict. Può essere anche di tipo list, str, int, float o NoneType.

    L'oggetto evento contiene informazioni dal servizio di invocazione. Quando si invoca una funzione, si determina la struttura e il contenuto dell'evento. Quando un AWS servizio richiama la funzione, definisce la struttura dell'evento. Per ulteriori informazioni sugli eventi generati dai AWS servizi, vedere. Richiamare Lambda con eventi di altri servizi AWS

  • Il secondo argomento è l'oggetto contesto. Un oggetto contesto viene passato alla funzione da Lambda in runtime. Questo oggetto fornisce i metodi e le proprietà che forniscono le informazioni sulla chiamata, sulla funzione e sull'ambiente di runtime.

Restituzione di un valore

È inoltre possibile che il gestore restituisca un valore. Ciò che accade al valore restituito dipende dal tipo di chiamata e dal servizio che ha invocato la funzione. Per esempio:

  • Se si utilizza il tipo di RequestResponse invocazione, ad esempioRichiama una funzione Lambda in modo sincrono, AWS Lambda restituisce il risultato della chiamata alla funzione Python al client che richiama la funzione Lambda (nella HTTP risposta alla richiesta di chiamata, serializzata in). JSON Ad esempio, la console AWS Lambda utilizza il tipo di invocazione RequestResponse; quindi, quando si invoca la funzione mediante la console, in quest'ultima verrà visualizzato il valore restituito.

  • Se il gestore restituisce degli oggetti che non possono essere serializzati da json.dumps, il runtime restituisce un errore.

  • Se il gestore restituisce None, come fanno implicitamente le funzioni Python senza un'istruzione return, il runtime restituisce null.

  • Se utilizzi il tipo di invocazione Event, ovvero una invocazione asincrona, il valore viene ignorato.

Nota

In Python 3.9 e versioni successive, Lambda include l' requestId invocazione nella risposta all'errore.

Esempi

La sezione seguente mostra esempi di funzioni Python che è possibile utilizzare con Lambda. Se si utilizza la console Lambda per creare la funzione, non è necessario allegare un file di archivio .zip per eseguire le funzioni di questa sezione. Queste funzioni utilizzano le librerie Python standard che sono incluse nel runtime Lambda selezionato. Per ulteriori informazioni, consulta Pacchetto di implementazione.

Restituzione di un messaggio

L'esempio seguente mostra una funzione denominata lambda_handler. La funzione accetta l'input dell'utente di un nome e cognome e restituisce un messaggio contenente i dati dell'evento ricevuto come input.

def lambda_handler(event, context): message = 'Hello {} {}!'.format(event['first_name'], event['last_name']) return { 'message' : message }

È possibile utilizzare i seguenti dati evento per invocare la funzione:

{ "first_name": "John", "last_name": "Smith" }

La risposta mostra i dati dell'evento passati come input:

{ "message": "Hello John Smith!" }

Analisi di una risposta

L'esempio seguente mostra una funzione denominata lambda_handler. La funzione utilizza i dati degli eventi passati da Lambda al runtime. Analizza la variabile di ambiente restituita nella risposta. AWS_REGION JSON

import os import json def lambda_handler(event, context): json_region = os.environ['AWS_REGION'] return { "statusCode": 200, "headers": { "Content-Type": "application/json" }, "body": json.dumps({ "Region ": json_region }) }

È possibile utilizzare qualsiasi dato evento per invocare la funzione:

{ "key1": "value1", "key2": "value2", "key3": "value3" }

I runtime Lambda impostano diverse variabili di ambiente durante l'inizializzazione. Per ulteriori informazioni sulle variabili di ambiente restituite nella risposta al runtime, consulta Usa le variabili di ambiente Lambda per configurare i valori nel codice.

La funzione in questo esempio dipende dall'esito positivo della risposta (in200) di API Invoke. Per ulteriori informazioni sullo API stato Invoke, vedete la sintassi Invoke Response.

Rimozione di un calcolo

L'esempio seguente mostra una funzione denominata lambda_handler. La funzione accetta l'input dell'utente e restituisce un calcolo all'utente. Per ulteriori informazioni su questo esempio, consulta il repository. aws-doc-sdk-examples GitHub

import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): ... result = None action = event.get('action') if action == 'increment': result = event.get('number', 0) + 1 logger.info('Calculated result of %s', result) else: logger.error("%s is not a valid action.", action) response = {'result': result} return response

È possibile utilizzare i seguenti dati evento per invocare la funzione:

{ "action": "increment", "number": 3 }

Procedure consigliate di codice per le funzioni Python Lambda

Segui le linee guida riportate nell'elenco seguente per utilizzare le migliori pratiche di codifica durante la creazione delle funzioni Lambda:

  • Separare il gestore Lambda dalla logica principale. In questo modo è possibile creare una funzione di cui è più semplice eseguire l'unit test. Ad esempio, in Python, potrebbe assomigliare a:

    def lambda_handler(event, context): foo = event['foo'] bar = event['bar'] result = my_lambda_function(foo, bar) def my_lambda_function(foo, bar): // MyLambdaFunction logic here
  • Controllare le dipendenze nel pacchetto di distribuzione della funzione. L'ambiente di AWS Lambda esecuzione contiene una serie di librerie. Per i runtime Node.js e Python, questi includono. AWS SDKs Per abilitare il set di caratteristiche e aggiornamenti della sicurezza più recenti, Lambda aggiorna periodicamente tali librerie. Tali aggiornamenti possono introdurre lievi modifiche al comportamento della funzione Lambda. Per mantenere il controllo completo delle dipendenze utilizzate dalla funzione, inserire tutte le dipendenze nel pacchetto di implementazione.

  • Ridurre la complessità delle dipendenze. Preferire framework più semplici che si caricano velocemente all'avvio del contesto di esecuzione.

  • Ridurre al minimo le dimensioni del pacchetto di implementazione al fine di soddisfare le esigenze di runtime. In questo modo viene ridotta la quantità di tempo necessaria per il download del pacchetto e per la relativa decompressione prima dell'invocazione.

  • Sfruttare il riutilizzo del contesto di esecuzione per migliorare le prestazioni della funzione. Inizializza SDK i client e le connessioni al database all'esterno del gestore delle funzioni e memorizza nella cache le risorse statiche localmente 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 vedi un volume involontario di chiamate, imposta la concorrenza riservata alla funzione su «0immediate» per limitare tutte le chiamate alla funzione mentre aggiorni il codice.

  • Non utilizzare documenti non documentati e non pubblici APIs nel codice della funzione Lambda. Per i runtime AWS Lambda gestiti, Lambda applica periodicamente aggiornamenti di sicurezza e funzionalità all'interno di Lambda. APIs Questi API aggiornamenti interni possono essere incompatibili con le versioni precedenti e portare a conseguenze indesiderate, come errori di chiamata se la funzione dipende da questi aggiornamenti non pubblici. APIs Vedi il riferimento per un elenco di quelli disponibili al pubblico. API APIs

  • 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?.