Creación y uso compartido de capas de Lambda - AWS Lambda

Creación y uso compartido de capas de Lambda

Una capa de Lambda es un archivo .zip que puede contener código o datos adicionales. Una capa puede contener bibliotecas, un tiempo de ejecución personalizado, datos o archivos de configuración. Las capas promueven el uso compartido de código y la separación de responsabilidades para que pueda iterar más rápido al escribir la lógica empresarial.

Solo se pueden utilizar capas con funciones de Lambda implementadas como archivo .zip. Para una función definida como una imagen contenedor, empaqueta su tiempo de ejecución preferido y todas las dependencias de código al crear la imagen del contenedor. Para obtener más información, consulte Cómo trabajar con capas y extensiones de Lambda en imágenes de contenedor en el blog de cómputo de AWS.

Puede crear capas con la consola de Lambda, la API de Lambda,AWS CloudFormation, o el AWS Serverless Application Model (AWS SAM). Para obtener más información acerca de la creación de capas conAWS SAM, consulte Trabajar con capas en la Guía para desarrolladores de AWS Serverless Application Model.

Creación de contenido de capas

Al crear una capa, debe agrupar todo su contenido en un .zip. Carga el archivo.zip en su capa desde Amazon Simple Storage Service (Amazon S3) o su equipo local. Lambda extrae el contenido de la capa en el directorio /opt al configurar el entorno de ejecución para la función.

Compilar el archivo de archivo. zip para su capa

Cree su código de capa en un archivo de archivo. zip utilizando el mismo procedimiento que para un paquete de implementación de función. Si su capa incluye alguna biblioteca de código nativo, debe compilar y construir estas bibliotecas utilizando una máquina de desarrollo Linux para que los binarios sean compatibles con Amazon Linux.

Una forma de asegurarse de que empaqueta las bibliotecas correctamente para Lambda es usar Cloud9 de AWS. Para obtener más información, consulte Uso de capas de Lambda para simplificar el proceso de desarrollo en el blog de cómputo de AWS.

Inclusión de dependencias de biblioteca en una capa

Para cada tiempo de ejecución de Lambda, la variable PATH incluye carpetas específicas en el directorio de /opt. Si define la misma estructura de carpetas en el archivo .zip de capa, el código de función puede acceder al contenido de la capa sin necesidad de especificar la ruta.

En la siguiente tabla se enumeran las rutas de acceso de carpeta que admite cada motor de ejecución.

Rutas de capa para cada tiempo de ejecución de Lambda
Tiempo de ejecución Ruta

Node.js

nodejs/node_modules

nodejs/node14/node_modules (NODE_PATH)

Python

python

python/lib/python3.9/site-packages (directorios del sitio)

Java

java/lib (CLASSPATH)

Ruby

ruby/gems/2.7.0 (GEM_PATH)

ruby/lib (RUBYLIB)

Todos los tiempos de ejecución

bin (PATH)

lib (LD_LIBRARY_PATH)

En los siguientes ejemplos se muestra cómo puede estructurar las carpetas en el archivo .zip de su capa.

Node.js

ejemplo estructura de archivos para el SDK de AWS X-Ray para Node.js

xray-sdk.zip └ nodejs/node_modules/aws-xray-sdk
Python

ejemplo estructura de archivos para la biblioteca de Pillow

pillow.zip │ python/PIL └ python/Pillow-5.3.0.dist-info
Ruby

ejemplo estructura de archivos para la gema de JSON

json.zip └ ruby/gems/2.5.0/ | build_info | cache | doc | extensions | gems | └ json-2.1.0 └ specifications └ json-2.1.0.gemspec
Java

ejemplo estructura de archivos para el archivo JAR de Jackson

jackson.zip └ java/lib/jackson-core-2.2.3.jar
All

ejemplo estructura de archivos para la biblioteca jq

jq.zip └ bin/jq

Para obtener más información acerca de la configuración de rutas en el entorno de ejecución de Lambda, consulte Variables definidas de entorno de tiempo de ejecución.

Instrucciones específicas del lenguaje

Si desea obtener instrucciones específicas del lenguaje acerca de cómo crear un archivo .zip, consulte los temas siguientes.

Creación de una capa

Puede crear nuevas capas en la consola de Lambda o mediante la API de Lambda.

Las capas pueden tener una o más versiones. Al crear una capa, Lambda establece la versión de la capa en la versión 1. Puede configurar permisos en una versión de capa existente, pero para actualizar el código o realizar otros cambios de configuración, debe crear una nueva versión de la capa.

Para crear una capa (consola)

  1. Abra la página de Capas de la consola de Lambda.

  2. Elija Crear capa.

  3. En Configuración de la capa, en Nombre, escriba un nombre para la capa.

  4. (Opcional) En Descripción, escriba una descripción para su capa.

  5. Para cargar el código de capa, realice una de las siguientes acciones:

    • Para cargar un archivo.zip desde el equipo, elija Cargar un archivo .zip. Seleccione Cargar para seleccionar el archivo .zip local.

    • Para cargar un archivo desde Amazon S3, elija Upload a file from Amazon S3 (Cargar un archivo desde Amazon S3). Entonces, para el URL de enlace de Amazon S3, ingrese un enlace al archivo.

  6. (Opcional) Para Tiempos de ejecución compatibles, elija hasta 15 tiempos de ejecución.

  7. (Opcional) Para Licencia, introduzca la información de licencia necesaria.

  8. Seleccione Create (Crear).

Para crear una capa (API)

Para crear una capa, use el comando publish-layer-version con un nombre, una descripción, un archivo .zip y una lista de tiempos de ejecución que sean compatibles con la capa. La lista de tiempos de ejecución es opcional.

aws lambda publish-layer-version --layer-name my-layer --description "My layer" \ --license-info "MIT" --content S3Bucket=lambda-layers-us-east-2-123456789012,S3Key=layer.zip \ --compatible-runtimes python3.6 python3.7 python3.8

Debería ver un resultado similar a este:

{ "Content": { "Location": "https://awslambda-us-east-2-layers.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-layer-4aaa2fbb-ff77-4b0a-ad92-5b78a716a96a?versionId=27iWyA73cCAYqyH...", "CodeSha256": "tv9jJO+rPbXUUXuRKi7CwHzKtLDkDRJLB3cC3Z/ouXo=", "CodeSize": 169 }, "LayerArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer", "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:1", "Description": "My layer", "CreatedDate": "2018-11-14T23:03:52.894+0000", "Version": 1, "LicenseInfo": "MIT", "CompatibleRuntimes": [ "python3.6", "python3.7", "python3.8" ] }
nota

Cada vez que llame a publish-layer-version, crea una nueva versión de la capa.

Eliminación de una versión de capa

Para eliminar una versión de una capa, use el comando delete-layer-version.

aws lambda delete-layer-version --layer-name my-layer --version-number 1

Al eliminar una versión de una capa, ya no puede configurar una función de Lambda para usarla. Sin embargo, cualquier función que ya utilice la versión sigue teniendo acceso a la misma. Los números de versión nunca se reutilizan para un nombre de capa.

Configuración de permisos de capa

De forma predeterminada, una capa que cree es privada de su cuenta de AWS. Sin embargo, opcionalmente puede compartir la capa con otras cuentas o hacerla pública.

Para conceder permiso para utilizar capas a otra cuenta, añada una instrucción a la política de permisos de la versión de la capa con el comando add-layer-version-permission. En cada instrucción, puede conceder permiso a una única cuenta, a todas las cuentas o a una organización.

aws lambda add-layer-version-permission --layer-name xray-sdk-nodejs --statement-id xaccount \ --action lambda:GetLayerVersion --principal 210987654321 --version-number 1 --output text

Debería ver un resultado similar a este:

e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::210987654321:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:xray-sdk-nodejs:1"}

Los permisos solo se aplican a una única versión de una capa. Repita el proceso cada vez que cree una nueva versión de la capa.

Para obtener más ejemplos, consulte Concesión de acceso a las capas a otras cuentas.

Usar AWS CloudFormation con capas

Puede utilizar AWS CloudFormation para crear una capa y asociar la capa con la función de Lambda. En la siguiente plantilla de ejemplo se crea una capa denominada blank-nodejs-lib y se asocia la capa a la función de Lambda mediante la propiedad Capas.

AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: A Lambda application that calls the Lambda API. Resources: function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs12.x CodeUri: function/. Description: Call the Lambda API Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambda_ReadOnlyAccess - AWSXrayWriteOnlyAccess Tracing: Active Layers: - !Ref libs libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-nodejs-lib Description: Dependencies for the blank sample app. Content: S3Bucket: my-bucket-region-123456789012 S3Key: layer.zip CompatibleRuntimes: - nodejs12.x