Capas de Lambda - AWS Lambda

Capas de Lambda

Utilice capas con funciones que utilizan archivos .zip para la implementación. Para una función definida como una imagen contenedor, empaquete su tiempo de ejecución preferido y todas las dependencias de código al crear la imagen 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 usar capas de Lambda para compartir código en sus funciones. Una capa contiene bibliotecas de código, un tiempo de ejecución personalizado u otras dependencias. Las capas ayudan a reducir el tamaño del paquete de implementación del archivo .zip, ya que las capas no se incluyen en el paquete de implementación.

Una función puede utilizar hasta cinco capas a la vez. El tamaño total descomprimido de la función y todas las capas no puede superar el límite del tamaño del paquete de implementación sin comprimir, de 250 MB. Para obtener más información, consulte Cuotas de Lambda.

Puede crear sus propias capas o utilizar capas que AWS o un cliente AWS haya publicado. Las capas admiten políticas basadas en recursos para conceder permisos de uso por capas a cuentas específicas de AWS o de AWS Organizations o a todas las cuentas.

También puede utilizar Modelo de aplicación sin servidor de AWS (AWS SAM) para administrar las capas y la configuración de la capa de su función. Para obtener instrucciones, consulte Trabajo con capas en Guía para desarrolladores de Modelo de aplicación sin servidor de AWS.

Crear capas

Al crear una nueva capa, Lambda crea la capa como la versión 1. Puede configurar permisos en una versión de la capa existente, pero para realizar cualquier otro cambio, debe crear una nueva versión.

Para crear una capa (consola)

  1. Abra la Página de capas de la consola de Lambda.

  2. Elija Crear capa.

  3. En Nombre, escriba un nombre para su 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, elija su archivo.zip y, a continuación, elija Abrir.

    • Para cargar un archivo desde Amazon Simple Storage Service (Amazon S3), elija 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, pero hace que la capa sea más fácil de descubrir.

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 los siguientes datos de salida:

{ "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" ] }

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

Administrar capas

Para encontrar capas que sean compatibles con el tiempo de ejecución de su función Lambda, utilice el comando list-layers.

aws lambda list-layers --compatible-runtime python3.8

Debería ver los siguientes datos de salida:

{ "Layers": [ { "LayerName": "my-layer", "LayerArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer", "LatestMatchingVersion": { "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:2", "Version": 2, "Description": "My layer", "CreatedDate": "2018-11-15T00:37:46.592+0000", "CompatibleRuntimes": [ "python3.6", "python3.7", "python3.8", ] } } ] }

Puede omitir la opción del tiempo de ejecución para obtener una lista de todas las capas. Los detalles en la respuesta reflejan la versión más reciente de la capa. Consulte todas las versiones de una capa con list-layer-versions. Para obtener más información sobre una versión, utilice get-layer-version.

aws lambda get-layer-version --layer-name my-layer --version-number 2

Debería ver los siguientes datos de salida:

{ "Content": { "Location": "https://awslambda-us-east-2-layers.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-layer-91e9ea6e-492d-4100-97d5-a4388d442f3f?versionId=GmvPV.309OEpkfN...", "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:2", "Description": "My layer", "CreatedDate": "2018-11-15T00:37:46.592+0000", "Version": 2, "CompatibleRuntimes": [ "python3.6", "python3.7", "python3.8" ] }

El enlace en la respuesta le permite descargar el archivo de la capa. El enlace es válido durante 10 minutos.

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 funciones 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.

Incluir dependencias de biblioteca en una capa

Cada tiempo de ejecución de Lambda agrega carpetas del directorio de /opt específicas para la variable PATH. Si la capa utiliza la misma estructura de carpetas, 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 Lambda
Tiempo de ejecución Ruta

Node.js

nodejs/node_modules

nodejs/node14/node_modules (NODE_PATH)

Python

python

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

Java

java/lib (CLASSPATH)

Ruby

ruby/gems/2.5.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 SDK de AWS X-Ray

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.

Permisos de capa

Para configurar una función GetLayerVersion con una capa, necesita permiso para llamar a Lambda en la versión de la capa. Para las funciones de su cuenta, puede obtener este permiso de la política de usuario.

Para utilizar una capa en otra cuenta, el propietario de la otra cuenta debe conceder permiso a su cuenta en una política basada en recursos.

Para conceder el permiso de uso de capa 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 los siguientes datos de salida:

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 se aplican solo a una única versión de una capa. Repita el proceso cada vez que cree una nueva versión de capa.

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

Configuración de una función para usar capas

Puede especificar hasta cinco capas en la configuración de la función Lambda, durante o después de la creación de la función. Elige una versión específica de una capa para usarla. Si desea utilizar una versión diferente más tarde, puede actualizar la configuración de la función.

Para agregar capas a su función, utilice el comando update-function-configuration. En el siguiente ejemplo se añaden dos capas: una desde la misma cuenta que la función y una desde una cuenta diferente.

aws lambda update-function-configuration --function-name my-function \ --layers arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3 \ arn:aws:lambda:us-east-2:210987654321:layer:their-layer:2

Debería ver los siguientes datos de salida:

{ "FunctionName": "test-layers", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs12.x", "Role": "arn:aws:iam::123456789012:role/service-role/lambda-role", "Layers": [ { "Arn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3", "CodeSize": 169 }, { "Arn": "arn:aws:lambda:us-east-2:210987654321:layer:their-layer:2", "CodeSize": 169 } ], "RevisionId": "81cc64f5-5772-449a-b63e-12330476bcc4", ... }

Debe especificar la versión de cada capa que quiera utilizar proporcionando el nombre de recurso de Amazon (ARN) completo de la versión de la capa. Al añadir capas para una función que ya tenga capas, la nueva lista sobrescribe la anterior. Incluya todas las capas cada vez que actualice la configuración de la capa. Para eliminar todas las capas, especifique una lista vacía.

aws lambda update-function-configuration --function-name my-function --layers []

Mientras su función se está ejecutando, puede acceder al contenido de la capa en el /opt directorio. Las capas se aplican en el orden que se especifica y se combinan las carpetas con el mismo nombre. Si el mismo archivo aparece en varias capas, se utiliza la versión en la última capa aplicada.

El creador de una capa puede eliminar la versión de la capa que esté utilizando. Cuando esto sucede, la función continúa ejecutándose como si la versión de la capa siguiera existiendo. Sin embargo, cuando actualiza la configuración de la capa, debe eliminar la referencia a la versión eliminada.

Agregar una versión de capa actualizada a la función

Utilice el comando update-function-configuration para agregar una versión de capa actualizada a la función.

El parámetro layers de este comando es una lista de todas las versiones de capas que se agregan a la función. Si la función ya tiene capas, la nueva lista sobrescribe la lista anterior. Si desea actualizar solo una de las versiones de la capa, el parámetro layers debe incluir los ARN de las versiones de la capa existentes.

En el procedimiento siguiente se asume que ha empaquetado el código de la capa actualizado en un archivo local denominado layer.zip.

Agregar una versión de capa actualizada a la función

  1. (Opcional) Si la nueva versión de la capa aún no se ha publicado, publíquela.

    aws lambda publish-layer-version --layer-name my-layer --description "My layer" --license-info "MIT" \ --zip-file "fileb://layer.zip" --compatible-runtimes python3.6 python3.7
  2. (Opcional) Si la función tiene más de una capa, obtenga las versiones de capa actuales asociadas a la función.

    aws lambda get-function-config --function-name my-function --query 'Layers[*].Arn' --output yaml

    (Opcional) También puede obtener la versión más reciente de una capa basada en el nombre de la capa.

    aws lambda list-layer-versions --layer-name my-layer --query 'LayerVersions[0].LayerVersionArn'
  3. Agregue la nueva versión de la capa a la función. En el siguiente comando de ejemplo, la función también tiene una versión de capa denominada other-layer:5.

    aws lambda update-function-configuration --function-name my-function \ --layers arn:aws:lambda:us-east-2:123456789012:layer:my-layer:2 \ arn:aws:lambda:us-east-2:123456789012:layer:other-layer:5

AWS CloudFormation y AWS SAM

Utilice AWS SAM en sus plantillas de AWS CloudFormation para automatizar la creación el mapeo de capas en su aplicación. El tipo de recurso AWS::Serverless::LayerVersion crea una versión de capa a la que puede hacer referencia desde la configuración de la función Lambda.

ejemplo blank-nodejs/template.yml: recursos sin servidor

AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: An AWS 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 AWS 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. ContentUri: lib/. CompatibleRuntimes: - nodejs12.x

Cuando actualiza sus dependencias e realiza la implementación, AWS SAM crea una nueva versión de la capa y actualiza el mapeo. Si implementa cambios en el código sin modificar sus dependencias, AWS SAM omite la actualización de capa, ahorrando tiempo de carga.

Aplicaciones de muestra

El repositorio de GitHub para esta guía proporciona aplicaciones de ejemplo que demuestran el uso de capas para la administración de dependencias.

Para obtener más información acerca de la aplicación de ejemplo en blanco, consulte Aplicación de ejemplo de función en blanco para AWS Lambda.