Introducción a Serverless y sus frameworks y ejemplo de Backend Serverless en AWS

TiEMPO DE LECTURA
7 minutos
Descubre qué es Serverless, los diferentes tipos de servicios Serverless y también los proveedores cloud que ofrecen este tipo de servicios.
July 12, 2022
Introducción a Serverless y sus frameworks y ejemplo de Backend Serverless en AWS

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).

Qué es Serverless?

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:

     
  1. Muchos proveedores de cloud tienen sus propios servicios Serverless. Por ejemplo en computación Serverless podemos encontrar: Amazon con AWS Lambda, Microsoft con Azure Functions, Google con GCP Cloud Functions e IBM con IBM Cloud Functions. Además, también encontramos a nuevos y conocidos proveedores apostando fuerte por estas tecnologías: Netlify con Netlify Functions, Serverless con Serverless cloud, Vercel con Vercel Functions o Cloudflare con Cloudflare Workers. En este blog post de Fauna podréis encontrar una comparativa interesante.
  2.  
  3. Servicios Serverless hay de muchos tipos, no solo de computación. Por ejemplo, S3 (el conocido servicio de AWS de gestión de objetos) se considera un servicio Serverless y dynamoDB (base de datos no relacional de AWS) también. La lista de Servicios serverless de AWS podéis encontrarla aquí.

Ejemplo de aplicación CRUD 100% Serverless en AWS

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).

Servicios Serverless de AWS necesarios

     
  1. API Gateway: Citando la documentación oficial, Amazon API Gateway es un servicio completamente administrado que facilita a los desarrolladores la creación, la publicación, el mantenimiento, el monitoreo y la protección de API a cualquier escala.
  2.  
  3. Lambda: Citando la documentación oficial, AWS Lambda es un servicio informático sin servidor y basado en eventos que le permite ejecutar código para prácticamente cualquier tipo de aplicación o servicio backend sin necesidad de aprovisionar o administrar servidores.
  4.  
  5. DynamoDB: Citando la documentación oficial, Amazon DynamoDB es una base de datos NoSQL de clave-valor sin servidor y completamente administrada que está diseñada para ejecutar aplicaciones de alto rendimiento a cualquier escala.

Combinando los diferentes servicios Serverless

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:

     
  •    (Paso 1) El usuario realiza una llamada HTTP con método GET a [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)  
  •  
  •    (Paso 2) Cuando la función Lambda es invocada, ya sea por una llamada HTTP u otro evento que la accione, el ambiente de ejecución de nuestra función Lambda es iniciado, el código se ejecuta. En el ejemplo, la función 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.  

Escalabilidad y otras ventajas de las funciones Lambda

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:

     
  • El proveedor cobra por el tiempo de ejecución del código. Por lo tanto interesan funciones pequeñas, con un único propósito y que se ejecuten rápido (ideal para microservicios).
  •  
  • Si no hay peticiones, no hay coste.
  •  
  • No hay que administrar servidores.

Utilizando un Framework para crear un Backend Serverless

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

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.

¿Por qué utilizar un Framework?

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:

     
  • ☁️Capa de abstracción para desarrollar, testear, desplegar y monitorizar servicios serverless como Lambda, API Gateway, DynamoDB y S3 de manera sencilla. Otros servicios equivalentes: AWS SAM (Serverless Application Model).
  •  
  • 💸Apps serverless autoescalables con monitoring, pipelines CI/CD y a bajo coste.
  •  
  • 👫Compatible con múltiples providers/clouds: Serverless hace deploys a AWS, Microsoft Azure, Google Cloud Platform, Apache OpenWhisk, Cloudflare Workers, Tencent, Alibaba o a soluciones basadas en Kubernetes como Kubeless. Más info aquí
  •  
  • 🚀Fácil de utilizar con curva de aprendizaje baja. Desarrolladores sin experiencia en servidores pueden subir aplicaciones escalables y listas para producción en poco tiempo.
  •  
  • 👀Infrastructure as a Code: un simple fichero YAML de configuración: serverless.yml
  •  
  • 📈Monitoring real-time de aplicaciones en un dashboard propio (conexión directa con Cloudwatch).
  •  
  • 🐞Tests de integración para funciones con endpoints HTTP. Los tests se definen en un fichero YAML serverless.test.yml y se ejecutan con serverless test https://www.serverless.com/blog/serverless-test-framework
  •  
  • ⚡️Miles de plugins gratuitos listos para utilizar. Los imprescindibles para Python:    
           
    • serverless-python-requirements: "A Serverless plugin to automatically bundle dependencies from requirements.txt and make them available in your PYTHONPATH."
    •      
    • serverless-domain-manager: "Create custom domain names that your lambda can deploy to with serverless. Allows for base path mapping when deploying and deletion of domain names." 
    •      
    • serverless-offline: "This Serverless plugin emulates AWS λ and API Gateway on your local machine to speed up your development cycles. To do so, it starts an HTTP server that handles the request's lifecycle like APIG does and invokes your handlers."
    •    
     
  •  
  • Gratuito (hasta 1 usuario) y compatible con la capa gratuita de AWS. Ver más info aquí

¿Cómo instalar Serverless Framework?

Instalar 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):

     
  1.    Crear cuenta en serverless.com (gratis)  
  2.  
  3.    Crear cuenta de AWS (gratis) en https://aws.amazon.com/es/  
  4.  
  5.    Crear IAM User en AWS y obtener tus credentials:        
  6. Cómo crear un IAM User: https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.htm
  7.  
  8.    Instalar AWS CLI v2 y configurarlo para utilizar el IAM User creado en el paso anterior.    # 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
       
  9. Para instalar en otros OS: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html Quickstart guide: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html
  10.  
  11.    Instalar node.js y npm. Descargar en https://nodejs.org/en/  

Crear proyecto con Serverless Framework

     
  1.    Una vez instalado, crea tu primer proyecto serverless ejecutando:    serverless
  2.  
  3.    Sigue los pasos del prompt (ver imagen a continuación), y ya está tu proyecto creado.  
  4. Ver ficheros creados en la carpeta estructura de ficheros en la carpeta. Lo más importante es: 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/

     

Demo - Crear una función Lambda con Serverless Framework

Figura 5. Nuestro servicio serverless, por el momento, solo hará el deploy de una función lambda.

     
  1.    Crear nuevo proyecto (si no lo has creado ya), siguiendo los pasos anteriores:    serverless
     
  2.  
  3.    Editar 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
       
  4. El código que podéis ver arriba tiene tres partes diferenciadas:
  5.    
           
    • Primero, se define el servicio, app y organización: Estos nombres son autorellenados cuando creamos nuestro proyecto y son la configuración de serverless.
    •      
    • Segundo, 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.
    •      
    • Tercero, 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.
    •      
    • Hay otras partes importantes, aunque no imprescindibles, dentro de un serverless.yml. En este link encontraréis la Serverless.yml Reference, con todas las posibles propiedades de este archivo.
    •    
     
  6.  
  7.    Hacer deploy de lambda a serverless y aws.    serverless deploy
       
  8. Una vez finalizado el deploy, podrás:
  9.    
           
    • Ver el resultado del deployment en el dashboard de app.serverless.com
    •      
    • Ver lo que serverless lanza por nosotros en aws cloudformation stack (no es necesario saber los detalles, pero sí que serverless utiliza cloudformation "under the hood".
    •      
    • Ver lambda function creada en aws y testear directamente en la consola de aws.
    •    
     

Demo 2 - API Serverless: Lambda + API Gateway

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:

     
  •    Ver API Endpoint en app.serverless.com y copiarlo. Estará en la pestaña "API Endpoints" dentro de la aplicación lanzada.
  •  
  •    Hacer una llamada al endpoint de la API con Postman/curl, o simplemente accediendo con el navegador a la URL. Deberíais ver el resultado (response) de vuestra lambda (del handler.py):     {
       "message": "Go Serverless v3.0! Your function executed successfully!",
       "input": {...},
    }
     

Conclusiones

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!

Descargar Teaser
OTROS POSTS RELACIONADOS

Data Mesh Arquitecture

February 4, 2024
Descubre qué es la arquitectura Data Mesh, cuáles son los motivos que han llevado a la industria hacia esta nueva arquitectura y cuáles son sus principios básicos así como sus principales componentes.
Icono reloj
6 minutos

Introducción a Event-Driven Microservices Architecture en AWS

September 30, 2022
La arquitectura EDA está pensada para crear aplicaciones altamente escalables y consiste en lanzar diversos “eventos” para que otros componentes puedan reaccionar a ellos y procesarlos. Descubre por qué motivo se opta por esta arquitectura y las diferencias entre los monolitos y las arquitecturas de microservicios.
Icono reloj
6 minutos