View a markdown version of this page

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

Il gestore Lambda Event Function è il metodo contenuto 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.

Questa pagina descrive come lavorare con i gestori di funzioni Lambda in Python, incluse le convenzioni di denominazione, le firme degli handler e le migliori pratiche. Questa pagina include anche un esempio di una funzione evento Python Lambda che raccoglie informazioni su un ordine, produce una ricevuta in un file di testo e inserisce questo file in un bucket Amazon Simple Storage Service (Amazon S3).

Esempio di codice della funzione evento Python Lambda

Il seguente esempio di codice della funzione Lambda in Python raccoglie le informazioni su un ordine, produce una ricevuta in un file di testo e inserisce questo file in un bucket Amazon S3.

Esempio Funzione evento Python Lambda
import json import os import logging import boto3 # Initialize the S3 client outside of the handler s3_client = boto3.client('s3') # Initialize the logger logger = logging.getLogger() logger.setLevel("INFO") def upload_receipt_to_s3(bucket_name, key, receipt_content): """Helper function to upload receipt to S3""" try: s3_client.put_object( Bucket=bucket_name, Key=key, Body=receipt_content ) except Exception as e: logger.error(f"Failed to upload receipt to S3: {str(e)}") raise def lambda_handler(event, context): """ Main Lambda handler function Parameters: event: Dict containing the Lambda function event data context: Lambda runtime context Returns: Dict containing status message """ try: # Parse the input event order_id = event['Order_id'] amount = event['Amount'] item = event['Item'] # Access environment variables bucket_name = os.environ.get('RECEIPT_BUCKET') if not bucket_name: raise ValueError("Missing required environment variable RECEIPT_BUCKET") # Create the receipt content and key destination receipt_content = ( f"OrderID: {order_id}\n" f"Amount: ${amount}\n" f"Item: {item}" ) key = f"receipts/{order_id}.txt" # Upload the receipt to S3 upload_receipt_to_s3(bucket_name, key, receipt_content) logger.info(f"Successfully processed order {order_id} and stored receipt in S3 bucket {bucket_name}") return { "statusCode": 200, "message": "Receipt processed successfully" } except Exception as e: logger.error(f"Error processing order: {str(e)}") raise

Questo file contiene le sezioni seguenti:

Convenzioni di denominazione dei gestori

Il nome del gestore di funzioni definito al momento della creazione di una funzione deriva da:

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

  • il nome della funzione del gestore Python.

Nell'esempio precedente, se il file è denominatolambda_function.py, il gestore verrà specificato come. lambda_function.lambda_handler Questo è il nome del gestore predefinito assegnato alle funzioni create utilizzando la console Lambda.

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 Event Functions 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. Selezionare Salva.

Utilizzo dell'oggetto evento Lambda

Quando Lambda richiama la funzione, passa un argomento dell'oggetto evento al gestore della funzione. Gli oggetti JSON sono il formato di eventi più comune per le funzioni di eventi Lambda. Nell'esempio di codice riportato nella sezione precedente, la funzione prevede un input nel seguente formato:

{ "Order_id": "12345", "Amount": 199.99, "Item": "Wireless Headphones" }

Se la funzione viene richiamata da un'altra Servizio AWS, anche l'evento di input è un oggetto JSON. Il formato esatto dell'oggetto evento dipende dal servizio che richiama la funzione. Per vedere il formato dell'evento per un particolare servizio, consultate la pagina appropriata nel Richiamare Lambda con eventi provenienti da altri AWS services capitolo.

Se l'evento di input ha la forma di un oggetto JSON, il runtime Lambda converte l'oggetto in un dizionario Python. Per assegnare valori nell'input JSON alle variabili del codice, usa i metodi del dizionario Python standard come illustrato nel codice di esempio.

Puoi anche passare dati alla tua funzione come array JSON o come qualsiasi altro tipo di dati JSON validi. La tabella seguente definisce come il runtime Python converte questi tipi JSON.

Tipo di dati JSON Tipo di dati Python
oggetto dizionario () dict
array elenco (list)
numero numero intero (int) o numero in virgola mobile () float
stringa stringa () str
Booleano booleano () bool
null NoneType (NoneType)

Accesso e utilizzo dell'oggetto contestuale Lambda

L'oggetto contesto Lambda contiene informazioni sull'ambiente di invocazione ed esecuzione della funzione. Lambda passa automaticamente l'oggetto di contesto alla funzione quando viene richiamata. Puoi utilizzare l'oggetto contestuale per generare informazioni sull'invocazione della funzione a scopo di monitoraggio.

L'oggetto context è una classe Python definita nel client dell'interfaccia runtime Lambda. Per restituire il valore di una qualsiasi delle proprietà dell'oggetto contestuale, utilizzate il metodo corrispondente sull'oggetto context. Ad esempio, il frammento di codice seguente assegna il valore della aws_request_id proprietà (l'identificatore per la richiesta di chiamata) a una variabile denominata. request

request = context.aws_request_id

Per ulteriori informazioni sull'utilizzo dell'oggetto contestuale Lambda e per visualizzare un elenco completo dei metodi e delle proprietà disponibili, vedere. Utilizzo dell'oggetto contestuale Lambda per recuperare informazioni sulla funzione evento Python

Firme dell'handler valide per gli handler Python

Quando si definisce la funzione di gestione in Python, la funzione deve accettare due argomenti. Il primo di questi argomenti è l'oggetto evento Lambda e il secondo è l'oggetto contesto Lambda. Per convenzione, questi argomenti di input sono generalmente denominati event econtext, ma puoi assegnare loro tutti i nomi che desideri. Se dichiari la tua funzione di gestione con un solo argomento di input, Lambda genera un errore quando tenta di eseguire la funzione. Il modo più comune per dichiarare una funzione di gestione in Python è il seguente:

def lambda_handler(event, context):

Puoi anche usare i suggerimenti di tipo Python nella dichiarazione della funzione, come mostrato nell'esempio seguente:

from typing import Dict, Any def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]:

Per utilizzare una AWS digitazione specifica per eventi generati da altri oggetti Servizi AWS e per l'oggetto di contesto, aggiungi il aws-lambda-typing pacchetto al pacchetto di distribuzione della funzione. Puoi installare questa libreria nel tuo ambiente di sviluppo pip install aws-lambda-typing eseguendo. Il seguente frammento di codice mostra come utilizzare suggerimenti di tipo AWS specifici. In questo esempio, l'evento previsto è un evento Amazon S3.

from aws_lambda_typing.events import S3Event from aws_lambda_typing.context import Context from typing import Dict, Any def lambda_handler(event: S3Event, context: Context) -> Dict[str, Any]:

Non puoi usare il tipo di funzione Python per la tua async funzione di gestione.

Restituzione di un valore

Facoltativamente, un gestore può restituire un valore, che deve essere serializzabile in formato JSON. I tipi di restituzione più comuni includonodict,,list, estr. int float bool

Ciò che accade al valore restituito dipende dal tipo di chiamata e dal servizio che ha invocato la funzione. Ad esempio:

  • Se usi il tipo di RequestResponse invocazione per richiamare una funzione in modo sincrono, Lambda restituisce il risultato della chiamata alla funzione Python al client che richiama la funzione (nella risposta HTTP alla richiesta di chiamata, serializzata in JSON). Ad esempio, la AWS Lambda console utilizza il tipo di RequestResponse invocazione, quindi quando si richiama la funzione sulla console, la console visualizza il valore restituito.

  • Se il gestore restituisce degli oggetti che non possono essere serializzati da json.dumps, il runtime restituisce un errore. Un'eccezione a ciò si verifica se il gestore restituisce un oggetto. bytes

  • Se il gestore restituisce un bytes oggetto, il runtime lo passa così com'è come dati binari non elaborati senza serializzazione JSON, utilizzando un tipo di contenuto di. application/unknown

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

Nel codice di esempio, il gestore restituisce il seguente dizionario Python:

{ "statusCode": 200, "message": "Receipt processed successfully" }

Il runtime Lambda serializza questo dizionario e lo restituisce al client che ha richiamato la funzione come stringa JSON.

Nota

In Python 3.9 e nelle versioni successive, Lambda include il requestId dell'invocazione nella risposta di errore.

Utilizzo di AWS SDK per Python (Boto3) nel tuo gestore

Spesso, utilizzerai le tue funzioni per interagire con altre Servizi AWS risorse. Il modo più semplice per interfacciarsi con queste risorse è usare la AWS SDK per Python (Boto3). Tutti i runtime Lambda Python supportati includono una versione dell'SDK for Python (Boto3).

Tuttavia, consigliamo vivamente di includere l'SDK nel pacchetto di distribuzione della funzione se il codice deve utilizzarlo. L'inclusione dell'SDK nel pacchetto di distribuzione offre il pieno controllo sulle dipendenze e riduce il rischio di problemi di disallineamento delle versioni con altre librerie. Per ulteriori informazioni, consulta le pagine Dipendenze di runtime in Python e Compatibilità con le versioni precedenti.

Per utilizzare l'SDK for Python (Boto3) nella tua funzione, aggiungi la seguente dichiarazione al blocco di importazione all'inizio del codice della funzione:

import boto3

Usa il pip install comando per aggiungere la boto3 libreria al pacchetto di distribuzione della tua funzione. Per istruzioni dettagliate su come aggiungere dipendenze a un pacchetto di distribuzione.zip, consulta. Creazione di un pacchetto di implementazione .zip con dipendenze Per ulteriori informazioni sull'aggiunta di dipendenze alle funzioni distribuite come immagini di contenitori, consulta o. Creazione di un'immagine da un'immagine di base Creazione di un'immagine da un'immagine di base alternativa

Quando lo si utilizza boto3 nel codice, non è necessario fornire alcuna credenziale per inizializzare un client. Ad esempio, nel codice di esempio, utilizziamo la seguente riga di codice per inizializzare un client Amazon S3:

# Initialize the S3 client outside of the handler s3_client = boto3.client('s3')

Con Python, Lambda crea automaticamente variabili di ambiente con credenziali. L'boto3SDK controlla le variabili di ambiente della funzione per verificare la presenza di queste credenziali durante l'inizializzazione.

Accesso alle variabili d'ambiente

Nel codice del gestore, puoi fare riferimento alle variabili di ambiente utilizzando il metodo. os.environ.get Nel codice di esempio, facciamo riferimento alla variabile di RECEIPT_BUCKET ambiente definita utilizzando la seguente riga di codice:

# Access environment variables bucket_name = os.environ.get('RECEIPT_BUCKET')

Non dimenticare di includere un'import osistruzione nel blocco di importazione all'inizio del codice.

Procedure consigliate del codice per le funzioni di eventi Lambda in Python

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

  • Separare il gestore Lambda dalla logica principale. Ciò semplifica la creazione di una funzione più testabile in termini di unità. Ad esempio, in Python, questo 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
  • Controlla le dipendenze nel pacchetto di distribuzione della tua funzione. L'ambiente di esecuzione AWS Lambda contiene diverse librerie. Per i runtime Node.js e Python, questi includono gli SDK. AWS

    Per abilitare il set più recente di funzionalità e aggiornamenti di sicurezza, Lambda aggiorna periodicamente queste librerie. Questi aggiornamenti potrebbero introdurre lievi modifiche al comportamento della tua funzione. 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. Ciò riduce il tempo necessario per scaricare e decomprimere il pacchetto di distribuzione prima della chiamata.

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, vedi Riutilizzo delle connessioni con in. Keep-Alive 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 runtime AWS Lambda gestiti, 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?.