Optimización de Despliegue y Tamaño en AWS Lambda

Clase 22 de 25Curso de Serverless Framework en AWS

Resumen

¿Cómo podemos lograr que nuestras funciones Lambda sean más rápidas y ligeras?

Las funciones Lambda son una herramienta poderosa en el mundo del desarrollo serverless en Amazon Web Services (AWS). Sin embargo, uno de los desafíos comunes es asegurar que estas funciones sean lo más ligeras y eficientes posible. Aquí exploraremos cómo mejorar el desempeño mediante la reducción de tamaño de las funciones Lambda, ahorrando tiempo y costo en su despliegue.

¿Por qué es importante reducir el tamaño de las funciones Lambda?

Mantener el tamaño de las funciones Lambda bajo es crucial por varias razones:

  • Tiempo de arranque (cold start): Las funciones Lambda voluminosas pueden incrementar el tiempo de inicio, afectando el rendimiento y la rapidez con que responden.
  • Velocidad de despliegue: Funciones más pequeñas se despliegan más rápido, lo que es vital cuando se utilizan herramientas de automatización como GitHub Actions.
  • Costos asociados: Reducir el tiempo que tardan en ser subidas a AWS puede ahorrar combustible en cronometrizados servicios como GitHub Actions.

Amazon Web Services trata cada petición a Lambda como un "trigger" que activa la carga del código en un servidor. Por lo tanto, cuanto menos pese el código, más eficiente será la ejecución.

¿Cómo optimizar el empaquetado de funciones Lambda?

Para que las funciones sean ligeras, el enfoque es excluir archivos innecesarios y enfocar el empaquetado solo en lo esencial: el handler. Aquí te mostramos cómo hacerlo:

# Ejemplo de configuración de serverless.yaml
package:
  exclude:
    - "**"

functions:
  createUser:
    handler: createUsers/handler.handler
    package:
      include:
        - createUsers/handler.js

  getUser:
    handler: getUsers/handler.handler
    package:
      include:
        - getUsers/handler.js

  deleteUser:
    handler: deleteUsers/handler.handler
    package:
      include:
        - deleteUsers/handler.py
  • Excluir archivos: Inicialmente, la idea es excluir todos los archivos, logrando un empaquetado vacío.
  • Incluir esencialmente handlers: Para cada función Lambda, reincluso exclusivamente los archivos indispensables para su ejecución, como el handler.

¿Cómo probar los cambios de optimización?

Una vez realizados estos cambios, es esencial probarlos:

  • Despliegue local: Utilizando SLS deploy local para observar el comportamiento antes de confirmar los cambios.
  • Automatización con GitHub Actions: Con un simple git commit y git push, es posible validar si los cambios surten el efecto deseado mediante la ejecución del flujo automatizado.

Estrategias adicionales para mejorar el despliegue

Aparte de empaquetar solo los handlers necesarios, existen otras estrategias para optimizar aún más:

  • Uso de caché: Guardar en caché dependencias recurrentes para acelerar despliegues.
  • Lambda layers: Segmentar las dependencias significativamente grandes para reutilizarlas entre diferentes Lambdas.
  • Condicionar el pipeline: Ejecutar pasos selectivos en el pipeline de CI/CD para reducir tiempos de ejecución.

Con estos consejos y técnicas, no solo optimizas el tiempo de carga y despliegue de tus Lambdas, sino que también cumples con las mejores prácticas del sector cloud, ahorrando recursos valiosos en el proceso. ¡Atrévete a aplicar estas optimizaciones en tu próximo proyecto serverless!