Creando una API rest serverless con zeit.co

September 24, 2019

...

Las api rest ya llevan bastante tiempo en el mercado y compiten directamente con GraphQL. Lo bueno es que son muy sencillas de montar con unas pocas líneas de código a diferencia de GraphQL. Ambos tienen beneficios y desventajas aunque principalmente orientadas a la curva de aprendizaje y también a como configurar nuestro servidor para que sea sencillo agregar más funcionalidades. En este post vamos a ver como construir una api rest completamente serverless. Y lo mejor de todo completamente gratis y sin tarjetas de crédito.

Que es serverless?

Partiremos esta sección explicando lo diametralmente opuesto, la arquitectura tradicional contempla servidores que van de cara a nosotros. Esto quiere decir que tenemos acceso directo a los servidores donde debemos necesariamente administrarlos. Con administrarlos me refiero a instalar un sistema operativo en él, gestionar el trafico de red y balancear la carga entre distintos servidores. Además, en el caso de que nos estemos quedando cortos deberemos aumentar la cantidad de servidores que tenemos en nuestro cluster de servidores y, en el caso de que baje la demanda, deberemos también disminuir la cantidad de servidores para que nuestros costos no se disparen. Todas estas tareas deben ser realizadas por una persona experta en el tema y puede ser considerado un trabajo tiempo completo o parcial dependiendo de la escala de la empresa.

Por contraparte tenemos la arquitectura serverless. Donde la administración de los servidores es transparente para el cliente, esto quiere decir que nosotros jamás veremos el sistema operativo, balanceadores de carga y escalamiento dependiendo de la capacidad de procesamiento que tengamos, de esto y mucho más se encargará nuestro proveedor del servicio.

Las funciones serverless funcionan de la siguiente manera:

  • Creas un archivo con tu código, en este caso, javascript
  • Lo subes a la nube del proveedor.
  • Cuando alguien llame a tu función, el proveedor la cargará en la memoria de sus servidores y la ejecutará. (Ejecución en frío)
  • Cuando se vuelva a llamar a esta función y aún se encuentre en memoria no será necesario que la vuelva a cargar por lo que la ejecutará inmediatamente (ejecución en caliente).
  • Luego de que pase un tiempo sin ser llamada, esta función será eliminada de la memoria por lo que, si vuelve a llamarse después de este paso, se deberá volver a cargar esta función antes de ejecutarse (ejecución en frío).

La ejecución en frío toma más tiempo que la ejecución en caliente, dependiendo del proveedor puede tomar incluso más de 10 segundos, sin embargo los proveedores están trabajando en esto mismo para mejorar los tiempos ya que cada vez se demoran menos y menos en ejecutar las funciones en frío, sin embargo nosotros deberíamos intentar de mantener lo máximo posible esta memoria en caliente para que la ejecución se mantenga rápida.

Esto también representa un ahorro en los costos de operación ya que estamos compartiendo el procesamiento entre varias máquinas y también entre varios proveedores. Para esto voy a poner un ejemplo para que se hagan una idea de porque por lo general es más barato:

Supongamos que nuestra aplicación es utilizada de 9 a 5, que es cuando la mayoría de la gente se encuentra trabajando. Lo que quiere decir que de 5 hasta las 9 del otro día tenemos servidores que no se están aprovechando, por lo que podríamos arrendar esa capacidad de procesamiento para abaratar los costos de mantención. Paf! nació FaaS.

Existen muchos proveedores de FaaS en el mercado pero nosotros nos vamos a centrar en zeit.co por dos razones:

  • No necesita tarjeta de crédito para proyectos pequeños
  • Si crecemos, el precio empieza desde 1 dólar.

Nuestro proveedor

zeit.co es un proveedor que nos permite generar despliegues de nuestra aplicación sin ninguna configuración (pero nosotros agregaremos una pequeña... si haremos un poco de trampa) y podemos montar servicios en un ambiente completamente serverless, a sea, sin gestionar ni configurar servidores.

Lo primero es crearte una cuenta y tranquilo, no necesitas tarjeta de crédito: zeit.co

Una vez que te hayas creado una cuenta vamos a crear nuestro proyecto:

$ mkdir miproyecto
$ cd miproyecto

Luego de eso vamos a crear nuestro pequeño archivo de configuración now.json y explicaremos de que se trata:

{
  "version": 2,
  "name": "serverless",
  "routes": [
    { "src": "/api/(.*)", "dest": "/api/index.js" }
  ]
}

version tenemos que indicarlo porque actualmente existen 2 versiones, la 1 (Chan!) y la 2. name será el nombre que le indicaremos a nuestra aplicación routes es donde viene la magia, vamos a redirigir todo el trafico que caiga en la ruta /api/(.*) al archivo /api/index.js de manera de que nuestra función este en caliente lo máximo posible.

Luego de eso podemos crear nuestro archivo package.json, por lo que iremos a la consola y ejecutaremos lo siguiente:

$ npm init -y

Esta línea nos creará un archivo package.json que contendrá el nombre y otras partes relevantes a nuestra aplicación, nosotros vamos a tenerlo para poder agregar dependencias a el, si no lo creamos no podremos agregar dependencias y que estas sean instaladas en los servidores de zeit.co

Luego de eso agregaremos express:

$ npm i -S express

Express nos permitirá poder manejar de manera sencilla todas las rutas que caigan en nuestra función, recuerden que estamos redirigiendo todo el tráfico de nuestra aplicación a un único archivo, no se preocupen que luego vamos a organizarlo mejor.

Ahora debemos crear nuestra función, primero lo haremos sin express para que vean como deben crearse estas funciones:

module.exports = (req, res) => {
 res.send('Hola mundo!')
}

Como pueden ver, las funciones que creemos para zeit.co tienen el mismo formato que una función que se entrega como segundo argumento a una ruta creada con express:

const express = require('express')
const app = express()

app.get('*', (req, res) => {
  res.send('hola mundo!')
})

app.listen(3000)

Sin embargo no es necesario que nosotros creemos el servidor ya que https://zeit.co lo hará por nosotros. Por lo que nuestro archivo de /api/index.js puede tener la siguiente forma:

const express = require('express')
const app = express()

app.get('*', (req, res) => {
  res.send('Hola mundo!')
})

module.exports = app

Y eso es todo!, ahora vamos a crear tres rutas:

const express = require('express')
const app = express()

app.get('/', (req, res) => {
  res.send('Hola mundo')
})

app.get('/usuarios', (req, res) => {
  res.send([{ id: 1, name: 'chanchito feliz' }])
})

app.get('/productos', (req, res) => {
  res.send([{ id: 1, name: 'nintendo' }])
})

module.exports = app

Ahora cuando ingresemos a la ruta de nuestra aplicación podremos ingresar también a /usuarios y /productos. Cada una nos devolverá los respectivos objetos mientras que la raíz nos devolverá el storing de hola mundo.

Ahora podemos instalar el cli de zeit.co:

$ npm i -g now

Luego de que lo instalamos de manera global ya podremos probar nuestra aplicación:

$ now dev

Si todo salió bien, podrán ingresar a la ruta http://localhost:3000 y podrán ver los archivos que se están compartiendo, ahí pueden ingresar a la carpeta de api y verán el string hola mundo. Si además modifican la URL a http://localhost:3000/usuarios podrán ver a chanchito feliz y si ingresan a http://localhost:3000/productos podrán ver nintendo.

Ahora nos toca desplegar nuestra aplicación a nuestro ambiente de producción! Y esta es quizás la parte más emocionante:

$ now

Y listo! Esperamos un poco y nuestra función estará en un ambiente de producción donde la podremos llamar.

Recapitulamos

  • Vimos como crear una api rest utilizando express y zeit.co
  • Vimos los cambios necesarios para hacer que nuestra aplicación funcione en zeit.co
  • Creamos 3 rutas
  • Vimos como probar nuestro desarrollo con now dev
  • Desplegamos a producción en una línea con el comando now

Espero que este post te haya gustado, puedes suscribirte en la cajita más abajo, recuerda seguirme en youtube y en twitter, los links más abajo en el párrafo donde sale mi foto.


Suscríbete

Suscríbete a la lista para más cursos, posts y videos tutoriales. Prometo no enviarte más de un correo semanal 🙏

Creado por Nicolás Schürmann ingeniero e instructor de software. Cuando no está programando, esta frente a una cámara dictando cursos, creyéndose youtuber o apoyando a sus alumnos. Puedes seguirlo en twitter o también suscribirte a su canal de youtube. Considera comprar sus cursos por este medio y así apoyas al instructor.