Una Explicación breve sobre Serverless, FaaS y AWS Lambda



 ¿Qué es Serverless?

Serverless no es una tecnología específica; es un concepto. Por eso es difícil de entender. Al igual que The Cloud era un concepto abstracto y confuso en el 2008.

Definir Serverless es difícil. Lo que sigue está lejos de ser la mejor definición, pero hagámoslo simple: Serverless se trata de administrar menos infraestructura. Por ejemplo, aquí hay algunas diferencias entre administrar nuestra propia infraestructura y Serverless:


  • En lugar de iniciar y configurar servidores, utilizamos servicios de alto nivel que ocultan esos detalles.
  • En lugar de escalar los servidores, permitimos que los proveedores de alojamiento lo hagan automáticamente.
  • En lugar de reservar servidores y pagar un precio fijo, pagamos por nuestro uso.

Sí, existen Intraestructuras Serverless. Nuestro código tiene que ejecutarse en alguna parte. Pero lo importante es que ni siquiera tenemos que pensar en ellos.

Sin servidor significa administrar menos infraestructura.

Un ejemplo

Ilustremos eso con el almacenamiento de archivos:

  • Enfoque Serverless: comprar / alquilar espacio en disco.
  • Enfoque Serverless: utilice AWS S3 o un servicio similar.

Con el enfoque tradicional, tenemos que decidir de antemano el tamaño del disco. Tenemos que monitorearlo, crear copias de seguridad, escalarlo si se llena y pagar el mismo precio incluso si solo usamos el 10%.

Con el enfoque Serverless, simplemente enviamos archivos a S3 y pagamos por lo que usamos.

Para ser claros: sí, AWS S3 es un PaaS. ¡Resulta que la mayoría de nosotros ya estábamos haciendo Serverless por un tiempo!




Serverless frente a FaaS

FaaS, o Function as a Service, es un servicio específico ofrecido por algunos proveedores. Por ejemplo:

FaaS nos permite ejecutar código Serverless: no tenemos que configurar o escalar servidores. Simplemente cargamos nuestro código, el proveedor lo ejecuta por nosotros y pagamos solo por su tiempo de ejecución.

Al igual que AWS S3 y muchos otros servicios, FaaS es un servicio Serverless. Pero es importante no confundir los dos.

FaaS es Serverless, pero Serverless es más que solo FaaS.

Dicho esto, FaaS es, por supuesto, muy interesante para nosotros como desarrolladores, ¡porque tenemos código para ejecutar!




AWS
La nube de AWS es uno de los proveedores de nube líderes en este momento.

Ofrece muchos servicios diferentes para crear y ejecutar aplicaciones en línea. Algunos servicios no tienen servidor, otros no. Por ejemplo, es posible alquilar servidores a través de su famoso servicio AWS EC2 o ejecutar bases de datos a través de AWS RDS (Relational Database Service).

Es posible crear aplicaciones sin servidor utilizando servicios de otros proveedores de nube, como Microsoft Azure, Google Cloud, etc. Sin embargo, por ahora AWS es la solución más popular y el líder de la industria. Al enfocarnos en un proveedor, podemos mantener este curso simple pero concreto.

Crear una cuenta de AWS

En esta sección, veremos cómo crear una nueva cuenta de AWS. 

Sé consciente de:

  • Se requiere una tarjeta de crédito (aunque las cuentas de AWS son gratuitas).
  • Las cuentas de AWS tardan hasta 24 horas en activarse.

Para crear una cuenta de AWS:

  1. Visite la página de inicio de AWS y haga clic en "Crear una cuenta" ( aquí hay un enlace directo ). Si inició sesión en AWS anteriormente, es posible que primero deba hacer clic en "Iniciar sesión en una cuenta diferente" y luego en "Crear una nueva cuenta de AWS".
  2. Complete el formulario y haga clic en "Continuar".
  3. Elija crear una cuenta "Personal" o una "Profesional": ambas tienen las mismas funciones.
  4. Ingrese la información adicional y haga clic en "Crear cuenta y continuar". Se creó su cuenta, pero aún no está activa.
  5. Agregue un método de pago en la página "Información de pago".
  6. Verifica tu numero de teléfono.
  7. Si se le solicita, puede elegir un plan de AWS Support. Un plan gratuito está disponible.

Ahora puede esperar a que su cuenta esté completamente activada. Esto puede tardar hasta 24 horas. En caso de que la activación no funcione, consulte la documentación oficial de AWS para obtener ayuda.

Estampación

Hay dos enfoques para implementar nuestras aplicaciones Serverless:

  • implementar proyectos manualmente a través de la interfaz de usuario,
  • o automatizar mediante herramientas.

La implementación manual no es una buena opción porque hay mucho margen para errores. Además de eso, la interfaz de usuario de AWS es, seamos honestos, bastante compleja. Usar una herramienta en realidad será más sencillo.

La herramienta que les mostraré es Serverless Framework.

Hay varias razones para esa elección: Serverless Framework es la herramienta más popular en este momento, lo que significa que hay muchos ejemplos en línea. También tiene la comunidad más grande y el formato de configuración es uno de los más simples.

Por supuesto, todo lo que les mostraré es compatible con otras herramientas de implementación, como AWS SAM, AWS CDK, CloudFormation o Terraform.

Configuración

Para implementar aplicaciones sin servidor (incluidos los ejemplos), necesitaremos:

una cuenta de AWS

instalar la AWS CLI (cualquier versión)

instalar Serverless Framework de código abierto (no es necesario crear una cuenta para su servicio "Pro")

¿Qué es AWS Lambda?

Lambda es un servicio proporcionado por AWS que nos permite ejecutar código sin tener que lidiar con detalles de infraestructura, como administrar servidores, escalarlos, etc.

Lo que es importante comprender con Lambda es que el código se activa mediante eventos. No podemos ejecutar servidores web, demonios, tareas de larga duración, como tareas programadas, etc. Por eso solemos llamar a esto una arquitectura impulsada por eventos.
AWS Lambda se basa en eventos.
Si bien las "aplicaciones basadas en eventos" pueden dar miedo, ¡no temas! No hay nada exótico aquí. Nuestro código se activa por eventos, y los eventos pueden ser:

  • una solicitud HTTP (por ejemplo, para servir un sitio web o una API),
  • un programa cron (por ejemplo, "todos los días a la medianoche, ejecute este código"),
  • un mensaje en una cola de mensajes (por ejemplo, para ejecutar trabajos asincrónicos),
  • un mensaje de otra aplicación (por ejemplo, para conectar microservicios),
  • un mensaje de otros servicios de AWS (por ejemplo, para procesar archivos cuando se cargan en S3).
Esos son solo ejemplos, pero es de esperar que uno o dos nos parezcan familiares :) Cuando lo pensamos, la mayor parte de lo que hacemos es provocado por eventos. Al adoptar esto, AWS Lambda nos permite eliminar una gran cantidad de código e infraestructura "pegajosos" y centrarnos en la lógica empresarial.
La mayoría de las aplicaciones ya están controladas por eventos.

Las ventajas de estar impulsado por eventos

Más allá del hecho de que Lambda se encarga de la administración del servidor por nosotros, su enfoque basado en eventos tiene varios beneficios:

1. Escribe menos código.

Debido a que nuestro código reacciona a los eventos, no escribimos, configuramos ni mantenemos servidores web, demonios, orquestadores (como supervisord), ni sondeamos otros sistemas.

2. Paga solo por lo que usas.

Con Lambda, ya no pagamos por servidores inactivos. En cambio, solo pagamos cuando se ejecuta nuestro código: cuando ocurre un evento. ¡Las aplicaciones con poco uso pueden costar cerca de $ 0!

3. Escalado extremo.

Dado que nuestro código se ejecuta en respuesta a un solo evento, el escalado se vuelve fácil. No hay simultaneidad, fragmentación ni recurso compartido en Lambda. Es una escala horizontal en el nivel más pequeño: el evento.

¿Cómo se ejecuta Lambda y cómo se escala?

Al crear una nueva función Lambda, lo principal que debemos hacer es:

  • seleccione el idioma (NodeJS es el predeterminado),
  • cargamos nuestro código.

Así es como se ve el controlador Lambda más simple:

exports.handler = async function(event, context) {
    return 'Hello world!'
}

return function ($event, $context) {
    return 'Hello world!';
}

Nota: Nos centraremos en el modelo de ejecución ahora mismo.


Una vez creada la función, no se está ejecutando nada.

Lambda ejecuta nuestro código bajo demanda, es decir, solo cuando hay un evento que manejar.

Repasemos lo que sucede cuando comienzan a llegar eventos, por ejemplo, solicitudes HTTP.


En la representación de arriba, la flecha verde representa el evento. Tan pronto como llega, Lambda inicia una nueva instancia (la barra gris). Nuestro código (la barra azul) se ejecuta dentro de la instancia.

Las instancias de Lambda son entornos Linux simples (que ejecutan Amazon Linux). Estas instancias son como contenedores Docker, excepto que usan una tecnología diferente. Cada función de Lambda tiene sus propias instancias: no compartimos el entorno Linux con otros clientes ni con nuestras otras funciones.

Recuerde: si bien es interesante conocer esos detalles técnicos, no tenemos ningún control sobre el medio ambiente. El trabajo de AWS es ejecutar, mantener y escalar estas instancias, así como el entorno Linux.

Volviendo a nuestro escenario: es posible que haya notado que mientras nuestro código (en azul) finalizó, la instancia de Lambda (en gris) permaneció viva durante más tiempo.

Esto es para que la instancia de Lambda pueda manejar los siguientes eventos más rápido:

Como podemos ver arriba, el primer evento requirió una instancia para comenzar. Esto se denomina arranque en frío, que puede tardar unos 200 ms. El segundo evento fue manejado por una instancia cálida. Los arranques en frío (y cómo optimizarlos o evitarlos) son todo un tema. Puede leer más sobre ellos en este gran artículo que se mantiene actualizado a lo largo del tiempo.

AWS mantiene activas las instancias de Lambda siempre que haya eventos que manejar. Las instancias se eliminan después de 10 minutos de inactividad, es decir, 10 minutos sin un evento.

¿Qué sucede si hay otro evento o solicitud mientras la instancia en ejecución está ocupada? Otra instancia se iniciará sobre la marcha.


Una instancia de Lambda siempre manejará un evento a la vez.

El hecho de que cada evento se ejecute en completo aislamiento de las otras ejecuciones hace que sea realmente fácil de escalar: AWS iniciará nuevas instancias.


Por supuesto, si las instancias están disponibles (sin manejar eventos), se reutilizarán en su lugar, extendiendo el plazo para su eliminación:


Con el tiempo, nuestra aplicación puede reducirse a cero instancias si no hay eventos que manejar. Cualquier evento nuevo iniciará una nueva instancia nuevamente:


Costos

A diferencia del alojamiento tradicional, con Lambda pagamos en función de nuestro uso. Más precisamente, pagamos por la cantidad de invocaciones y el tiempo de ejecución de nuestro código.

Nosotros no pagaremos por el tiempo de inactividad entre eventos (la parte gris). Solo pagaremos cuando nuestro código se está ejecutando (parte azul).

Aquí tienes un cálculo muy sencillo para hacerte una idea:

Número de invocaciones (o solicitudes) por mes: 100000

Tiempo medio de ejecución por evento (ms): 200

Costo mensual esperado: $ 0.353

Nota:

  • El nivel gratuito se ignora por simplicidad.
  • Este es el costo de una Lambda bastante potente (configuración de 1024M). Las lambdas más lentas son hasta 8 veces más baratas.
  • No se incluyen los costes relacionados con otros servicios (por ejemplo, bases de datos, puntos finales HTTP públicos ...).

Se pueden encontrar más detalles en la página de precios de AWS Lambda.

¿Qué pasa entre eventos?

Nada.

AWS Lambda congela nuestro código tan pronto como terminamos de procesar un evento. No hay forma de ejecutar nada entre invocaciones. Es por eso que nuestro código debe estar enfocado en eventos. No podemos ejecutar un demonio ni ninguna tarea de larga duración.

Sin embargo, no se preocupe. Podemos aprovechar los servicios de AWS para abordar diferentes casos de uso, como trabajos asincrónicos, procesamiento de flujo de datos, observación de cargas de archivos, etc. Lambda no existe en el vacío y la creación de aplicaciones sin servidor se trata exactamente de eso: componer servicios.

AWS Lambda es solo una pieza del rompecabezas en las aplicaciones Serverless.