Creazione di un runtime personalizzato per AWS Lambda - 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à.

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, consultaRuntime solo per il sistema operativo per AWS Lambda.

Per una procedura guidata sul processo di implementazione del runtime personalizzato, consulta Tutorial: Creazione di un runtime personalizzato. Puoi anche esplorare un runtime personalizzato implementato in C++ su aws-lambda-cppawslabs/ on. GitHub

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 è file.method, dove file è il nome del file senza estensione e method è 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-Id nella risposta dell'API. Imposta la variabile di ambiente _X_AMZN_TRACE_ID locale 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.

Di seguito è riportato 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'intestazione Content-Type dal 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-Mode su streaming.

    • Imposta l'intestazione Transfer-Encoding su chunked.

    • 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'intestazione Transfer-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 denominate Lambda-Runtime-Function-Error-Type e Lambda-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 Trailer all'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 si consiglia di utilizzare il formato <categoria.motivo>. Ad esempio, Runtime.APIKeyNotFound.

    • Lambda-Runtime-Function-Error-Body: informazioni sull'errore nella codifica base64.