Livelli di AWS Lambda - AWS Lambda

Livelli di AWS Lambda

Puoi configurare la tua funzione Lambda per inserire codice e contenuto aggiuntivi sotto forma di livelli. Un livello è un archivio ZIP che contiene librerie, un runtime personalizzato o altre dipendenze. Con i livelli, puoi utilizzare le librerie nella funzione senza doverle includere nel pacchetto di distribuzione.

I livelli ti consentono di contenere le dimensioni del pacchetto di distribuzione, semplificando lo sviluppo. Puoi evitare gli errori che possono verificarsi quando installi e comprimi le dipendenze con il codice funzione. Per le funzioni Node.js, Python e Ruby puoi sviluppare il codice funzione nella console Lambda purché mantieni le dimensioni del pacchetto di distribuzione sotto 3 MB.

Nota

Una funzione può utilizzare fino a 5 livelli alla volta. La dimensione totale non decompressa della funzione e di tutti i livelli non può superare il limite della dimensione del pacchetto di distribuzione non compresso di 250 MB. Per ulteriori informazioni, consulta Quote di AWS Lambda.

Puoi creare livelli o utilizzare i livelli pubblicati da AWS e da altri clienti AWS. I livelli supportano le policy basate sulle risorse per concedere le autorizzazioni di utilizzo ad account AWS specifici, AWS Organizations o a tutti gli account.

I livelli sono estratti nella directory /opt nell'ambiente di esecuzione della funzione. Ogni runtime cerca le librerie in una posizione diversa in /opt, a seconda del linguaggio. Struttura il livello in modo che il codice funzione possa accedere alle librerie senza ulteriore configurazione.

Puoi utilizzare Modello AWS Serverless Application (AWS SAM) anche per gestire i livelli e la configurazione del livello della tua funzione. Per istruzioni, consulta l'argomento relativo alla dichiarazione di risorse serverless nella Guida per gli sviluppatori di Modello AWS Serverless Application.

Configurazione di una funzione per l'utilizzo dei livelli

È possibile specificare fino a 5 livelli nella configurazione della funzione, durante o dopo la creazione della funzione. Puoi scegliere una versione specifica del livello da usare. Se vuoi utilizzare una versione diversa in seguito, aggiorna la configurazione della funzione.

Per aggiungere livelli alla tua funzione, usa il comando update-function-configuration. Nell'esempio seguente vengono aggiunti due livelli: uno dello stesso account della funzione e uno di un altro account.

$ aws lambda update-function-configuration --function-name my-function \ --layers arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3 \ arn:aws:lambda:us-east-2:210987654321:layer:their-layer:2 { "FunctionName": "test-layers", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs12.x", "Role": "arn:aws:iam::123456789012:role/service-role/lambda-role", "Layers": [ { "Arn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3", "CodeSize": 169 }, { "Arn": "arn:aws:lambda:us-east-2:210987654321:layer:their-layer:2", "CodeSize": 169 } ], "RevisionId": "81cc64f5-5772-449a-b63e-12330476bcc4", ... }

Devi specificare la versione di ogni livello da utilizzare fornendo l'ARN completo della versione del livello. Quando aggiungi livelli a una funzione che ha già dei livelli, l'elenco precedente viene sovrascritto da quello nuovo. Includi tutti i livelli ogni volta che aggiorni la configurazione del livello. Per rimuovere tutti i livelli, specifica un elenco vuoto.

$ aws lambda update-function-configuration --function-name my-function --layers []

La tua funzione può accedere al contenuto del livello durante l'esecuzione nella directory /opt. I livelli vengono applicati nell'ordine specificato, unendo le cartelle con lo stesso nome. Se lo stesso file viene visualizzato in più livelli, viene utilizzata la versione dell'ultimo livello applicato.

Il creatore di un livello può eliminare la versione del livello che stai utilizzando. Quando ciò accade, la funzione continua a operare come se la versione del livello esistesse ancora. Tuttavia, quando aggiorni la configurazione del livello, devi rimuovere il riferimento alla versione eliminata.

Gestione dei livelli

Per creare un livello, utilizza il comando publish-layer-version con un nome, una descrizione, un archivio ZIP e un elenco di runtime compatibili con il livello. L'elenco dei runtime è facoltativo, ma rende il livello più facile da individuare.

$ aws lambda publish-layer-version --layer-name my-layer --description "My layer" --license-info "MIT" \ --content S3Bucket=lambda-layers-us-east-2-123456789012,S3Key=layer.zip --compatible-runtimes python3.6 python3.7 { "Content": { "Location": "https://awslambda-us-east-2-layers.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-layer-4aaa2fbb-ff77-4b0a-ad92-5b78a716a96a?versionId=27iWyA73cCAYqyH...", "CodeSha256": "tv9jJO+rPbXUUXuRKi7CwHzKtLDkDRJLB3cC3Z/ouXo=", "CodeSize": 169 }, "LayerArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer", "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:1", "Description": "My layer", "CreatedDate": "2018-11-14T23:03:52.894+0000", "Version": 1, "LicenseInfo": "MIT", "CompatibleRuntimes": [ "python3.6", "python3.7", "python3.8" ] }

Ogni volta che effettui una chiamata a publish-layer-version viene creata una nuova versione. Le funzioni che usano il livello si riferiscono direttamente alla versione del livello. Puoi configurare le autorizzazioni su una versione di livello esistente, ma per apportare altre modifiche, è necessario creare una nuova versione.

Per trovare i livelli compatibili con il runtime della tua funzione, usa il comando list-layers.

$ aws lambda list-layers --compatible-runtime python3.8 { "Layers": [ { "LayerName": "my-layer", "LayerArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer", "LatestMatchingVersion": { "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:2", "Version": 2, "Description": "My layer", "CreatedDate": "2018-11-15T00:37:46.592+0000", "CompatibleRuntimes": [ "python3.6", "python3.7", "python3.8", ] } } ] }

Puoi omettere l'opzione di runtime per elencare tutti i livelli. I dettagli della risposta riflettono l'ultima versione del livello. Vedi tutte le versioni di un livello con list-layer-versions. Per ulteriori informazioni su una versione usa get-layer-version.

$ aws lambda get-layer-version --layer-name my-layer --version-number 2 { "Content": { "Location": "https://awslambda-us-east-2-layers.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-layer-91e9ea6e-492d-4100-97d5-a4388d442f3f?versionId=GmvPV.309OEpkfN...", "CodeSha256": "tv9jJO+rPbXUUXuRKi7CwHzKtLDkDRJLB3cC3Z/ouXo=", "CodeSize": 169 }, "LayerArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer", "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:2", "Description": "My layer", "CreatedDate": "2018-11-15T00:37:46.592+0000", "Version": 2, "CompatibleRuntimes": [ "python3.6", "python3.7", "python3.8" ] }

Il collegamento nella risposta ti consente di scaricare l'archivio dei livelli ed è valido per 10 minuti. Per eliminare la versione di un livello usa il comando delete-layer-version.

$ aws lambda delete-layer-version --layer-name my-layer --version-number 1

Quando elimini la versione di un livello, non puoi più configurare le funzioni per utilizzarla. Tuttavia, qualsiasi funzione che già utilizza la versione continua ad averne accesso. I numeri di versione non sono mai riutilizzati per un nome di livello.

Inserimento delle dipendenze della libreria in un livello

Puoi spostare le dipendenze del runtime dal tuo codice funzione inserendole in un livello. I runtime Lambda includono i percorsi della directory /opt per garantire che il codice funzione abbia accesso alle librerie incluse nei livelli.

Per includere librerie in un layer, inserirle in una delle cartelle supportate dal runtime o modificare la variabile di percorso per la lingua.

  • Node.jsnodejs/node_modules, nodejs/node8/node_modules (NODE_PATH)

    Esempio SDK AWS X-Ray per Node.js

    xray-sdk.zip └ nodejs/node_modules/aws-xray-sdk
  • Pythonpython, python/lib/python3.8/site-packages (directory del sito)

    Esempio Pillow

    pillow.zip │ python/PIL └ python/Pillow-5.3.0.dist-info
  • Rubyruby/gems/2.5.0 (GEM_PATH), ruby/lib (RUBYLIB)

    Esempio JSON

    json.zip └ ruby/gems/2.5.0/ | build_info | cache | doc | extensions | gems | └ json-2.1.0 └ specifications └ json-2.1.0.gemspec
  • Javajava/lib (classpath)

    Esempio Jackson

    jackson.zip └ java/lib/jackson-core-2.2.3.jar
  • Tuttobin (PATH), lib (LD_LIBRARY_PATH)

    Esempio JQ

    jq.zip └ bin/jq

Per ulteriori informazioni sulle impostazioni del percorso nell'ambiente di esecuzione Lambda, consulta Variabili di ambiente a runtime.

Autorizzazioni dei livelli

Le autorizzazioni di utilizzo dei layer sono gestite a livello di risorsa. Per configurare una funzione con un livello, è necessario avere l'autorizzazione per chiamare GetLayerVersion sulla versione del livello. Per le funzioni nel tuo account, puoi ottenere questa autorizzazione dalla policy dell'utente o dalla policy basata sulle risorse della funzione. Per utilizzare un livello in un altro account, è necessaria l'autorizzazione per la policy dell'utente e il proprietario dell'altro account deve concedere l'autorizzazione al tuo account con una policy basata sulle risorse.

Per concedere l'autorizzazione per l'utilizzo del livello a un altro account, aggiungi un'istruzione alla policy delle autorizzazioni della versione del layer 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.

$ aws lambda add-layer-version-permission --layer-name xray-sdk-nodejs --statement-id xaccount \ --action lambda:GetLayerVersion --principal 210987654321 --version-number 1 --output text e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::210987654321:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:xray-sdk-nodejs:1"}

Le autorizzazioni si applicano solo a una singola versione di un livello. Ripeti la procedura ogni volta che crei la nuova versione di un livello.

Per ulteriori esempi, consulta Concessione dell'accesso ai livelli ad altri account.

AWS CloudFormation e AWS SAM

Utilizzare Modello AWS Serverless Application (AWS SAM) nei modelli AWS CloudFormation per automatizzare la creazione e la mappatura dei layer nell'applicazione. Il tipo di risorsa AWS::Serverless::LayerVersion crea una versione del layer a cui è possibile fare riferimento dalla configurazione della funzione.

Esempio blank-nodejs/template.yml – Risorse serverless

AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: An AWS Lambda application that calls the Lambda API. Resources: function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs12.x CodeUri: function/. Description: Call the AWS Lambda API Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambdaReadOnlyAccess - AWSXrayWriteOnlyAccess Tracing: Active Layers: - !Ref libs libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-nodejs-lib Description: Dependencies for the blank sample app. ContentUri: lib/. CompatibleRuntimes: - nodejs12.x

Quando si aggiornano le dipendenze e si distribuiscono, AWS SAM crea una nuova versione del layer e aggiorna la mappatura. Se si distribuiscono modifiche al codice senza modificare le dipendenze, AWS SAM salta l'aggiornamento del layer, risparmiando tempo di caricamento.

Applicazioni di esempio

Il repository GitHub per questa guida fornisce applicazioni di esempio che dimostrano l'uso dei layer per la gestione delle dipendenze.

Per ulteriori informazioni sull'app di esempio vuota, vedere Applicazione di esempio di una funzione vuota per AWS Lambda.