Uso de capas para funciones de Lambda en Python - AWS Lambda

Uso de capas para funciones de Lambda en Python

Una capa de Lambda es un archivo .zip que contiene código o datos adicionales. Las capas suelen contener dependencias de biblioteca, un tiempo de ejecución personalizado o archivos de configuración. La creación de una capa implica tres pasos generales:

  1. Empaquete el contenido de su capa. Esto significa crear un archivo de archivo. zip que contenga las dependencias que desea usar en sus funciones.

  2. Cree la capa en Lambda.

  3. Agregue la capa a sus funciones.

Este tema contiene los pasos y las instrucciones sobre cómo empaquetar y crear correctamente una capa de Lambda en Python con dependencias de bibliotecas externas.

Requisitos previos

Para completar los pasos de esta sección, debe disponer de lo siguiente:

A lo largo de este tema, haremos referencia a la aplicación de muestra layer-python en el repositorio de GitHub awsdocs. Esta aplicación contiene scripts que descargan las dependencias y generan las capas. La aplicación también contiene las funciones correspondientes que utilizan las dependencias de las capas. Tras crear una capa, puede implementar e invocar la función correspondiente para comprobar que todo funciona correctamente. Como utiliza el tiempo de ejecución de Python 3.11 para las funciones, las capas también deben ser compatibles con Python 3.11.

En la aplicación de muestra layer-python, hay dos ejemplos:

  • El primer ejemplo implica empaquetar la biblioteca requests en una capa de Lambda. El directorio layer/ contiene los scripts para generar la capa. El directorio function/ contiene una función de ejemplo que ayuda a comprobar el funcionamiento de la capa. La mayor parte de este tutorial explica cómo crear y empaquetar esta capa.

  • El segundo ejemplo implica empaquetar la biblioteca numpy en una capa de Lambda. El directorio layer-numpy/ contiene los scripts para generar la capa. El directorio function-numpy/ contiene una función de ejemplo que ayuda a comprobar el funcionamiento de la capa. Para ver un ejemplo de cómo crear y empaquetar esta capa, consulte Trabajo con distribuciones wheel manylinux.

Compatibilidad de capas de Python con Amazon Linux

El primer paso para crear una capa consiste en agrupar todo el contenido de la capa en un archivo .zip. Dado que las funciones de Lambda se ejecutan en Amazon Linux, el contenido de la capa debe poder compilarse y crearse en un entorno de Linux.

En Python, la mayoría de los paquetes están disponibles como wheel (archivos .whl) además de la distribución de código fuente. Cada wheel es un tipo de distribución creado que admite una combinación específica de versiones de Python, sistemas operativos y conjuntos de instrucciones de máquina.

Los wheels son útiles para garantizar que la capa sea compatible con Amazon Linux. Cuando descargue sus dependencias, descargue el wheel universal si es posible. (De forma predeterminada, pip instala el wheel universal si hay alguno disponible). El wheel universal contiene any como etiqueta de plataforma, lo que indica que es compatible con todas las plataformas, incluida Amazon Linux.

En el siguiente ejemplo, empaqueta la biblioteca requests en una capa de Lambda. La biblioteca requests es un ejemplo de un paquete que está disponible como wheel universal.

No todos los paquetes de Python se distribuyen como wheels universales. Por ejemplo, numpy tiene varias distribuciones wheel, cada una de las cuales admite un conjunto diferente de plataformas. Para estos paquetes, descargue la distribución manylinux para garantizar la compatibilidad con Amazon Linux. Para obtener instrucciones detalladas sobre cómo empaquetar dichas capas, consulte Trabajo con distribuciones wheel manylinux.

En raras ocasiones, es posible que un paquete de Python no esté disponible como wheel. Si solo existe la distribución de origen (sdist), se recomienda instalar y empaquetar las dependencias en un entorno Docker basado en la imagen del contenedor base de Amazon Linux 2023. También recomendamos este enfoque si desea incluir sus propias bibliotecas personalizadas escritas en otros lenguajes, como C/C++. Este enfoque imita el entorno de ejecución de Lambda en Docker y garantiza que las dependencias de paquetes que no son de Python sean compatibles con Amazon Linux.

Rutas de capa para tiempos de ejecución de Python

Cuando agrega una capa a una función, Lambda carga el contenido de la capa en el directorio /opt de ese entorno de ejecución. Para cada tiempo de ejecución de Lambda, la variable PATH ya incluye rutas de carpeta específicas en el directorio /opt. Para garantizar que la variable PATH recoja el contenido de la capa, el archivo .zip de la capa debe tener sus dependencias en las siguientes rutas de carpeta:

  • python

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

Por ejemplo, el archivo .zip de capa resultante que cree en este tutorial tiene la siguiente estructura de directorios:

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

La biblioteca requests está ubicada correctamente en el directorio python/lib/python3.11/site-packages. Esto garantiza que Lambda pueda localizar la biblioteca durante las invocaciones de funciones.

Empaquetado del contenido de la capa

En este ejemplo, empaqueta la biblioteca requests de Python en un archivo .zip de capa. Siga los pasos que se indican a continuación para instalar y empaquetar el contenido de la capa.

Instalación y empaquetado del contenido de la capa
  1. Clone el repositorio de aws-lambda-developer-guide de GitHub, que contiene el código de muestra que necesita en el directorio sample-apps/layer-python.

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. Navegue hasta el directorio layer de la aplicación de ejemplo layer-python. Este directorio contiene los scripts que usa para crear y empaquetar la capa correctamente.

    cd aws-lambda-developer-guide/sample-apps/layer-python/layer
  3. Examine el archivo requirements.txt. Este archivo define las dependencias que desea incluir en la capa, es decir, la biblioteca requests. Puede actualizar este archivo para incluir cualquier dependencia que desee incluir en su propia capa.

    ejemplo requirements.txt
    requests==2.31.0
  4. Asegúrese de tener los permisos para ejecutar ambos scripts.

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. Ejecute el script 1-install.sh mediante el siguiente comando:

    ./1-install.sh

    Este script utiliza venv para crear un entorno virtual de Python llamado create_layer. A continuación, instala todas las dependencias necesarias en el directorio create_layer/lib/python3.11/site-packages.

    ejemplo 1-install.sh
    python3.11 -m venv create_layer source create_layer/bin/activate pip install -r requirements.txt
  6. Ejecute el script 2-package.sh mediante el siguiente comando:

    ./2-package.sh

    Este script copia el contenido del directorio create_layer/lib a un nuevo directorio denominado python. Luego, comprime el contenido del directorio python en un archivo llamado layer_content.zip. Este es el archivo .zip para su capa. Puede descomprimir el archivo y comprobar que contiene la estructura de archivos correcta, como se muestra en la sección Rutas de capa para tiempos de ejecución de Python.

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

Creación de la capa

En esta sección, seleccione el archivo layer_content.zip que generó en la sección anterior y cárguelo como una capa de Lambda. Puede cargar una capa mediante la AWS Management Console o la API de Lambda en la AWS Command Line Interface (AWS CLI). Al cargar el archivo .zip de la capa, en el siguiente comando de AWS CLI PublishLayerVersion, especifique python3.11 como tiempo de ejecución compatible y arm64 como arquitectura compatible.

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

En la respuesta, anote el LayerVersionArn, que tiene este aspecto: arn:aws:lambda:us-east-1:123456789012:layer:python-requests-layer:1. Necesitará este nombre de recurso de Amazon (ARN) en el siguiente paso de este tutorial cuando agregue la capa a la función.

Adición de la capa a la función

En esta sección, implementa una función de Lambda de ejemplo que utiliza la biblioteca requests en su código de función y, a continuación, adjunta la capa. Para implementar la función, necesita un Definición de permisos de funciones de Lambda con un rol de ejecución. Si no dispone de un rol de ejecución existente, siga los pasos de la sección desplegable.

Para crear un rol de ejecución
  1. Abra la página Roles en la consola de IAM.

  2. Elija Crear rol.

  3. Cree un rol con las propiedades siguientes.

    • Trusted entity (Entidad de confianza).Lambda:.

    • Permisos: AWSLambdaBasicExecutionRole.

    • Nombre de rol: lambda-role.

    La política AWSLambdaBasicExecutionRole tiene permisos que la función necesita para escribir registros a Registros de CloudWatch.

El código de la función de Lambda importa la biblioteca requests, hace una solicitud HTTP sencilla y, a continuación, devuelve el código de estado y el cuerpo.

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 }
Implementación de la función de Lambda
  1. Vaya al directorio function/. Si se encuentra actualmente en el directorio layer/, ejecute el siguiente comando:

    cd ../function
  2. Cree un archivo .zip del paquete de implementación utilizando el siguiente comando:

    zip my_deployment_package.zip lambda_function.py
  3. Implemente la función. En el siguiente comando de AWS CLI, sustituya el parámetro --role por el ARN del rol de ejecución:

    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. A continuación, adjunte la capa a la función. En el siguiente comando de AWS CLI, sustituya el parámetro --layers por el ARN de la versión de capa que indicó anteriormente:

    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. Finalmente, intente invocar su función usando el siguiente comando de AWS CLI:

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

    Debería ver un resultado con un aspecto similar al siguiente:

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

    El archivo de salida response.json contiene detalles sobre la respuesta.

A menos que desee conservar los recursos que creó para este tutorial, puede eliminarlos ahora. Si elimina los recursos de AWS que ya no utiliza, evitará gastos innecesarios en su Cuenta de AWS.

Eliminación de la capa de Lambda
  1. Abra la página de Capas de la consola de Lambda.

  2. Seleccione la capa que ha creado.

  3. Elija Eliminar; luego, vuelva a elegir Eliminar.

Cómo eliminar la función de Lambda
  1. Abra la página de Funciones en la consola de Lambda.

  2. Seleccione la función que ha creado.

  3. Elija Acciones, Eliminar.

  4. Escriba delete en el campo de entrada de texto y elija Delete(Eliminar).

Trabajo con distribuciones wheel manylinux

A veces, un paquete que desee incluir como dependencia no tendrá un wheel universal (específicamente, no tendrá una etiqueta de plataforma any). En este caso, descargue el wheel compatible con manylinux. Esto garantiza que las bibliotecas de capas sean compatibles con Amazon Linux.

numpy es un paquete que no tiene un wheel universal. Si desea incluir el paquete numpy en la capa, puede completar los siguientes pasos de ejemplo para instalar y empaquetar la capa correctamente.

Instalación y empaquetado del contenido de la capa
  1. Clone el repositorio de aws-lambda-developer-guide de GitHub, que contiene el código de muestra que necesita en el directorio sample-apps/layer-python.

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. Navegue hasta el directorio layer-numpy de la aplicación de ejemplo layer-python. Este directorio contiene los scripts que usa para crear y empaquetar la capa correctamente.

    cd aws-lambda-developer-guide/sample-apps/layer-python/layer-numpy
  3. Examine el archivo requirements.txt. Este archivo define las dependencias que desea incluir en la capa, es decir, la biblioteca numpy. Aquí, especifica la URL de la distribución wheel manylinux que es compatible con Python 3.11, Amazon Linux y el conjunto de instrucciones x86_64:

    ejemplo 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. Asegúrese de tener los permisos para ejecutar ambos scripts.

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. Ejecute el script 1-install.sh mediante el siguiente comando:

    ./1-install.sh

    Este script utiliza venv para crear un entorno virtual de Python llamado create_layer. A continuación, instala todas las dependencias necesarias en el directorio create_layer/lib/python3.11/site-packages. El comando pip es diferente en este caso, ya que debe especificar la etiqueta --platform como manylinux2014_x86_64. Esto le indica a pip que instale el wheel manylinux correcto, incluso si su máquina local usa macOS o Windows.

    ejemplo 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. Ejecute el script 2-package.sh mediante el siguiente comando:

    ./2-package.sh

    Este script copia el contenido del directorio create_layer/lib a un nuevo directorio denominado python. Luego, comprime el contenido del directorio python en un archivo llamado layer_content.zip. Este es el archivo .zip para su capa. Puede descomprimir el archivo y comprobar que contiene la estructura de archivos correcta, como se muestra en la sección Rutas de capa para tiempos de ejecución de Python.

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

Para cargar esta capa a Lambda, utilice el siguiente comando de AWS CLI PublishLayerVersion:

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

En la respuesta, anote el LayerVersionArn, que tiene este aspecto: arn:aws:lambda:us-east-1:123456789012:layer:python-numpy-layer:1. Para comprobar que la capa funciona según lo previsto, implemente la función de Lambda en el directorio function-numpy.

Implementación de la función de Lambda
  1. Vaya al directorio function-numpy/. Si se encuentra actualmente en el directorio layer-numpy/, ejecute el siguiente comando:

    cd ../function-numpy
  2. Revise el código de la función. La función importa la biblioteca numpy, crea una matriz numpy simple y luego devuelve un código de estado y un cuerpo ficticios.

    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. Cree un archivo .zip del paquete de implementación utilizando el siguiente comando:

    zip my_deployment_package.zip lambda_function.py
  4. Implemente la función. En el siguiente comando de AWS CLI, sustituya el parámetro --role por el ARN del rol de ejecución:

    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. A continuación, adjunte la capa a la función. En el siguiente comando de AWS CLI, sustituya el parámetro --layers por el ARN de su versión de capa:

    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. Finalmente, intente invocar su función usando el siguiente comando de AWS CLI:

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

    Debería ver un resultado con un aspecto similar al siguiente:

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

    Puede examinar los registros de funciones para comprobar que el código imprime la matriz numpy de forma estándar.