Lavorare con i livelli per le funzioni Python 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à.

Lavorare con i livelli per le funzioni Python Lambda

Un layer Lambda è un archivio di file.zip che contiene codice o dati supplementari. I livelli di solito contengono dipendenze dalla libreria, un runtime personalizzato o file di configurazione. La creazione di un livello prevede tre passaggi generali:

  1. Package del contenuto del layer. Ciò significa creare un archivio di file.zip che contenga le dipendenze da utilizzare nelle funzioni.

  2. Crea il livello in Lambda.

  3. Aggiungi il layer alle tue funzioni.

Questo argomento contiene passaggi e indicazioni su come impacchettare e creare correttamente un layer Python Lambda con dipendenze di librerie esterne.

Prerequisiti

Per seguire i passaggi di questa sezione, è necessario disporre di quanto segue:

In questo argomento, facciamo riferimento all'applicazione di layer-pythonesempio nel repository awsdocs GitHub . Questa applicazione contiene script che scaricano le dipendenze e generano i livelli. L'applicazione contiene anche le funzioni corrispondenti che utilizzano le dipendenze dai livelli. Dopo aver creato un livello, potete implementare e richiamare la funzione corrispondente per verificare che tutto funzioni correttamente. Poiché si utilizza il runtime Python 3.11 per le funzioni, i livelli devono essere compatibili anche con Python 3.11.

Nell'applicazione di layer-python esempio, ci sono due esempi:

  • Il primo esempio prevede l'impacchettamento della requestslibreria in un livello Lambda. La layer/ directory contiene gli script per generare il layer. La function/ directory contiene una funzione di esempio per verificare il funzionamento del layer. La maggior parte di questo tutorial spiega come creare e impacchettare questo layer.

  • Il secondo esempio prevede l'impacchettamento della numpylibreria in un livello Lambda. La layer-numpy/ directory contiene gli script per generare il layer. La function-numpy/ directory contiene una funzione di esempio per verificare il funzionamento del layer. Per un esempio di come creare e impacchettare questo layer, vediUtilizzo delle distribuzioni manylinux delle ruote.

Compatibilità a livello Python con Amazon Linux

Il primo passaggio per creare un livello consiste nel raggruppare tutto il contenuto del livello in un archivio di file .zip. Perché le funzioni Lambda vengano eseguite su Amazon Linux, il contenuto del livello deve essere in grado di compilare e creare in un ambiente Linux.

In Python, la maggior parte dei pacchetti sono disponibili come ruote (.whlfile) oltre alla distribuzione dei sorgenti. Ogni ruota è un tipo di distribuzione integrata che supporta una combinazione specifica di versioni di Python, sistemi operativi e set di istruzioni della macchina.

Le ruote sono utili per garantire che il tuo layer sia compatibile con Amazon Linux. Quando scarichi le tue dipendenze, scarica la ruota universale, se possibile. (Per impostazione predefinita, pip installa la ruota universale, se disponibile). La ruota universale contiene any un tag della piattaforma, che indica che è compatibile con tutte le piattaforme, incluso Amazon Linux.

Nell'esempio che segue, impacchettate la requests libreria in un livello Lambda. La requests libreria è un esempio di pacchetto disponibile come ruota universale.

Non tutti i pacchetti Python sono distribuiti come ruote universali. Ad esempio, numpyha più distribuzioni di ruote, ognuna delle quali supporta un diverso set di piattaforme. Per tali pacchetti, scarica la manylinux distribuzione per garantire la compatibilità con Amazon Linux. Per istruzioni dettagliate su come impacchettare tali livelli, consultaUtilizzo delle distribuzioni manylinux delle ruote.

In rari casi, un pacchetto Python potrebbe non essere disponibile come ruota. Se esiste solo la distribuzione del codice sorgente (sdist), ti consigliamo di installare e impacchettare le dipendenze in un ambiente Docker basato sull'immagine del contenitore di base di Amazon Linux 2023. Consigliamo questo approccio anche se desideri includere le tue librerie personalizzate scritte in altri linguaggi come C/C++. Questo approccio imita l'ambiente di esecuzione Lambda in Docker e garantisce che le dipendenze dei pacchetti non Python siano compatibili con Amazon Linux.

Percorsi di livello per i runtime di Python

Quando si aggiunge un livello a una funzione, Lambda carica il contenuto del livello nella directory /opt di quell'ambiente di esecuzione. Per ogni runtime Lambda, la variabile PATH include percorsi di cartelle specifici nella directory /opt. Per garantire che la PATH variabile raccolga il contenuto del layer, il file layer.zip dovrebbe avere le sue dipendenze nei seguenti percorsi di cartella:

  • python

  • python/lib/python3.x/site-packages

Ad esempio, il file.zip del layer risultante creato in questo tutorial ha la seguente struttura di directory:

layer_content.zip └ python └ lib └ python3.11 └ site-packages └ requests └ <other_dependencies> (i.e. dependencies of the requests package) └ ...

La requestslibreria è posizionata correttamente nella python/lib/python3.11/site-packages directory. Ciò garantisce che Lambda possa localizzare la libreria durante le chiamate delle funzioni.

Imballaggio del contenuto del livello

In questo esempio, impacchettate la requests libreria Python in un file.zip di livello. Completate i seguenti passaggi per installare e impacchettare il contenuto del layer.

Per installare e impacchettare il contenuto del layer
  1. Clona il aws-lambda-developer-guide GitHub repository, che contiene il codice di esempio necessario nella sample-apps/layer-python directory.

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. Vai alla layer directory dell'app di layer-python esempio. Questa directory contiene gli script che utilizzate per creare e impacchettare correttamente il layer.

    cd aws-lambda-developer-guide/sample-apps/layer-python/layer
  3. Esaminate il requirements.txtfile. Questo file definisce le dipendenze da includere nel layer, vale a dire la requests libreria. È possibile aggiornare questo file per includere tutte le dipendenze che si desidera includere nel proprio layer.

    Esempio requirements.txt
    requests==2.31.0
  4. Assicuratevi di disporre delle autorizzazioni per eseguire entrambi gli script.

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. Esegui lo 1-install.shscript utilizzando il seguente comando:

    ./1-install.sh

    Questo script utilizza venv per creare un ambiente virtuale Python denominato. create_layer Quindi installa tutte le dipendenze richieste nella directory. create_layer/lib/python3.11/site-packages

    Esempio 1-install.sh
    python3.11 -m venv create_layer source create_layer/bin/activate pip install -r requirements.txt
  6. Esegui lo 2-package.shscript utilizzando il seguente comando:

    ./2-package.sh

    Questo script copia il contenuto dalla create_layer/lib directory in una nuova directory denominatapython. Quindi comprime il contenuto della python directory in un file denominatolayer_content.zip. Questo è il file.zip per il livello. È possibile decomprimere il file e verificare che contenga la struttura di file corretta, come mostrato nella Percorsi di livello per i runtime di Python sezione.

    Esempio 2-package.sh
    mkdir python cp -r create_layer/lib python/ zip -r layer_content.zip python

Creazione del livello

In questa sezione, prendi il layer_content.zip file che hai generato nella sezione precedente e lo carichi come layer Lambda. È possibile caricare un layer utilizzando AWS Management Console o Lambda API tramite AWS Command Line Interface ()AWS CLI. Quando caricate il file Layer .zip, nel PublishLayerVersion AWS CLI comando seguente, specificate python3.11 come runtime compatibile e arm64 come architettura compatibile.

aws lambda publish-layer-version --layer-name python-requests-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes python3.11 \ --compatible-architectures "arm64"

Dalla risposta, nota ilLayerVersionArn, che arn:aws:lambda:us-east-1:123456789012:layer:python-requests-layer:1 assomiglia a. Avrai bisogno di questo Amazon Resource Name (ARN) nel passaggio successivo di questo tutorial, quando aggiungi il layer alla tua funzione.

Aggiungere il layer alla tua funzione

In questa sezione, si distribuisce una funzione Lambda di esempio che utilizza requests la libreria nel relativo codice funzione, quindi si collega il layer. Per distribuire la funzione, è necessario un. Definizione delle autorizzazioni della funzione Lambda con un ruolo di esecuzione Se non disponi di un ruolo di esecuzione esistente, segui i passaggi nella sezione comprimibile.

Creazione di un ruolo di esecuzione
  1. Apri la pagina dei ruoli nella IAM console.

  2. Scegliere Crea ruolo.

  3. Creare un ruolo con le seguenti proprietà.

    • Trusted entity (Entità attendibileLambda

    • AutorizzazioniAWSLambdaBasicExecutionRole.

    • Nome ruololambda-role.

    La AWSLambdaBasicExecutionRolepolitica dispone delle autorizzazioni necessarie alla funzione per scrivere i log in Logs. CloudWatch

Il codice della funzione Lambda importa la requests libreria, effettua una semplice HTTP richiesta e quindi restituisce il codice di stato e il corpo.

import requests def lambda_handler(event, context): print(f"Version of requests library: {requests.__version__}") request = requests.get('https://api.github.com/') return { 'statusCode': request.status_code, 'body': request.text }
Per distribuire la funzione Lambda
  1. Passa alla directory function/. Se ti trovi attualmente nella layer/ directory, esegui il seguente comando:

    cd ../function
  2. Crea un pacchetto di distribuzione di file.zip utilizzando il seguente comando:

    zip my_deployment_package.zip lambda_function.py
  3. Implementa la funzione. Nel AWS CLI comando seguente, sostituite il --role parametro con il vostro ruolo ARN di esecuzione:

    aws lambda create-function --function-name python_function_with_layer \ --runtime python3.11 \ --architectures "arm64" \ --handler lambda_function.lambda_handler \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://my_deployment_package.zip
  4. Quindi, collega il livello alla tua funzione. Nel AWS CLI comando seguente, sostituite il --layers parametro con la versione del livello ARN che avete annotato in precedenza:

    aws lambda update-function-configuration --function-name python_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:python-requests-layer:1"
  5. Infine, provate a richiamare la vostra funzione usando il seguente AWS CLI comando:

    aws lambda invoke --function-name python_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json

    L'output visualizzato dovrebbe essere di questo tipo:

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }

    Il response.json file di output contiene dettagli sulla risposta.

Ora è possibile eliminare le risorse create per questo tutorial, a meno che non si voglia conservarle. Eliminando AWS le risorse che non utilizzi più, eviti addebiti inutili ai tuoi Account AWS.

Per eliminare il layer Lambda
  1. Apri la pagina Layers (Livelli) nella console Lambda.

  2. Seleziona il livello che hai creato.

  3. Scegliete Elimina, quindi scegliete nuovamente Elimina.

Per eliminare la funzione Lambda
  1. Aprire la pagina Functions (Funzioni) della console Lambda.

  2. Selezionare la funzione creata.

  3. Scegliere Operazioni, Elimina.

  4. Inserisci delete nel campo di immissione del testo, quindi scegli Elimina.

Utilizzo delle distribuzioni manylinux delle ruote

A volte, un pacchetto che si desidera includere come dipendenza non ha una ruota universale (in particolare, non ha any come tag della piattaforma). In questo caso, scarica manylinux invece la ruota che supporta. Ciò garantisce che le tue librerie di livelli siano compatibili con Amazon Linux.

numpyè un pacchetto che non dispone di una ruota universale. Se si desidera includere il numpy pacchetto nel layer, è possibile completare i seguenti passaggi di esempio per installare e impacchettare correttamente il layer.

Per installare e impacchettare il contenuto del layer
  1. Clona il aws-lambda-developer-guide GitHub repository, che contiene il codice di esempio necessario nella sample-apps/layer-python directory.

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. Vai alla layer-numpy directory dell'app di layer-python esempio. Questa directory contiene gli script che utilizzate per creare e impacchettare correttamente il layer.

    cd aws-lambda-developer-guide/sample-apps/layer-python/layer-numpy
  3. Esaminate il requirements.txtfile. Questo file definisce le dipendenze da includere nel layer, vale a dire la numpy libreria. Qui, specifichi URL la distribuzione manylinux wheel compatibile con Python 3.11, Amazon Linux e il x86_64 set di istruzioni:

    Esempio requirements.txt
    https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  4. Assicurati di disporre delle autorizzazioni per eseguire entrambi gli script.

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. Esegui lo 1-install.shscript utilizzando il seguente comando:

    ./1-install.sh

    Questo script utilizza venv per creare un ambiente virtuale Python denominato. create_layer Quindi installa tutte le dipendenze richieste nella directory. create_layer/lib/python3.11/site-packages Il pip comando è diverso in questo caso, perché è necessario specificare il --platform tag come. manylinux2014_x86_64 Questo indica pip di installare la manylinux ruota corretta, anche se il computer locale utilizza macOS o Windows.

    Esempio 1-install.sh
    python3.11 -m venv create_layer source create_layer/bin/activate pip install -r requirements.txt --platform=manylinux2014_x86_64 --only-binary=:all: --target ./create_layer/lib/python3.11/site-packages
  6. Esegui lo 2-package.shscript utilizzando il seguente comando:

    ./2-package.sh

    Questo script copia il contenuto dalla create_layer/lib directory in una nuova directory denominatapython. Quindi comprime il contenuto della python directory in un file denominatolayer_content.zip. Questo è il file.zip per il livello. È possibile decomprimere il file e verificare che contenga la struttura di file corretta, come mostrato nella Percorsi di livello per i runtime di Python sezione.

    Esempio 2-package.sh
    mkdir python cp -r create_layer/lib python/ zip -r layer_content.zip python

Per caricare questo layer su Lambda, usa il seguente comando: PublishLayerVersion AWS CLI

aws lambda publish-layer-version --layer-name python-numpy-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes python3.11 \ --compatible-architectures "x86_64"

Dalla risposta, nota ilLayerVersionArn, che arn:aws:lambda:us-east-1:123456789012:layer:python-numpy-layer:1 assomiglia a. Per verificare che il layer funzioni come previsto, distribuite la funzione Lambda nella function-numpy directory.

Per distribuire la funzione Lambda
  1. Passa alla directory function-numpy/. Se ti trovi attualmente nella layer-numpy/ directory, esegui il seguente comando:

    cd ../function-numpy
  2. Esamina il codice della funzione. La funzione importa la numpy libreria, crea un numpy array semplice e quindi restituisce un codice di stato e un corpo fittizi.

    import json import numpy as np def lambda_handler(event, context): x = np.arange(15, dtype=np.int64).reshape(3, 5) print(x) return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
  3. Crea un pacchetto di distribuzione di file.zip utilizzando il seguente comando:

    zip my_deployment_package.zip lambda_function.py
  4. Implementa la funzione. Nel AWS CLI comando seguente, sostituite il --role parametro con il vostro ruolo ARN di esecuzione:

    aws lambda create-function --function-name python_function_with_numpy \ --runtime python3.11 \ --handler lambda_function.lambda_handler \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://my_deployment_package.zip
  5. Quindi, collega il livello alla tua funzione. Nel AWS CLI comando seguente, sostituite il --layers parametro con la versione del livelloARN:

    aws lambda update-function-configuration --function-name python_function_with_numpy \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:python-requests-layer:1"
  6. Infine, provate a richiamare la vostra funzione usando il seguente AWS CLI comando:

    aws lambda invoke --function-name python_function_with_numpy \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json

    L'output visualizzato dovrebbe essere di questo tipo:

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }

    È possibile esaminare i log delle funzioni per verificare che il codice stampi l'numpyarray in modo standard out.