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à.
Tutorial: Creazione di un runtime personalizzato
In questo tutorial crei una funzione Lambda con un runtime personalizzato. Si inizia includendo il runtime nel pacchetto di distribuzione della funzione. Quindi lo trasferisci in un livello che gestisci in modo indipendente dalla funzione. Infine, condividi il livello del runtime con tutti aggiornando la policy delle autorizzazioni basate sulle risorse.
Prerequisiti
Questo tutorial presuppone una certa conoscenza delle operazioni di base di Lambda e della console relativa. Se non lo si è già fatto, seguire le istruzioni riportate in Creare una funzione Lambda con la console per creare la prima funzione Lambda.
Per completare i passaggi seguenti, è necessaria l'AWS Command Line Interface (AWS CLI) versione 2. I comandi e l'output previsto sono elencati in blocchi separati:
aws --version
Verrà visualizzato l'output seguente:
aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2
Per i comandi lunghi viene utilizzato un carattere di escape (\
) per dividere un comando su più righe.
In Linux e macOS utilizzare la propria shell e il proprio programma di gestione dei pacchetti preferiti.
Nota
In Windows, alcuni CLI comandi Bash comunemente utilizzati con Lambda (zip
come) non sono supportati dai terminali integrati del sistema operativo. Per ottenere una versione integrata su Windows di Ubuntu e Bash, installa il sottosistema Windows per Linux
È necessario un IAM ruolo per creare una funzione Lambda. Il ruolo richiede l'autorizzazione per inviare log a CloudWatch Logs e accedere ai AWS servizi utilizzati dalla funzione. Se non hai un ruolo per lo sviluppo di funzioni, creane uno ora.
Creazione di un ruolo di esecuzione
-
Apri la pagina dei ruoli
nella IAM console. -
Scegliere Crea ruolo.
-
Creare un ruolo con le seguenti proprietà.
-
Trusted entity (Entità attendibile – Lambda
-
Autorizzazioni — AWSLambdaBasicExecutionRole.
-
Nome ruolo –
lambda-role
.
La AWSLambdaBasicExecutionRolepolitica dispone delle autorizzazioni necessarie alla funzione per scrivere i log in Logs. CloudWatch
-
Creazione di una funzione
Crea una funzione Lambda con un runtime personalizzato. Questo esempio include due file: un file bootstrap
del runtime e un gestore della funzione. Entrambi sono implementati in Bash.
-
Crea una directory per il progetto, quindi passa a quella directory.
mkdir runtime-tutorial cd runtime-tutorial
-
Crea un nuovo file denominato
bootstrap
. Questo è il runtime personalizzato.Esempio bootstrap
#!/bin/sh set -euo pipefail # Initialization - load function handler source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" # Processing while true do HEADERS="$(mktemp)" # Get an event. The HTTP request will block until one is received EVENT_DATA=$(curl -sS -LD "$HEADERS" "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") # Extract request ID by scraping response headers received above REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # Run the handler function from the script RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # Send the response curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done
Il runtime carica uno script di funzione dal pacchetto di distribuzione. Utilizza due variabili per individuare lo script.
LAMBDA_TASK_ROOT
indica il percorso da cui il pacchetto è stato estratto e_HANDLER
include il nome dello script.Dopo che il runtime ha caricato lo script della funzione, utilizza il runtime API per recuperare un evento di chiamata da Lambda, lo passa al gestore e invia la risposta a Lambda. Per ottenere l'ID della richiesta, il runtime salva le intestazioni della API risposta in un file temporaneo e legge l'intestazione dal file.
Lambda-Runtime-Aws-Request-Id
Nota
I runtime hanno responsabilità aggiuntive inclusa la gestione degli errori e forniscono al gestore le informazioni sul contesto. Per informazioni dettagliate, consultare Requisiti.
-
Crea uno script per la funzione. Lo script di esempio seguente definisce una funzione del gestore che richiede i dati dell'evento, li registra in
stderr
e li restituisce.Esempio function.sh
function handler () { EVENT_DATA=$1 echo "$EVENT_DATA" 1>&2; RESPONSE="Echoing request: '$EVENT_DATA'" echo $RESPONSE }
L'aspetto della directory
runtime-tutorial
dovrebbe essere simile al seguente:runtime-tutorial ├ bootstrap └ function.sh
-
Rendere i file eseguibili e aggiungerli ad un archive ZIP. Questo è il pacchetto di implementazione.
chmod 755 function.sh bootstrap zip function.zip function.sh bootstrap
-
Crea una funzione denominata
bash-runtime
. Per--role
, inserisci il tuo ARN ruolo di esecuzione Lambda.aws lambda create-function --function-name bash-runtime \ --zip-file fileb://function.zip --handler function.handler --runtime provided.al2023 \ --role
arn:aws:iam::123456789012:role/lambda-role
-
Richiama la funzione.
aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt --cli-binary-format raw-in-base64-out
L'cli-binary-formatopzione è obbligatoria se utilizzi la AWS CLI versione 2. Per rendere questa impostazione come predefinita, esegui
aws configure set cli-binary-format raw-in-base64-out
. Per ulteriori informazioni, consulta la pagina AWS CLI supported global command line options nella Guida per l'utente di AWS Command Line Interface versione 2.Dovresti ottenere una risposta simile a questa:
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }
-
Verifica la risposta.
cat response.txt
Dovresti ottenere una risposta simile a questa:
Echoing request: '{"text":"Hello"}'
Crea un livello
Per separare il codice del runtime dal codice della funzione, crea un livello che contenga solo il runtime. I livelli consentono di sviluppare le dipendenze della funzione in modo indipendente e possono ridurre l'utilizzo dello storage quando usi lo stesso livello con più funzioni. Per ulteriori informazioni, consulta Gestione delle dipendenze Lambda con livelli.
-
Crea un file .zip contenente il file
bootstrap
.zip runtime.zip bootstrap
-
Crea un livello con il publish-layer-version
comando. aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip
In tal modo viene creata la prima versione del livello.
Aggiorna la funzione
Per utilizzare il livello del runtime nella funzione, configura la funzione affinché utilizzi il livello e rimuovi il codice del runtime dalla funzione.
-
Aggiorna la configurazione della funzione da inserire nel livello.
aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-east-1:
123456789012
:layer:bash-runtime:1Questo aggiunge il runtime alla funzione nella directory
/opt
. Per garantire che Lambda utilizzi il runtime nel livello, è necessario rimuovere ilboostrap
dal pacchetto di implementazione della funzione, come illustrato nei due passaggi successivi. -
Crea un file .zip contenente il codice della funzione.
zip function-only.zip function.sh
-
Aggiorna il codice della funzione in modo da includere soltanto lo script del gestore.
aws lambda update-function-code --function-name bash-runtime --zip-file fileb://function-only.zip
-
Chiama la funzione per verificare che funzioni con il livello del runtime.
aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt --cli-binary-format raw-in-base64-out
L'cli-binary-formatopzione è obbligatoria se si utilizza la AWS CLI versione 2. Per rendere questa impostazione come predefinita, esegui
aws configure set cli-binary-format raw-in-base64-out
. Per ulteriori informazioni, consulta la pagina AWS CLI supported global command line options nella Guida per l'utente di AWS Command Line Interface versione 2.Dovresti ottenere una risposta simile a questa:
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }
-
Verifica la risposta.
cat response.txt
Dovresti ottenere una risposta simile a questa:
Echoing request: '{"text":"Hello"}'
Aggiorna il runtime
-
Per registrare le informazioni sull'ambiente di esecuzione, aggiorna lo script del runtime sulle variabili di ambiente di output.
Esempio bootstrap
#!/bin/sh set -euo pipefail # Configure runtime to output environment variables
echo "## Environment variables:" env
# Load function handler source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" # Processing while true do HEADERS="$(mktemp)" # Get an event. The HTTP request will block until one is received EVENT_DATA=$(curl -sS -LD "$HEADERS" "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") # Extract request ID by scraping response headers received above REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # Run the handler function from the script RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # Send the response curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done -
Crea un file .zip contenente la nuova versione del file
bootstrap
.zip runtime.zip bootstrap
-
Crea una nuova versione del livello
bash-runtime
.aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip
-
Configura la funzione per utilizzare la nuova versione del livello.
aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-east-1:
123456789012
:layer:bash-runtime:2
Condividi il livello
Per condividere un layer con un altro Account AWS, aggiungi una dichiarazione di autorizzazione per più account alla policy basata sulle risorse del layer. Esegui il add-layer-version-permissionprincipal
In ogni estratto conto, puoi concedere l'autorizzazione a un singolo account, a tutti gli account o a un'organizzazione in AWS Organizations.
L'esempio seguente concede all'account 111122223333 l'accesso alla versione 2 del livello bash-runtime
.
aws lambda add-layer-version-permission \ --layer-name bash-runtime \ --version-number 2 \ --statement-id xaccount \ --action lambda:GetLayerVersion \ --principal 111122223333 \ --output text
Verrà visualizzato un output simile al seguente:
{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2"}
Le autorizzazioni si applicano solo a un'unica versione di un livello. Ripeti la procedura ogni volta che crei la nuova versione di un livello.
Eliminazione
Eliminare ciascuna versione del livello.
aws lambda delete-layer-version --layer-name bash-runtime --version-number 1 aws lambda delete-layer-version --layer-name bash-runtime --version-number 2
Poiché contiene un riferimento alla versione 2 del livello, la funzione è ancora presente in Lambda. Continua a operare, ma le funzioni non possono più essere configurate per utilizzare la versione eliminata. Se modifichi l'elenco dei livelli sulla funzione, devi specificare una nuova versione oppure omettere il livello eliminato.
Elimina la funzione con il comando delete-function
aws lambda delete-function --function-name bash-runtime