Nota: Podéis hacer este tutorial y seguir las Demos de manera totalmente gratuita creando vuestra cuenta de AWS y utilizando recursos de la capa gratuita. Como ejemplo, el primer millón de ejecuciones Lambda al mes son gratuitas (sí, al mes).
Serverless, que traducido significa sin servidor, es un tipo de arquitectura software donde los servidores (físicos o en la nube) no son gestionados por el desarrollador y las aplicaciones/código corren en ambientes de ejecución que administran los proveedores cloud como AWS, GCP, Azure o IBM, entre otros. También es posible crear vuestra propia arquitectura Serverless utilizando Docker/Kubernetes, con ejemplos como OpenFaas o Knative. Podríamos decir que Serverless es la capa de abstracción más alta en la nube, dónde el usuario se centra en escribir y subir funciones en lenguajes python, node.js, go... Sin preocuparse de cómo ese código va a ser lanzado en, por ejemplo, una instancia EC2 o en un container de docker. Esa última parte es administrada por el proveedor.
Cómo podríais intuir, Serverless no significa que no haya servidores (el código/aplicación tiene que correr en un servidor), sino más bien que la gestión, la escalabilidad, el mantenimiento, la ejecución y la disponibilidad de los mismos es mayormente gestionada por el proveedor del servicio y solo disponible durante el tiempo que es necesario, pudiéndote centrar en desarrollar tu aplicación o en definir el mejor modelo de tu base de datos sin preocuparte si el servidor está disponible 24/7 o tiene actualizada la última versión del sistema operativo.
Si bien Lambda de Amazon Web Services (AWS) es probablemente el servicio Serverless más conocido, hay que tener en cuenta dos detalles importantes:
Vamos a ver un ejemplo backend utilizando una combinación de servicios Serverless que nos permita crear, editar, leer y eliminar productos de una base de datos (una CRUD application).
En la siguiente figura podemos ver cómo combinamos los servicios comentados anteriormente.
Figura 1. Ejemplo serverless sencillo utilizando los servicios API Gateway + Lambda + DynamoDB. Los tres servicios son servicios serverless, si bien lambda y los demás servicios también pueden comunicarse con cualquier servicio interno o externo, sea serverless o no (p. ej. Lambda con RDS, o API Gateway con una instancia EC2)
El funcionamiento es el siguiente:
[api.ejemplo.com/products](<http://api.ejemplo.com/products>)
, dónde api.ejemplo.com
es el registro DNS que apunta a nuestra API Gateway, y /products
es la ruta de nuestro API Gateway. La ruta /products está asociada a una acción, en este caso, invocar una función Lambda (Paso 2) get_products()
llamará a la base de datos DynamoDB mediante una llamada HTTP para obtener los productos (Paso 3). Una vez recibidos los productos la función Lambda devolverá la respuesta al usuario (Paso 4) e inmediatamente después de retornar la respuesta, la función lambda se cerrará (el ambiente de ejecución se eliminará*). Por lo tanto, solo pagamos por el tiempo de ejecución de nuestra función. Aquí podemos ver una gran diferencia con un servidor “normal”: en este caso la Lambda solo está corriendo cuando se la invoca y no 24/7. * Siendo puristas, la lambda quedará “cacheada” durante unos minutos, lo cual le permite ejecutarse más rápido en una siguiente invocación. Si la función es invocada mil veces, el proveedor se encarga de escalar y generar el número de ambientes necesarios para responder a las mil invocaciones. P.ej. Digamos que tenemos 3 usuarios pidiendo los productos (haciendo un GET a la misma ruta) al mismo tiempo → Se lanzarán 3 funciones lambdas con el mismo código (ver figura debajo) automáticamente, de forma concurrente.
Figura 2. Ejemplo con 3 usuarios llamando a la misma ruta. API Gateway lanzará una nueva lambda por cada llamada. De esta manera podemos ejecutar de forma concurrente miles de llamadas por segundo.
Otras ventajas de utilizar Lambda en vez de un servidor convencional son:
Si bien podemos crear el ejemplo anterior utilizando la consola de AWS de manera totalmente gratuita (ver nota al principio de este blog post para más detalle), es mejor práctica utilizar archivos de configuración que nos permitan replicar y mantener esta infraestructura de manera sencilla. Los llamados IaC (Infrastructure as Code) nos simplifican esta faena. Algunas opciones de IaC específicos para aplicaciones serverless son Serverless Framework, AWS SAM o AWS CDK.
Serverless Framework pertenece a la empresa "Serverless, Inc" (nombre muy bien buscado) y es una herramienta que permite desarrollar, testear, desplegar y monitorizar aplicaciones serverless escalables y de pago por ejecución en cualquier nube (AWS, Azure, Google Cloud, ...) de manera sencilla utilizando ficheros de configuración YAML (.yml). Serverless (la empresa) son AWS Technology Partners y tienen una integración muy buena con esta plataforma cloud.
Vamos a ver las diferencias entre usar un framework o no usarlo. En este caso vamos a utilizar Serverless Framework, si bien las ventajas son más o menos equivalentes a otro Framework como SAM.
Sin Serverless Framework:
Figura 3. Ejemplo de los pasos a realizar por el desarrollador para lanzar la aplicación serverless de la figura 1 sin utilizar serverless framework.
Con Serverless Framework:
Figura 4. Ejemplo de los pasos a realizar por el desarrollador para lanzar la aplicación serverless de la figura 1 utilizando serverless framework.
En la Figura 3, podemos ver los pasos que tenemos que realizar en la consola de AWS, manualmente, para poder crear el servicio de ejemplo. En la Figura 4, podemos ver los pasos a realizar cuando utilizamos Serverless Framework. La gran diferencia es, que en el primer caso, vamos a realizar un trabajo manual no replicable cuando tengamos que hacer una segunda función lambda, por lo tanto no es escalable ni mantenible con el tiempo. Si bien recomiendo hacer este proceso para probar todas las posibilidades, es solamente aplicable para pruebas y MVPs. En el segundo caso, acabamos el proceso con un fichero yml que contiene toda la configuración necesaria para poder replicar, extender y entender la infraestructura serverless.
Otras ventajas específicas a Serverless Framework son:
serverless test
https://www.serverless.com/blog/serverless-test-frameworkInstalar serverless framework es tan sencillo como abrir el terminal y escribir el comando:
npm install -g serverless
Si bien hay unos Requerimientos previos (aws CLI v2 + node.js + npm):
# aws CLI macOS installation
curl "<https://awscli.amazonaws.com/AWSCLIV2.pkg>" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
# verify installation
which aws
# /usr/local/bin/aws
aws --version
# aws-cli/2.0.5 Python/3.7.4 Darwin/19.4.0 botocore/2.0.0dev9
# configure aws CLI with IAM user
aws configure
serverless
handler.py
(dónde reside el código de la Lambda) y serverless.yml
(archivo de configuración). Como veréis, ya tenéis un código de ejemplo listo para usar. No hace falta que modifiquéis nada por ahora. Más detalles en https://www.serverless.com/framework/docs/getting-started/
Figura 5. Nuestro servicio serverless, por el momento, solo hará el deploy de una función lambda.
serverless
serverless.yml
creado por defecto; descomentar stage
and region
y cambiar region
por eu-west-1
(Ireland) o la región de tu preferencia. El serverless.yml tiene que quedar como a continuación: # serverless.yml
service: serverless-demo
# app and org for use with dashboard.serverless.com
app: serverless-demo
org: myorg # change this with your org
provider:
name: aws
runtime: python3.8
# add stage and ireland region
stage: dev
region: eu-west-1
functions:
hello:
handler: handler.hello
provider
. Aquí definimos el proveedor, el lenguaje de programación, el nombre del stage (por defecto: dev, qa, prod) y la región de aws que estamos utilizando.functions
. Aquí definimos las funciones lambda que vamos a utilizar. El nombre de la función hello
puede ser el que queramos. El handler
nos dice dónde está la función handler. serverless deploy
Figura 6. Añadimos API Gateway al servicio de la Figura 5 para invocar a la función lambda.
Del apartado anterior tenemos nuestra función Lambda funcionando, pero le falta un trigger, algo que la "invoque". La invocación vendrá de una llamada a API Gateway. Vamos a añadir un API Gateway Endpoint a la función Lambda:
# serverless.yml
service: serverless-demo
# app and org for use with dashboard.serverless.com
app: serverless-demo
org: myorg # change this with your org
functions:
hello:
handler: handler.hello
# add http endpoint using API Gateway
events:
- http:
path: /
method: get
Vamos a lanzarlo de nuevo:
serverless deploy
Una vez finalizado el deploy:
handler.py
): {
"message": "Go Serverless v3.0! Your function executed successfully!",
"input": {...},
}
En este blog post hemos podido aprender qué es Serverless, los diferentes tipos de servicios Serverless y también los proveedores cloud que ofrecen este tipo de servicios. Después hemos visto una aplicación real de estos servicios en 2 demos utilizando serverless framework. En futuras entradas del blog veremos temas más avanzados como la comunicación entre servicios Serverless, cómo crear microservicios Serverless y cuáles son los patrones de diseño más interesantes a la hora de diseñar nuestra arquitectura en la nube. Stay Tuned!