Serverless (FaaS)
Serverless es una nueva tendencia en el despliegue de aplicaciones que cada día adquiere más fuerza. En este post vamos a ver qué es, cómo funciona y cuál es la relación entre Serverless y FaaS (Functions as a Service).
La forma tradicional de desplegar aplicaciones es alquilar un servidor (p.e. una máquina virtual de AWS EC2) o un contenedor (p.e. Heroku) y pagar por horas o meses por tener nuestra aplicación disponible.
Una desventaja de este modelo es el desperdicio de recursos: si nuestra aplicación no está recibiendo tráfico o ejecutando alguna tarea estamos pagando por recursos que no están siendo utilizados.
Otra desventaja es que si recibimos un pico de tráfico o de tareas vamos a tener que reaccionar para incrementar la capacidad o configurar alguna forma de escalamiento automático.
Serverless elimina estas desventajas. Por un lado, sólo pagamos por el tráfico o las tareas que ejecutemos y, por otro lado, el proveedor se encarga de escalar automáticamente la infraestructura a medida que incrementa el tráfico.
¿Qué es?
Serverless (“sin servidor” en Español) es un concepto muy amplio y un poco confuso, porque no es que no haya necesidad de un servidor, es que nosotros no vamos a mantener esos servidores, alguien más lo va a hacer por nosotros.
Bajo esa definición servicios como Heroku, Firebase, S3 (el servicio de almacenamiento de AWS) o cualquier servicio de cómputo o almacenamiento donde no tengamos que mantener un servidor se podría considerar Serverless.
Dentro del mundo Serverless existen las funciones como servicio (en Inglés Functions as a Service o FaaS), que permiten ejecutar código (funciones) en la nube sin necesidad de mantener un servidor. En este post hablaremos principalmente de FaaS.
FaaS (Functions as a Service) empezó a ser popularizado en 2014 con el lanzamiento de AWS Lambda, un servicio de cómputo basado en eventos utilizando funciones en la nube. En los siguientes años Google, Microsoft, IBM y otros lanzaron soluciones similares.
¿Cómo funciona?
La idea de FaaS es simple:
- Escribimos una función en alguno de los lenguaje de programación que soporte el proveedor que vayamos a utilizar (p.e. AWS Lambda, Vercel, Netlify, etc.).
- Subimos nuestra función al proveedor.
- En algunos proveedores (p.e. AWS Lambda) es necesario configurar un evento que va a disparar la función (p.e. una petición HTTP, la recepción de un email, almacenamiento en S3, etc.). En otros proveedores la única forma de invocar la función es a través de HTTP.
Y eso es todo, cada vez que ocurra el evento se va a ejecutar la función.
Por debajo, las soluciones FaaS hacen uso de contenedores para ejecutar las funciones.
Casos de uso
FaaS es ideal para casos de uso como:
- El backend de aplicaciones.
- Tareas cortas esporádicas como envíos de correo, procesamiento de imágenes, generación dinámica de archivos, etc.
- Recepción y procesamiento de datos de dispositivos IoT.
- Webhooks. Reaccionar ante eventos que ocurren en otras aplicaciones o servicios.
- Creación de bots (de Slack o conversacionales).
- … entre otros!
Limitaciones y desventajas
Antes de empezar con FaaS debes tener en cuenta que existen algunas limitaciones y desventajas de usar esta tecnología:
- Tiempo máximo de ejecución. La mayoría de soluciones FaaS no están diseñadas para tareas que tomen más de unos minutos.
- Concurrencia. Existen límites en el número de ejecuciones concurrentes de una función. Por ejemplo, AWS Lambda tiene un límite de 1000 ejecuciones concurrentes por defecto que se pueden incrementar a decenas de miles a través de una solicitud.
- Capacidad de disco y memoria RAM. Depende del proveedor.
- Tamaño de la función. Depende del proveedor.
- Tamaño máximo de la petición y la respuesta. Depende del proveedor pero no está hecho para recibir archivos grandes (máximo algunos megabytes).
- Número máximo de funciones desplegadas. Depende del proveedor.
- Seguridad. Dependemos del proveedor para evitar ataques que generen costos para nosotros.
- Precio. Generalmente se cobra por número de ejecuciones y/o tiempo de procesamiento, así que es necesario estimar estos valores para cada caso y cada proveedor.
El último punto es particularmente importante porque el precio varía entre proveedores y está cambiando constantemente. La capa gratuita de AWS Lambda es particularmente generosa al momento de escribir este post: 1 millón de ejecuciones y hasta 3.2 millones de segundos de ejecución al mes (dependiendo de la cantidad de memoria que se le asigne a cada función), pero es importante revisar los costos y compararlos con otras soluciones.
Cómo empezar
Existen varios proveedores de FaaS. El más popular es AWS Lambda pero no es el más fácil para empezar. Incluso muchas empresas utilizan Serverless Framework para desplegar sus funciones a AWS Lambda y otros proveedores como Microsoft Azure, Google Cloud Platform, entre otros.
Existen otros proveedores más pequeños, como Vercel y Netlify, que ofrecen alternativas más simples y fáciles de empezar. Para este ejemplo vamos a utilizar Vercel.
El primer paso es crear una cuenta en Vercel, puedes hacerlo utilizando email y contraseña o puedes utilizar Github como método de autenticación.
El siguiente paso es crear una carpeta llamada ejemplo-faas
, una subcarpeta llamada api
(por defecto Vercel toma las funciones de esta carpeta) y un archivo llamado index.js
:
$ mkdir ejemplo-faas
$ cd ejemplo-faas
$ mkdir api
$ cd api
$ touch index.js
Abre el proyecto en tu editor preferido y agrega el siguiente contenido al archivo index.js
:
export default function handler(req, res) {
res.status(200).end("Hello!")
}
Guarda el archivo, inicializa el repositorio de Git y crea un commit:
$ git init
$ git add .
$ git commit -m 'Versión Inicial'
Crea un repositorio en Github y hazle push con los siguientes comandos (también los vas a encontrar en las instrucciones del repositorio que crees en Github):
$ git remote add origin <url_al_repo>
$ git branch -M main
$ git push -u origin main
Vuelve a Vercel y agrega un nuevo proyecto desde el Dashboard:
El Dashboard de Vercel al momento de escribir este post. Puede que cambie pero debe existir la opción de crear un nuevo proyecto.
Selecciona el repostorio que acabaste de crear y sigue las instrucciones para desplegarlo:
Selección de proyecto en Vercel. Busca el proyecto de Github que creaste e impórtalo como muestra la flecha roja.
En Vercel, en la página del proyecto, vas a encontrar la URL de la aplicación para probar tu función, recuerda agregar api/index
al final de la URL para probar la función que creamos. Deberías ver el siguiente resultado:
Resultado del llamado a la función desde el navegador.
¡Felicitaciones, acabas de desplegar tu primera función en la nube! No parece muy diferente a desplegar una aplicación Web normal, pero la diferencia es que sólo vas a pagar por el uso real de tu aplicación y no necesitas preocuparte por la escalabilidad (aunque es bueno estar pendiente de los costos).
Descarga gratis el e-book
Conoce la mentalidad, los roles y las tecnologías que debes saber para convertirte en desarrollador Web.
Descargar e-book