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à.
Creazione di un runtime personalizzato per AWS Lambda
È possibile implementare un AWS Lambda runtime in qualsiasi linguaggio di programmazione. Il runtime è un programma che esegue un metodo del gestore della funzione Lambda quando la funzione viene richiamata. Puoi includere il runtime nel pacchetto di implementazione della funzione o distribuirlo in un livello. Quando crei la funzione Lambda, scegli un runtime solo per il sistema operativo (la famiglia di runtime provided).
Nota
La creazione di un runtime personalizzato è un caso d'uso avanzato. Se stai cercando informazioni sulla compilazione in un file binario nativo o sull'utilizzo di un off-the-shelf runtime di terze parti, consultaQuando usare i runtime solo per il sistema operativo di Lambda.
Per una procedura guidata sul processo di implementazione del runtime personalizzato, consulta Tutorial: Creazione di un runtime personalizzato.
Argomenti
Requisiti
I runtime personalizzati devono completare determinate attività di inizializzazione ed elaborazione. Il runtime è responsabile dell'esecuzione del codice di configurazione della funzione, della lettura del nome del gestore da una variabile di ambiente e della lettura degli eventi di richiamo dall'API del runtime Lambda. Il runtime passa i dati dell'evento al gestore della funzioni e invia la risposta dal gestore a Lambda.
Attività di inizializzazione
Le attività di inizializzazione vengono eseguite una volta per istanza della funzione per preparare l'ambiente a gestire le chiamate.
-
Recupero delle impostazioni – Leggi le variabili d'ambiente per ottenere dettagli sulla funzione e sull'ambiente.
-
_HANDLER– Il percorso del gestore della configurazione della funzione. Il formato standard è, dovefile.methodfileè il nome del file senza estensione emethodè il nome di un metodo o una funzione definita nel file. -
LAMBDA_TASK_ROOT– La directory che contiene il codice della funzione. -
AWS_LAMBDA_RUNTIME_API– L'host e la porta dell'API di runtime.
Per l'elenco completo delle variabili disponibili, consulta la pagina Variabili di ambiente di runtime definite.
-
-
Inizializzazione della funzione – Carica il file del gestore ed esegui il codice globale o statico che contiene. Le funzioni devono creare le risorse statiche come i client SDK e le connessioni al database e quindi riutilizzarle per più chiamate.
-
Gestione degli errori – Se si verifica un errore, viene chiamata l'API errore di inizializzazione e viene chiusa la funzione.
L'inizializzazione viene calcolata nella fatturazione del runtime e del timeout. Quando un'esecuzione attiva l'inizializzazione di una nuova istanza della funzione, puoi visualizzare il tempo di inizializzazione nei log e nella traccia AWS X-Ray.
Esempio log
REPORT RequestId: f8ac1208... Init Duration: 48.26 ms Duration: 237.17 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 26 MB
Attività di elaborazione
Durante l'esecuzione, un runtime usa l'interfaccia del runtime Lambda per gestire gli eventi in entrata e segnalare gli errori. Dopo aver completato le attività di inizializzazione, il runtime elabora gli eventi in entrata in un ciclo. Nel codice di runtime, eseguire le seguenti fasi in ordine.
-
Recupero di un evento – Viene invocata l'API chiamata successiva per ottenere l'evento seguente. Il corpo della risposta contiene i dati dell'evento. Le intestazioni di risposta contengono l'ID della richiesta e altre informazioni.
-
Propagazione dell'intestazione di traccia – Recupera l'intestazione di traccia X-Ray dall'intestazione
Lambda-Runtime-Trace-Idnella risposta dell'API. Imposta la variabile di ambiente_X_AMZN_TRACE_IDlocale allo stesso valore. L'SDK X-Ray utilizza questo valore per associare i dati di tracciamento tra i servizi. -
Creazione di un oggetto contesto – Crea un oggetto con informazioni di contesto dalle variabili di ambiente e dalle intestazioni nella risposta dell'API.
-
Richiamo del gestore della funzione – Passa l'evento e l'oggetto contesto al gestore.
-
Gestione della risposta – Viene invocata l'API risposta della chiamata per pubblicare la risposta del gestore.
-
Gestione degli errori – Se si verifica un errore, viene chiamata l'API errore di chiamata.
-
Pulizia – Rilascia le risorse inutilizzate, invia i dati ad altri servizi o esegui attività aggiuntive prima di ottenere il prossimo evento.
Entrypoint
Il punto di ingresso di un runtime personalizzato è un file eseguibile denominato bootstrap. Il file di bootstrap può essere il runtime oppure può richiamare un altro file che crea il runtime. Se la root del pacchetto di implementazione non contiene un file denominato bootstrap, Lambda cerca il file nei livelli della funzione. Se il file bootstrap non esiste o non è eseguibile, la funzione restituisce un errore Runtime.InvalidEntrypoint in caso di invocazione.
Ecco un bootstrap file di esempio che utilizza una versione in bundle di Node.js per eseguire un JavaScript runtime in un file separato denominato. runtime.js
Esempio bootstrap
#!/bin/sh cd $LAMBDA_TASK_ROOT ./node-v11.1.0-linux-x64/bin/node runtime.js
Implementazione dello streaming delle risposte in un runtime personalizzato
Per le funzioni di streaming delle risposte, gli endpoint response ed error manifestano un comportamento leggermente diverso che consente al runtime di trasmettere risposte parziali al client e restituire i payload in blocchi. Per ulteriori informazioni sul comportamento specifico, consulta le seguenti risorse:
-
/runtime/invocation/AwsRequestId/response: propaga l'intestazioneContent-Typedal runtime per inviarla al client. Lambda restituisce il payload di risposta in blocchi tramite codifica di trasferimento in blocchi HTTP/1.1. Il flusso della risposta può avere una dimensione massima di 20 MiB. Per trasmettere la risposta in streaming a Lambda, il runtime deve:-
Impostare l'intestazione HTTP
Lambda-Runtime-Function-Response-Modesustreaming. -
Imposta l'intestazione
Transfer-Encodingsuchunked. -
Scrivere la risposta in conformità alla specifica di codifica del trasferimento in blocchi HTTP/1.1.
-
Chiudere la connessione sottostante dopo la corretta scrittura della risposta.
-
-
/runtime/invocation/AwsRequestId/error: il runtime può utilizzare questo endpoint per segnalare errori di funzione o di runtime a Lambda, che accetta anche l'intestazioneTransfer-Encoding. Questo endpoint può essere chiamato solo prima che il runtime inizi a inviare una risposta alla chiamata. -
Segnala gli errori intermedi utilizzando i trailer degli errori in
/runtime/invocation/AwsRequestId/response: per segnalare gli errori che si verificano dopo aver iniziato a scrivere la risposta alla chiamata, il runtime può facoltativamente collegare intestazioni HTTP finali denominateLambda-Runtime-Function-Error-TypeeLambda-Runtime-Function-Error-Body. Lambda considera questa come una risposta riuscita e inoltra i metadati degli errori che il runtime fornisce al client.Nota
Per allegare le intestazioni finali, il runtime deve impostare il valore dell'intestazione
Trailerall'inizio della richiesta HTTP. Si tratta di un requisito della specifica di codifica di trasferimento in blocchi HTTP/1.1.-
Lambda-Runtime-Function-Error-Type: il tipo di errore rilevato dal runtime. L'intestazione è costituita da un valore stringa. Lambda accetta qualsiasi stringa, ma consigliamo un formato di.<category.reason>Ad esempio,Runtime.APIKeyNotFound. -
Lambda-Runtime-Function-Error-Body: informazioni sull'errore nella codifica base64.
-
Creazione di runtime personalizzati per istanze gestite Lambda
Le istanze gestite Lambda utilizzano la stessa API di runtime delle funzioni Lambda (predefinite). Tuttavia, esistono differenze fondamentali nel modo in cui devono essere implementati i runtime personalizzati per supportare il modello di esecuzione simultanea delle istanze gestite.
Gestione simultanea delle richieste
La differenza principale nella creazione di runtime personalizzati per le istanze gestite è il supporto per le chiamate simultanee. A differenza delle funzioni Lambda (predefinite) in cui il runtime elabora una chiamata alla volta, le istanze gestite possono elaborare più chiamate contemporaneamente all'interno di un unico ambiente di esecuzione.
Il runtime personalizzato deve:
-
Supporta
/nextrichieste simultanee: il runtime può effettuare più chiamate simultanee all'API di chiamata successiva, fino al limite specificato dalla variabile di ambiente.AWS_LAMBDA_MAX_CONCURRENCY -
Gestisci
/responsele richieste simultanee: più chiamate possono chiamare contemporaneamente l'API di risposta alle chiamate. -
Implementa la gestione delle richieste thread-safe: assicurati che le chiamate simultanee non interferiscano tra loro gestendo correttamente le risorse e lo stato condivisi.
-
Usa una richiesta univoca IDs: traccia ogni chiamata separatamente utilizzando l'
Lambda-Runtime-Aws-Request-Idintestazione per abbinare le risposte alle richieste corrispondenti.
Modello di implementazione
Un tipico modello di implementazione per i runtime delle istanze gestite prevede la creazione di thread o processi di lavoro per gestire le chiamate simultanee:
-
Leggi il limite di concorrenza: al momento dell'inizializzazione, leggi la variabile di
AWS_LAMBDA_MAX_CONCURRENCYambiente per determinare quante chiamate simultanee supportare. -
Crea un pool di lavoratori: inizializza un pool di lavoratori (thread, processi o attività asincrone) pari al limite di concorrenza.
-
Ciclo di elaborazione dei lavoratori: ogni lavoratore in modo indipendente:
Chiamate
/runtime/invocation/nextper ottenere un evento di invocazioneRichiama il gestore della funzione con i dati dell'evento
Invia la risposta a
/runtime/invocation/AwsRequestId/responseRipete il ciclo
Ulteriori considerazioni
-
Formato di registrazione: le istanze gestite supportano solo il formato di registro JSON. Assicurati che il runtime rispetti la variabile di
AWS_LAMBDA_LOG_FORMATambiente e utilizzi solo il formato JSON. Per ulteriori informazioni, consulta Configurazione dei formati di log JSON e testo normale. -
Risorse condivise: fai attenzione quando utilizzi risorse condivise come la
/tmpdirectory con chiamate simultanee. Implementa meccanismi di blocco adeguati per prevenire condizioni di gara.
Per ulteriori informazioni sugli ambienti di esecuzione di Lambda Managed Instances, vedere. Comprendere l'ambiente di esecuzione di Lambda Managed Instances