Las capas de AWS Lambda cambiaron las reglas del juego para mí. Cuando se usan correctamente, pueden reducir drásticamente el tiempo de implementación y, a su vez, reducir el tiempo de producción en servicios sin servidor con múltiples funciones de AWS Lambda.
Sin embargo, a menudo es una característica que se malinterpreta y finalmente no se utiliza.
Esta publicación de blog cubre los conceptos básicos de las capas de AWS Lambda y cómo crearlas con Docker y AWS CDK en Python.
Puedes encontrar un código completo y funcional en mi proyecto de plantilla de código abierto: https://github.com/ran-isenberg/aws-lambda-handler-cookbook
¿Qué es una capa Lambda?
Las capas de AWS Lambda proporcionan una forma conveniente de empaquetar bibliotecas y otras dependencias que puede usar con múltiples funciones Lambda.
Una capa es un archivo comprimido .zip que puede contener código o datos adicionales. Una capa puede contener bibliotecas, un entorno 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 -AWS
Cree una capa con AWS CDK y Docker en Python con Poetry
Supongamos que nuestro proyecto de servicio Serverless utiliza 'poetry' para la gestión de dependencias y que el archivo pyproject.toml se ve así:
Nuestro objetivo
Queremos agrupar AWS Lambda Powertools, mypy-boto3-dynamodb y otras bibliotecas en la sección [tools.poetry.dependencies] en una capa Lambda para que todas nuestras funciones Lambda las utilicen y las implementen con AWS CDK.
Suposiciones
Instalaste Docker.
Instaló AWS CDK.
Utilice la poesía como su administrador de dependencias de Python.
Utilice un único archivo pyproject.toml general para todas las funciones de AWS Lambda. Incluye todos los requisitos de todas las funciones.
Prepare una carpeta .build para la implementación del CDK
Antes de escribir cualquier código CDK, necesitamos preparar la carpeta de creación de capas.
Almacenaremos todos los artefactos de compilación necesarios en una nueva carpeta: la carpeta '.build', que no formará parte de la base de código. Mantendremos una carpeta para los artefactos de las capas Lambda y otra carpeta que contiene el código de la función Lambda del servicio, listo para ser empaquetado por AWS CDK.
Empecemos con la capa.
Primero, necesitamos crear un archivo requirements.txt a partir de nuestro pyproject.toml que se usará para crear la capa en sí. En este ejemplo, usamos poetry, pero pipenv también es una opción válida.
Generamos un requirements.txt desde la sección [tool . poetry . dependencies] del archivo toml.
A diferencia de la sección [tool . poetry . dev-dependencies] en el toml, las bibliotecas en la sección [tool . poetry . dependencies] son las bibliotecas que las funciones Lambda en el proyecto requieren en tiempo de ejecución y deben cargarse en AWS.
Ejecute los siguientes comandos para crear la carpeta .build/common_layer y generar el archivo requirements.txt de la capa dentro de ella. Como se mencionó anteriormente, estos archivos no son parte de la base del código y usamos la carpeta .build para almacenar artefactos de compilación e implementación personalizados.
El comando poesía exportará las dependencias que no sean de desarrollo al archivo requirements.txt.
Los comandos generan el siguiente archivo requirements.txt en la carpeta '.build/common_layer'. El nombre 'common_layer' representa el propósito de la capa, la capa Lambda de uso común en nuestro servicio que utilizan todas las funciones.
Ahora, preparamos la carpeta .build de las funciones Lambda del servicio Serverless.
Podemos hacer esto ejecutando los siguientes comandos:
En nuestro proyecto, el código de los controladores de funciones Lambda se encuentra en la carpeta raíz del proyecto, en la carpeta "service". Antes de implementar las funciones Lambda en AWS, copiamos la carpeta "service" en la carpeta ".build/lambdas", que se empaquetará como un archivo zip y se cargará en AWS S3 mediante el código CDK. El código CDK que crea las funciones Lambda tomará el código del controlador Lambda de la carpeta ".build/lambdas".
Hacemos esto para preservar la jerarquía de importación tanto en AWS CDK como en el entorno del contenedor de funciones Lambda después de su implementación en AWS y para evitar problemas de importación en tiempo de ejecución como:
Este error ocurre cuando se construye la función sin copiarla primero a .build/lambdas sino copiando el código directamente desde la carpeta 'service' en el nivel raíz.
Código AWS CDK
Ahora que todo está en su lugar, escribamos una construcción CDK que cree una capa Lambda basada en el archivo requirements.txt prediseñado y una función Lambda en Python 3.9 que use la capa.
AWS CDK creará un contenedor de creación de capas Lambda mediante Docker.
El contenedor buscará un archivo requirements.txt, descargará todas las bibliotecas necesarias, las comprimirá y las cargará en AWS.
Una vez creado el objeto de capa, puedes agregarlo a cualquier función Lambda.
La construcción 'MyConstruct' de AWS CDK crea:
Rol básico de Lambda (líneas 17-25).
Capa Lambda (líneas 27-34). CDK busca un archivo requirements.txt en la carpeta de entrada ('.build/common_layer') y utiliza Python 3.9 como compatibilidad en tiempo de ejecución.
Función Lambda (líneas 36-46). La función utiliza la capa de la línea 45 que recibe como argumento. El código del controlador y otros módulos se toman de la carpeta de código '.build/lambdas'.
¡Es hora de implementar!
Ahora podemos ejecutar la implementación de CDK y esperar mientras se crean los recursos.
Ejecutamos el comando de implementación de CDK (y lo apuntamos al archivo app.py en el proyecto) combinado con los comandos anteriores que crean las carpetas .build.
En el proyecto de plantilla sin servidor del libro de recetas del controlador AWS Lambda , utilizamos un archivo make para abstraer esos detalles. Al ejecutar "make deployment", se ejecutarán estos tres comandos juntos.
Vea el makefile aquí .
Utilizar capa ARN externa
Si desea utilizar una capa Lambda creada externamente, puede cambiar la implementación '_build_common_layer' a lo siguiente:
En este caso construimos una capa pública creada por el increíble equipo de AWS Lambda Powertools.
Observe cómo seleccionamos una versión específica (17) como parte del ARN.
Manténgase atento a mi próxima publicación de blog donde presento las mejores prácticas de la capa AWS Lambda.