Contenido del curso
Buenas prácticas en serverless
Serverless no es solo lambda
Lambda layers
Asegurando nuestra app serverless
Conectando ApiGateway con SQS
Bonus
Cierra del curso
Optimizar Lambda con layers en Node.js
Resumen
Crear una Lambda Layer en Node.js te permite reducir el tamaño del paquete de despliegue separando las dependencias del código fuente. Si tu función pesa varios megas por culpa del node_modules, esta es la forma de adelgazarla y mantener el rendimiento en AWS Lambda.
Este recurso es útil para desarrolladores serverless que trabajan con AWS y Serverless Framework, y que necesitan despliegues más livianos, editables desde la consola y con dependencias compartidas entre funciones.
Cómo configurar el prefijo del evento S3 antes del despliegue
Antes de optimizar la Lambda, hay un detalle pendiente: el evento de S3 debe apuntar al prefijo correcto. En las reglas del evento defines que la regla esté asociada netamente a la carpeta upload. Con ese ajuste, el trigger solo se dispara cuando llega una imagen a esa carpeta y no a cualquier otra ruta del bucket [00:15].
Una vez hecho ese cambio, puedes hacer el despliegue y validar el flujo completo: generar una URL firmada, subir una imagen como un Gopher a la carpeta upload, y verificar que en Resized aparezcan las versiones en proporciones de 50, 100 y 200 píxeles [03:40].
Por qué optimizar una Lambda de 8.4 MB con layers
La función Thumbnail Generator pesaba aproximadamente 8.4 MB, lo cual trae desventajas: arranques en frío más lentos, imposibilidad de editar el código desde la consola de AWS y mayor consumo de memoria en el despliegue [00:50]. La solución está en mover las dependencias a una Lambda Layer.
¿Qué es una Lambda Layer? Es un paquete
.zipque contiene librerías o dependencias compartidas. Tu función Lambda lo referencia en lugar de incluirlas en su propio paquete, lo que reduce el peso del despliegue.
La documentación oficial de AWS indica que para Node.js cada dependencia debe vivir en una carpeta con la estructura nodejs/node_modules. Esa convención es obligatoria para que el runtime la reconozca al momento de ejecutar la función [01:40].
Cómo crear el archivo zip con la estructura correcta
El proceso requiere algo de batch scripting. Estos son los pasos concretos para preparar el paquete:
- Borra el
node_modulesactual para evitar dependencias de desarrollo. - Ejecuta
npm installindicando solo producción, arquitecturax64y plataforma Linux. Esto asegura compatibilidad con AWS aunque tu máquina local use otra arquitectura, como ARM [04:30]. - Crea un directorio
nodejsy mueve elnode_modulesdentro. - Comprime de forma recursiva con
zippara generarnodejs.zip.
El flag de plataforma Linux importa porque algunas dependencias compilan binarios específicos por sistema operativo. Si despliegas desde un Mac con ARM sin este parámetro, el código puede fallar en AWS.
Cómo publicar la layer con AWS CLI sin pasar por S3
El comando publish-layer-version permite cargar el archivo directamente desde tu máquina local usando el parámetro zipfile, en lugar de tener que subirlo primero a un bucket en S3 y referenciarlo después [02:50]. Eso simplifica el flujo.
¿Cómo subo una Lambda Layer sin usar S3? Usa
aws lambda publish-layer-versioncon el parámetro--zip-file fileb://nodejs.zip. Así cargas el archivo directamente desde tu máquina local sin intermediarios.
Le asignas un nombre amigable, por ejemplo my first layer, una descripción, y al ejecutarlo la layer aparece en la consola de AWS en la sección de layers, lista para ser usada por cualquier función compatible.
Cómo referenciar la layer en Serverless Framework
Dentro del serverless.yml puedes definir la etiqueta layers con varios atributos. Aquí defines el nombre, por ejemplo prod-dependencies, los compatibleRuntimes apuntando a nodejs14.x, y la ruta del artefacto que apunta a nodejs.zip [07:45].
Luego, en el handler de la función, agregas una propiedad layers que referencia la layer creada usando sintaxis de CloudFormation. Esa referencia le indica a la Lambda que debe cargar las dependencias desde la layer en lugar de buscarlas en su propio paquete.
Qué cambiar en el patrón de empaquetado
En la sección de patterns del empaquetado, debes excluir el node_modules para que el deployment package solo contenga el handler.js. De lo contrario, estarías subiendo las dependencias dos veces: una en la layer y otra en la función [09:20].
Con ese ajuste, al ejecutar sls deploy, el archivo que sube a S3 baja a unos 7.85 MB y la función Thumbnail Generator pasa a pesar apenas 985 bytes [11:30]. Esa diferencia es la que te permite editar el código directamente desde el editor en línea de la consola de AWS.
Cómo validar que la layer funciona correctamente
Después del despliegue, en el function overview de la Lambda aparece la sección Layers mostrando la layer asociada. Para confirmar que la lógica sigue intacta, generas una nueva URL firmada, subes una imagen a la carpeta upload y verificas en Resized que aparezcan las tres versiones en 200x200, 100x100 y 50x50 [12:50].
Si las imágenes redimensionadas se generan correctamente, significa que la dependencia externa sigue cargándose, pero ahora desde la layer y no desde el paquete de la función.
¿Ya habías trabajado con Lambda Layers antes? Cuéntame en los comentarios cómo las usas en tus proyectos serverless.