Elizabeth Velasquez
Para excluir capetas o archivos, utilizamos la sección exclude
package: exclude: - .env/** - node_modules/**
Reducir el tamaño de tus funciones Lambda no es un capricho técnico: es la diferencia entre un despliegue que tarda 72 segundos y uno que vuela. Si tus funciones pesan 18 MB y solo necesitan unos cuantos kilobytes, estás cargando basura que ralentiza el cold start, infla tus minutos de GitHub Actions y te impide editar el código directamente en la consola de AWS.
¿Por qué importa el tamaño de una función Lambda?
Una Lambda pesada afecta dos momentos críticos: el despliegue y el arranque. Aunque serverless suene a “sin servidor”, tu código sí se ejecuta en una máquina en la nube que debe cargarlo cada vez que entra una petición HTTP.
En el ejemplo de la clase, el despliegue inicial tardaba 72 segundos [05:12], en buena parte porque GitHub Actions estaba subiendo 18 MB innecesarios a AWS.
¿Qué es el cold start en Lambda? Es el tiempo que tarda AWS en preparar un contenedor, cargar tu código y ejecutarlo por primera vez. Si tu paquete pesa menos, ese arranque es más rápido.
¿Cómo reducir el peso de una Lambda con serverless.yml?
La clave está en el bloque package del archivo serverless.yml. La estrategia es contraintuitiva pero efectiva: excluir todo y luego incluir solo lo necesario en cada función.
Excluir todos los archivos a nivel global
En la sección package del serverless.yml raíz, configuras un patrón que excluye absolutamente todo del paquete por defecto. El símbolo de exclamación (!) actúa como negación dentro del patrón, indicando que ningún archivo debe incluirse.
Si dejaras la configuración así, tu paquete quedaría vacío. El truco está en sobrescribir esta opción dentro de cada función Lambda.
Incluir solo el handler de cada función
Dentro de la definición de cada Lambda, agregas su propio bloque package con el patrón específico del archivo que necesita. Por ejemplo, para una función getUsers, indicas la ruta exacta: getUsers/handler.js.
Pasos concretos para hacer el refactor:
package.package con patterns apuntando al handler específico..js para Node.js, .py para Python (por ejemplo, deleteUsers/handler.py).Es fundamental que el YAML quede bien indentado y al mismo nivel que la propiedad handler de cada función [07:45].
¿Qué hace el símbolo
!en los patterns de Serverless Framework? Funciona como una negación. Le dice al empaquetador que excluya los archivos que coincidan con ese patrón, dejando fuera todo lo que no quieras subir a AWS.
¿Qué beneficios reales obtienes tras la optimización?
Después de aplicar este refactor, las funciones Lambda pasaron de 18 MB a aproximadamente 1.2 KB cada una [13:20]. La diferencia no es marginal, es de varios órdenes de magnitud.
Despliegues más rápidos y baratos
Menos peso significa menos tiempo subiendo el paquete a AWS desde GitHub Actions. Eso se traduce en menos minutos consumidos del plan gratuito y, si tu equipo crece, menos costos asociados al CI/CD.
En la clase también se mencionan otras estrategias complementarias para optimizar GitHub Actions:
Edición en vivo desde la consola de AWS
Aquí viene lo interesante. AWS impone un límite de tamaño para permitir editar el código de una Lambda directamente desde la consola web. Con paquetes de 18 MB, esa opción está bloqueada. Con paquetes de 1 KB, puedes hacer live coding y ajustar el handler sin necesidad de redesplegar desde tu máquina local.
Esto es especialmente útil para depurar errores rápidos o probar cambios menores en producción controlada.
¿Cómo validar el cambio sin desplegar manualmente?
Si ya tienes automatización con GitHub Actions configurada, no necesitas correr sls deploy localmente. Basta con seguir el flujo normal de Git:
git add . para incluir los cambios.git commit -m "improvement on packaging" con un mensaje descriptivo.git push origin nombre-de-la-rama para enviar los cambios al repositorio remoto.El workflow se dispara solo, ejecuta el build and test, y al finalizar despliega las Lambdas optimizadas. En la pestaña de Actions del repositorio puedes ver el progreso en tiempo real y confirmar que el tiempo total bajó respecto a despliegues anteriores.
¿Qué otras estrategias has usado tú para reducir el peso de tus funciones serverless? Cuéntanos en los comentarios qué optimizaciones aplicarías o si ya estás usando Lambda layers en tus proyectos.
583 Bytes por cada función 🤯
Estuve leyendo un poco la documentación y así quedarón de peso mis archivos:
Para que no tome en cuenta el package.json ni el package-lock.json Lo que hice fue agregar:
package: individually: true patterns: - "!*/**" - "!**"
Elizabeth Velasquez
Para excluir capetas o archivos, utilizamos la sección exclude
package: exclude: - .env/** - node_modules/**
Rolando Oxalc Quispe Juarez
Me quedó una duda, como se podría hacer para agregar los handlers de forma Dinamica? Aqui es bonito porque recién empieza, pero ese refactor cuando tienes 20 o 30 funciones ya no escala tanto jeje
Yor Jaggy Castaño Pino
ProfesorHola Rolando, no conozco una forma para manejar handlers de forma dinamica, no la he visto :thinking:
Tambien hay un tema a considerar, si llegamos a tener multiples funciones en un mismo serverless.yaml se nos estaria convirtiendo en un monolito serverless, lo cual no es recomendable.
Cuentame por aca o por el discord en el canal #cloud si tienes un caso de uso donde requieras lo que mencionas y lo podemos revisar :nerd_face:
Rolando Oxalc Quispe Juarez
Hola, se rompieron las notificaciones y recién me entero. Tengo un caso donde tengo un servicio que tiene 50 funciones y obvio para aplicar esa reducción habría que ver que pasa con cada function. Ya me pasó por ejemplo que cuando quise retirar los node_modules me dejó de andar el servicio porque ya no me andaba la librería UUID, leyendo era que había que aplicar layers y hacer una jugada con rollup, pero era complicarse demasiado.
Juan Pablo Corvalán
Hice mi función DELETE con Java, lo cual al utilizar dependencias de Maven, aumentó drásticamente el tamaño de mis lambdas, ahora todas pesan cerca de 10mb, ¿existe algún método similar para bajar el peso de mis funciones cuando estas estan hechas con Java? ¿Qué debería excluir? Ya que, tengo entendido, es el archivo .jar el que se deploya, y justamente es el que pesa esos 10mb
Edwar Hernandez
Que tal Juan, a mi me pasa algo similar pero con Python , en especifico la función del delete se me subió a 13,4 MB, y la verdad no he encontrado la forma de reducir el tamaño del paquete cuando tengo dependencias con el requirements.txt. ¿Ya lograste encontrar una solución para esto?, agradecería si me la pudieras pasar. Gracias.
Afu Tse
Y sería bueno usar layers? leo la documentación q se usa para reutilizar código y librerías.
Yor Jaggy Castaño Pino
ProfesorHola Afutse, nice question! :nerd_face: Excelente tema para generar discusión! TL,DR: Depende, nos puede ayudar a optimizar aspectos de cold-start, empaquetados, entre otros.
Beneficios:
José Antonio Mandujano Velázquez
Yo cree mis funciones dentro de un users.js
Al entrar a mi lambda de createUser veo que en el editor aparece todo el archivo (el handler) con todas las funciones de otras lambdas, en este caso tengo 2 dudas:
1.- Para que solo aparezca ese fragmento de codigo de mi funcion tendria que separar cada una en un archivo? 2.- Si edito una funcion que no sea la de createUser se ve afectada la lambda? (Yo creo que no debido a que el handler solo toma la funcion referente y la empaquete aunque existe el archivo que toma de referencia)
Yor Jaggy Castaño Pino
ProfesorHola Jose, En cuanto a la primera pregunta es correcto, lo ideal es tener multiples archivos para que cada funcion tenga solo la logica que va a usar.
Para la segunda, no deberia afectarse, es decir si tienes dos funciones en el mismo users.js y ya definiste en tu serverless.yaml los handlers correspondientes, cada funcion respetara la logica del handler especificado. Si llegas a modificar la logica de la funcion1, la logica de la otra funcion no deberia afectarse.
Diego Mejía Magallanes
Si tienen un error en el workflow en la parte de comentar, agreguen esto: thollander/actions-comment-pull-request@v2
deploy-env: name: Deploy Lambda runs-on: ubuntu-latest needs: testing-changes permissions: issues: write pull-requests: write ```y usen la versión 2. No es necesario declarar el Github token ```js thollander/actions-comment-pull-request@v2