AWS Lambda: Todo lo que deberías saber.

Flavio AAndres
Condor Labs Engineering
6 min readAug 17, 2020
Imagen descriptiva

Las funciones lambda dentro de la infraestructura de microservicios de Amazon Web Services (AWS) es una de las herramientas más útiles y versátiles que ofrecen. Las posibilidades de conectar esta función con distintas herramientas de AWS permite una experiencia personalizada a tus necesidades con los servicios que ya existen en el ecosistema de AWS.

En este post quiero enseñarte todo los conceptos básicos: qué es, cuándo usarlo y cómo funciona para que puedas construir productos cada vez más profesionales e infraestructuras más robustas acompañadas de esta gran utilidad.

¿Qué es una función Lambda?

Si nos ponemos exactos, el Lambda aparte de ser la decima letra griega, es la función matemática que intenta determinar la posición o velocidad de una particula cuantica.

Para Amazon Web Services, en la categoría de Computing, la función Lambda es un servicio de computación en la nube autoadministrado, y sí, esta es la palabra más representativa para las funciones Lambdas.

Esta herramienta te permite entregar a AWS simplemente una pieza de código en distintos lenguajes (Node.JS, Python, Go, etc.) y AWS se encargará automáticamente de desplegar la infraestructura necesaria cada vez que esta función sea ejecutada.

Las funciones Lambda responden dentro de AWS a eventos preestablecidos por ti, es decir, esta herramienta es ejecutada una vez la acción o acciones que tú determines sucedan.

Estas funciones pueden responder a archivos nuevos localizados en un Bucket S3, responder cuando alguien visite tu API o determinar qué sitio web estático es mostrado dependiendo a la región o país.

¿Por qué son esenciales en la infraestructura serverless?

Como lo dije anteriormente, la versatilidad de esta herramienta es una de las características más puntuales.

Estas funciones lambdas permiten acercar los servicios generalizados de AWS a un entorno propio y personalizado de cada lógica de negocio que quieras implementar.

Ya que estas funciones ofrecen una gran gama de lenguajes soportados, no es necesario que tú o tu equipo cambie a otro lenguaje de programación en el que no tengan familiaridad, los lenguajes soportados son: Java, Go, PowerShell, Node.js, C#, Python y Ruby.

Algo que para cualquier desarrollador o arquitecto de software es importante, es la monitorización, una vez hayas escrito y desplegado el código necesario tendrás una observabilidad completa que incluye tiempos de respuesta, cantidad de éxitos y fallas, memoria y CPU usada.

La función Lambda es simplemente un Container.

¿Te has preguntado como AWS se encarga de configurar los límites de memoria, CPU o tiempos de ejecución?

Internamente AWS usa contenedores para ejecutar el código que le entregaste y así levantar todos los módulos y servicios necesarios para que tu función sea ejecutada. Un contenedor se despliega cada vez que un evento es recibido y no hay ningún otro contenedor disponible.

AWS después de desplegar un contenedor lo mantiene encendido a la espera de más eventos durante 15 minutos. Si este tiempo es superado, AWS procede a apagar el contenedor hasta que otro evento sea recibido por la función Lambda.

Cold Starts en las funciones Lambda

Como leíste en el párrafo anterior, AWS apaga los contenedores cuando cada contenedor haya superado los 15 minutos de inactividad. Esto en algunos casos puede suponer fallas en el rendimiento o performance de la función Lambda, dando paso a lo que llamamos: Cold Start.

Imaginemos que tenemos una función lambda que envía un correo de recuperación de contraseña cada vez que un usuario lo solicita. Este tipo de solicitudes no son muy comunes en tu plataforma y si en 15 minutos no hay ningún restablecimiento de contraseña, los contenedores de la función Lambda se apagan.

La próxima persona que solicite una recuperación tendrá que esperar que un contenedor sea configurado, iniciado, desplegado e inicializado.

El tiempo máximo para que un contenedor se inicialice son aproximadamente ~5 minutos. Todo depende de los módulos externos o paquetes que hayas agregado a tu función y en algunos casos el Runtime o Lenguaje que esté ejecutando.

¿Como evitar el Cold Start? La forma más común de evitarlo es usando AWS CloudWatch para programar un llamado cada 5–10 minutos y con esto, asegurar que siempre exista un contenedor disponible para responder tus solicitudes.

Si no quieres configurar un CloudWatch manualmente, existen plug-ins de Serverless que te permiten hacerlo automáticamente.

Casos de usos para tus funciones Lambda

Con el servicio de AWS Lambda no solo puedes hacer integraciones internas con servicios de AWS, sino que también tienes acceso a Internet desde la función para conectarte con tus third party services. Acá te daré algunos ejemplos de cuando pueden ser utilizadas:

API Gateway & AWS Lambda:

Es uno de los usos más comunes de la función Lambda, cuando esta se integra con API Gateway el sentido de serverless y autoscaling cobran vida.

Para ejemplificarlo, pensemos en 10 endpoints de una API en un servidor tradicional, si uno de los endpoints necesita más recursos, sería necesario aumentar las prestaciones de todo el servidor donde está alojado el servicio.

Con AWS Lambda, tienes 1 función para cada uno de los 10 endpoints y si uno de ellos es llamado con más frecuencia y necesita más hardware, AWS solamente aumenta los recursos a esa función por el tiempo que lo necesite. Los ahorros económicos en tiempo e infraestructura son enormes en este caso.

Leer, convertir y procesar archivos con Buckets S3:

Los buckets S3 son actualmente usados no solo para alojar páginas web estáticas, sino también son usados como entradas de archivos masivos, ya que su gran capacidad de almacenamiento lo permite.

Muchas empresas integran Funciones Lambdas con S3 para procesar ficheros gigantes de texto, imágenes, audio y cualquier otro tipo de archivo para ser procesado. Puedes leer el texto de una imagen y guardarlo en una base de datos, analizar texto en .csv, agruparlo y clasificarlo para enviarlo a alguno de tus servicios. Los usos son incontables.

Guarda registros en AWS RDS o DynamoDB

Ya que con las funciones Lambda puedes ser intermediario entre alguna entrada de datos (API Gateway, S3, Eventos SNS, etc.) es fácilmente integrable con los servicios de Base de datos para persistir tu información, en este caso AWS Relational Database Service (RDS) & DynamoDB.

Las bases de datos usadas en conjunto a una Lambda, te permiten optimizar tiempos de latencia en la comunicación de los servicios.

Además, con dos servicios autoescalables podrás estar seguro de que cuando algún recuso Lambda tenga un uso más concurrente, ahí estará siempre disponible una base de datos que responda a tus solicitudes y persista tus datos.

También tiene limitaciones

Si bien las funciones Lambda te dan muchas ventajas ante posibles casos de usos que te encuentres en tus distintos proyectos, hay ciertas limitaciones que debes tener en cuenta antes de realizar tus implementaciones e integraciones con las funciones Lambda.

En la mayoría de los casos, es mejor pensar en algo como las instancias EC2 para tus necesidades si tus funciones superan las siguientes limitaciones:

  • El tiempo de ejecución es uno de ellos, cada función lambda puede ser ejecutada máximo por 900 segundos.
  • Si bien las funciones Lambdas permiten ejecutarse simultáneamente, AWS solo te permite un máximo de 1000 ejecuciones concurrentes por cuenta. Si superas este límite, tus opciones son: 1) Mejorar tus tiempos de respuesta o 2) Escribirle a Amazon para solicitar más ejecuciones concurrentes.
  • La idea de esta herramienta es dejar que AWS administre nuestros recursos, sin embargo, la cantidad de memoria disponible para tu función es limitada. Los rangos disponibles para tu función Lambda son desde 128 MB a 3.008MB incrementándose gradualmente en 64MB.

Espero que hayas aprendido lo suficiente como para adentrarte en el mundo de los AWS Lambda; son muy versátiles y cómodos para nosotros los desarrolladores.

No dudes en seguirme y preguntarme cualquier duda por Twitter @FlavioAandres.

--

--

Flavio AAndres
Condor Labs Engineering

I like to experiment with all. Backend developer at @condorlabs.io. NodeJS/AWS/Serverless/+