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:
-
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.
-
Crea il livello in Lambda.
-
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.
Argomenti
Prerequisiti
Per completare le fasi riportate in questa sezione, è necessario:
-
Python 3.11
e il programma di installazione dei pacchetti pip
In questo argomento, facciamo riferimento all'applicazione di layer-python
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 directoryfunction/
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 directoryfunction-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.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
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
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
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
-
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
-
Passa alla directory
layer
dell'app di esempiolayer-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
-
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
-
Assicurati di disporre delle autorizzazioni per eseguire entrambi gli script.
chmod 744 1-install.sh && chmod 744 2-package.sh
-
Esegui lo script
1-install.sh
utilizzando il comando seguente: ./1-install.sh
Questo script utilizza
venv
per creare un ambiente virtuale Python denominatocreate_layer
. Quindi installa tutte le dipendenze richieste nella directorycreate_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
-
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 denominatapython
. Comprime quindi il contenuto della directorypython
in un file denominatolayer_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:
. Avrai bisogno di questo nome della risorsa Amazon (ARN) nel passaggio successivo di questo tutorial, quando aggiungerai il livello alla tua funzione.123456789012
:layer:python-requests-layer:1
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
-
Apri la pagina Ruoli
nella console IAM. -
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
-
Il codice della funzionerequests
, 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
-
Passa alla directory
function/
. Se ti trovi attualmente nella directorylayer/
, esegui il seguente comando:cd ../function
-
Crea un pacchetto di implementazione di file .zip utilizzando il seguente comando:
zip my_deployment_package.zip lambda_function.py
-
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 -
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
" -
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
-
Apri la pagina Layers
(Livelli) nella console Lambda. -
Seleziona il livello che hai creato.
-
Seleziona Elimina, quindi scegli di nuovo Elimina.
Per eliminare la funzione Lambda
-
Aprire la pagina Functions (Funzioni)
della console Lambda. -
Selezionare la funzione creata.
-
Scegliere Operazioni, Elimina.
-
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
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
-
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
-
Passa alla directory
layer-numpy
dell'app di esempiolayer-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
-
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 ruotamanylinux
compatibile con Python 3.11, Amazon Linux e il set di istruzionix86_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
-
Assicurati di disporre delle autorizzazioni per eseguire entrambi gli script.
chmod 744 1-install.sh && chmod 744 2-package.sh
-
Esegui lo script
1-install.sh
utilizzando il comando seguente: ./1-install.sh
Questo script utilizza
venv
per creare un ambiente virtuale Python denominatocreate_layer
. Quindi installa tutte le dipendenze richieste nella directorycreate_layer/lib/python3.11/site-packages
. Il comandopip
è diverso in questo caso, perché è necessario specificare il tag--platform
comemanylinux2014_x86_64
. Questo indica apip
di installare la ruotamanylinux
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
-
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 denominatapython
. Comprime quindi il contenuto della directorypython
in un file denominatolayer_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:
. Per verificare che il livello funzioni come previsto, implementa la funzione Lambda nella directory 123456789012
:layer:python-numpy-layer:1function-numpy
.
Per implementare la funzione Lambda
-
Passa alla directory
function-numpy/
. Se ti trovi attualmente nella directorylayer-numpy/
, esegui il seguente comando:cd ../function-numpy
-
Verifica il codice della funzione
. La funzione importa la libreria numpy
, crea un arraynumpy
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!') }
-
Crea un pacchetto di implementazione di file .zip utilizzando il seguente comando:
zip my_deployment_package.zip lambda_function.py
-
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 -
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
" -
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.