Tutorial: Creazione di un runtime personalizzato - 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à.

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

Su Windows, alcuni comandi della CLI Bash utilizzati comunemente con Lambda (ad esempio, zip) 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. I comandi della CLI di esempio in questa guida utilizzano la formattazione Linux. Se si utilizza la CLI di Windows, i comandi che includono documenti JSON in linea dovranno essere riformattati.

È necessario un ruolo IAM per creare una funzione Lambda. Il ruolo richiede l'autorizzazione per inviare registri a CloudWatch Logs e accedere ai AWS servizi utilizzati dalla funzione. Se non hai un ruolo per lo sviluppo di funzioni, creane uno ora.

Per creare un ruolo di esecuzione
  1. Apri la pagina Ruoli nella console IAM.

  2. Scegliere Crea ruolo.

  3. Creare un ruolo con le seguenti proprietà.

    • Trusted entity (Entità attendibileLambda

    • Autorizzazioni —. AWSLambdaBasicExecutionRole

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

  1. Crea una directory per il progetto, quindi passa a quella directory.

    mkdir runtime-tutorial cd runtime-tutorial
  2. 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 carica lo script della funzione, utilizza l'API del runtime per recuperare un evento di chiamata da Lambda, passa l'evento al gestore e trasmette la risposta a Lambda. Per ottenere l'ID della richiesta, il runtime salva le intestazioni dalla risposta dell'API in un file temporaneo e legge l'intestazione Lambda-Runtime-Aws-Request-Id dal file.

    Nota

    I runtime hanno responsabilità aggiuntive inclusa la gestione degli errori e forniscono al gestore le informazioni sul contesto. Per informazioni dettagliate, vedi Requisiti.

  3. 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
  4. 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
  5. Crea una funzione denominata bash-runtime. Per --role, inserisci l'ARN del tuo 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
  6. Richiama la funzione.

    aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt --cli-binary-format raw-in-base64-out

    L'opzione cli-binary-format è necessaria se si utilizza la versione 2 della AWS CLI. 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" }
  7. 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 Lavorare con i livelli Lambda.

  1. Crea un file .zip contenente il file bootstrap.

    zip runtime.zip bootstrap
  2. Crea un livello con il comando publish-layer-version.

    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.

  1. 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:1

    Questo aggiunge il runtime alla funzione nella directory /opt. Per garantire che Lambda utilizzi il runtime nel livello, è necessario rimuovere il boostrap dal pacchetto di implementazione della funzione, come illustrato nei due passaggi successivi.

  2. Crea un file .zip contenente il codice della funzione.

    zip function-only.zip function.sh
  3. 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
  4. 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'opzione cli-binary-format è necessaria se si utilizza la versione 2 della AWS CLI. 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" }
  5. Verifica la risposta.

    cat response.txt

    Dovresti ottenere una risposta simile a questa:

    Echoing request: '{"text":"Hello"}'

Aggiorna il runtime

  1. 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
  2. Crea un file .zip contenente la nuova versione del file bootstrap.

    zip runtime.zip bootstrap
  3. Crea una nuova versione del livello bash-runtime.

    aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip
  4. 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 concedere l'autorizzazione per l'utilizzo del livello a un altro account, aggiungi un'istruzione alla policy delle autorizzazioni della versione del livello con il comando add-layer-version-permission. In ogni istruzione, puoi concedere l'autorizzazione a un singolo account, a tutti gli account o a un'organizzazione.

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 --statement-id xaccount \ --action lambda:GetLayerVersion --principal 111122223333 --version-number 2 --output text

Verrà visualizzato un output simile al seguente:

e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"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