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:
-
Package del contenuto del layer. Ciò significa creare un archivio di file.zip che contenga le dipendenze da utilizzare nelle funzioni.
-
Crea il livello in Lambda.
-
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.
Argomenti
Prerequisiti
Per seguire i passaggi di questa sezione, è necessario disporre di quanto segue:
In questo argomento, facciamo riferimento all'applicazione di layer-python
Nell'applicazione di layer-python
esempio, ci sono due esempi:
-
Il primo esempio prevede l'impacchettamento della
requests
libreria in un livello Lambda. La layer/
directory contiene gli script per generare il layer. Lafunction/
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
numpy
libreria in un livello Lambda. La layer-numpy/
directory contiene gli script per generare il layer. Lafunction-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.whl
file) 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, numpy
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
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 requests
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
-
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
-
Vai alla
layer
directory dell'app dilayer-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
-
Esaminate il
requirements.txt
file. 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
-
Assicuratevi di disporre delle autorizzazioni per eseguire entrambi gli script.
chmod 744 1-install.sh && chmod 744 2-package.sh
-
Esegui lo
1-install.sh
script 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
-
Esegui lo
2-package.sh
script 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 dellapython
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:
assomiglia a. Avrai bisogno di questo Amazon Resource Name (ARN) nel passaggio successivo di questo tutorial, quando aggiungi il layer alla tua funzione.123456789012
:layer:python-requests-layer:1
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
-
Apri la pagina dei ruoli
nella IAM console. -
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
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
-
Passa alla directory
function/
. Se ti trovi attualmente nellalayer/
directory, esegui il seguente comando:cd ../function
-
Crea un pacchetto di distribuzione di file.zip utilizzando il seguente comando:
zip my_deployment_package.zip lambda_function.py
-
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 -
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
" -
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
-
Apri la pagina Layers
(Livelli) nella console Lambda. -
Seleziona il livello che hai creato.
-
Scegliete Elimina, quindi scegliete nuovamente Elimina.
Per eliminare la funzione Lambda
-
Aprire la pagina Functions (Funzioni)
della console Lambda. -
Selezionare la funzione creata.
-
Scegliere Operazioni, Elimina.
-
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
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
-
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
-
Vai alla
layer-numpy
directory dell'app dilayer-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
-
Esaminate il
requirements.txt
file. Questo file definisce le dipendenze da includere nel layer, vale a dire la numpy
libreria. Qui, specifichi URL la distribuzionemanylinux
wheel compatibile con Python 3.11, Amazon Linux e ilx86_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
-
Assicurati di disporre delle autorizzazioni per eseguire entrambi gli script.
chmod 744 1-install.sh && chmod 744 2-package.sh
-
Esegui lo
1-install.sh
script 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
Ilpip
comando è diverso in questo caso, perché è necessario specificare il--platform
tag come.manylinux2014_x86_64
Questo indicapip
di installare lamanylinux
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
-
Esegui lo
2-package.sh
script 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 dellapython
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:
assomiglia a. Per verificare che il layer funzioni come previsto, distribuite la funzione Lambda nella 123456789012
:layer:python-numpy-layer:1function-numpy
directory.
Per distribuire la funzione Lambda
-
Passa alla directory
function-numpy/
. Se ti trovi attualmente nellalayer-numpy/
directory, esegui il seguente comando:cd ../function-numpy
-
Esamina il codice della funzione
. La funzione importa la numpy
libreria, crea unnumpy
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!') }
-
Crea un pacchetto di distribuzione di file.zip utilizzando il seguente comando:
zip my_deployment_package.zip lambda_function.py
-
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 -
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
" -
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'
numpy
array in modo standard out.