Utilizzo dei livelli per le funzioni Lambda in Python - 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à.

Utilizzo dei livelli per le funzioni Lambda in Python

Un livello Lambda è un archivio di file .zip che può contenere codice o dati aggiuntivi. 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. Crea un pacchetto per il contenuto del livello. Ciò significa creare un archivio di file con estensione .zip che contiene le dipendenze che desideri utilizzare nelle funzioni.

  2. Crea il livello in Lambda.

  3. Aggiungi il livello alle tue funzioni.

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

Prerequisiti

Per completare le fasi riportate in questa sezione, è necessario:

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 la dipendenza dai livelli. Dopo aver creato un livello, puoi 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 esempio layer-python, ci sono due esempi:

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

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

Compatibilità dei livelli 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 è disponibile come ruote (file .whl) 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 livello 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 ne è disponibile una). La ruota universale contiene any un tag della piattaforma, che indica che è compatibile con tutte le piattaforme, incluso Amazon Linux.

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

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

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 basato su Docker sull'immagine di container 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 dei livelli per i runtime 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 Lambda raccolga il contenuto del layer, il file.zip del layer deve avere le sue dipendenze nei seguenti percorsi di cartella:

  • python

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

Ad esempio, il file .zip del livello 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 libreria requests è posizionata correttamente nella directory python/lib/python3.11/site-packages. Ciò garantisce che Lambda possa localizzare la libreria durante l'invocazione delle funzioni.

Impacchettamento del contenuto dei livelli

In questo esempio, la libreria requests Python viene impacchettata in un file .zip di livelli. Per installare e creare il pacchetto del contenuto del livello, completa i seguenti passaggi.

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

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

    cd aws-lambda-developer-guide/sample-apps/layer-python/layer
  3. Esamina il file requirements.txt. Questo file definisce le dipendenze da includere nel livello, ovvero la libreria requests. È possibile aggiornare questo file per includere tutte le dipendenze che si desidera nel livello.

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

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

    ./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 script 2-package.sh utilizzando il comando seguente:

    ./2-package.sh

    Questo script copia il contenuto della directory create_layer/lib in una nuova directory denominata python. Comprime quindi il contenuto della directory python in un file denominato layer_content.zip. Questo è il file con estensione .zip per il livello. È possibile decomprimere il file e verificare che contenga la struttura di file corretta, come mostrato nella sezione Percorsi dei livelli per i runtime Python.

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

Creazione del livello

In questa sezione, viene utilizzato il file layer_content.zip generato nella sezione precedente e viene caricato come livello Lambda. È possibile caricare un layer utilizzando AWS Management Console o l'API Lambda 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 LayerVersionArn, che assomiglia a arn:aws:lambda:us-east-1:123456789012:layer:python-requests-layer:1. Avrai bisogno di questo nome della risorsa Amazon (ARN) nel passaggio successivo di questo tutorial, quando aggiungerai il livello alla tua funzione.

Aggiunta del livello alla tua funzione

In questa sezione, viene implementata una funzione Lambda di esempio che utilizza la libreria requests nel suo codice funzione, quindi si collega il livello. Per implementare la funzione, è necessario un ruolo di esecuzione. Se non disponi ancora di un ruolo di esecuzione, completa i passaggi nella sezione comprimibile.

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

Il codice della funzione Lambda importa la libreria requests, effettua una semplice richiesta HTTP 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 implementare la funzione Lambda
  1. Passa alla directory function/. Se ti trovi attualmente nella directory layer/, esegui il seguente comando:

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

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

    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 layer ARN che avete notato 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 comando: AWS CLI

    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 file response.json 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 a tuo carico. Account AWS

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

  2. Seleziona il livello che hai creato.

  3. Seleziona Elimina, quindi scegli di nuovo 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 confirm nel campo di immissione del testo, quindi scegli Elimina.

Utilizzo delle distribuzioni di ruote manylinux

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 la ruota che invece supporta manylinux. 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 pacchetto numpy nel livello, è possibile completare i seguenti passaggi di esempio per installare e impacchettare correttamente il livello.

Per installare e creare il pacchetto del contenuto dei livelli
  1. Clona il aws-lambda-developer-guide GitHub repository, che contiene il codice di esempio di cui hai bisogno nella directory. sample-apps/layer-python

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

    cd aws-lambda-developer-guide/sample-apps/layer-python/layer-numpy
  3. Esamina il file requirements.txt. Questo file definisce le dipendenze da includere nel livello, vale a dire la libreria numpy. Qui, viene specificato l'URL della distribuzione della ruota manylinux compatibile con Python 3.11, Amazon Linux e il set di istruzioni x86_64:

    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 script 1-install.sh utilizzando il comando seguente:

    ./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 comando pip è diverso in questo caso, perché è necessario specificare il tag --platform come manylinux2014_x86_64. Questo indica a pip di installare la ruota manylinux 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 script 2-package.sh utilizzando il comando seguente:

    ./2-package.sh

    Questo script copia il contenuto della directory create_layer/lib in una nuova directory denominata python. Comprime quindi il contenuto della directory python in un file denominato layer_content.zip. Questo è il file con estensione .zip per il livello. È possibile decomprimere il file e verificare che contenga la struttura di file corretta, come mostrato nella sezione Percorsi dei livelli per i runtime Python.

    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 LayerVersionArn, che assomiglia a arn:aws:lambda:us-east-1:123456789012:layer:python-numpy-layer:1. Per verificare che il livello funzioni come previsto, implementa la funzione Lambda nella directory function-numpy.

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

    cd ../function-numpy
  2. Verifica il codice della funzione. La funzione importa la libreria numpy, crea un array numpy 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 implementazione di file .zip utilizzando il seguente comando:

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

    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 layer ARN:

    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 comando: AWS CLI

    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'array numpy su un output standard.