Este tutorial esta muy interesante ya que la nueva corriente de implementacion es el uso de serverless por encima de la corriente anterior de microservicios. La base de una aplicación serverless es la de tener una aplicación corriendo sin el problema de escalamiento que empuja una aplciación de producción moderna.
Una aplicación serverless aprovecha los servicios de FaaS (Framework as a Service) en un esquema de pago por ejecución con funciones basadas en eventos.
El tutorial se enfoca en el desarrollo de una aplicación serverless que recopile los registros de gatos. Se llamará Catfacts (juego en la empresa de automoviles carfacts).
Bootstrapping
Primero usamos NPM para instalar el framework original de serverless, npm install -g severless
con este proyecto hara un deployment de S3 buckets y roles IAM.
$ serverless create
--template aws-python3
--name catfacts
Esto general la estructura del proyecto y puedes obtener una lista completa de los proyectos disponibles ejecutando serverless create --help
la opción name pero si no lo provees tu proyecto tendrá el nombre aws-python3 lo cual no sera de mucha ayuda.
$ serverless deploy --stage dev
Esto empujará tu proyecto a producción con un hola mundo en una función de Python. Espera un momento para la formación de nube (CloudFormation) para que construya tu aplicación y podamos agregar código personalizado.
Configurando el proyecto
Ahora necesitamos llenar un archivo de configuración con información real sobre nuestro proyecto. Que funciones tendrán? Y que endpoints HTTP estarán disponibles? Que estará incluido en el paquete?
# serverless.yml
service: catfacts
# lock us to a pre-2.0 (not yet released) version of the serverless framework to protect us from breaking changes
frameworkVersion: ">=1.16.0 <2.0.0"
# pick our language and provider, this is automatically filled in by the template
provider:
name: aws
runtime: python3.6
package:
include:
- common/**
- show.py
- catfacts.json
exclude:
- requirements.txt
- serverless.yml
- README.md
- LICENSE.txt
# now the good stuff: we can define our functions here
functions:
show:
# the "show" part of show.handler is the file,
# and "handler" indicates the function
handler: show.handler
events:
- http:
# instead of / you can define any HTTP path you like
# since we just have one endpoint I used /
path: /
method: get
Con esto marcado, veras que necesitamos tener un archivo show.py con unas funciones de tipo handlers. Las obtendremos inmediatamente despues de escribir nuestro codigo para las librerias.
Escribiendo el codigo compartido
En esta aplicacion no tendremos muchas funciones, pero eso no es necesariamente realidad para una aplicacion real. Tendras codigo compartido: todos necesitan codigo base para manejar conexion a la base de datos, conversiones de tipos, etc. Escribamos el codigo compartido que todos necesitaremos. En esta ocacion todas nuestras aplicaciones deberan leer hechos de nuestros gatos, desde un archivo JSON, aqui te mostramos un ejemplo:
[
"The average cat is 70% fluff",
"When a cat rubs itself against your leg, it is releasing a pheremone to assert its ownership of you to other cats."
]
El formato es una sencilla lista de JSON. Ponlo en el directorio de componentes llamado facts para que sea incluido en la ejecucion de las funciones y componentes.
import json
import os
here = os.path.dirname(os.path.realpath(__file__))
def all_facts():
with open(os.path.join(here, '../catfacts.json')) as fact_file:
facts = json.load(fact_file)
return facts
En el archivo show.py podemos llamarlo y seleccionar un hecho para enviarlo al usuario.
import json
import logging
import random
log = logging.getLogger()
log.setLevel(logging.DEBUG)
# import the shared library, now anything in common/ can be referenced as
# `common.something`
import common
def handler(event, context):
log.debug("Received event {}".format(json.dumps(event)))
fact = random.choice(common.all_facts())
return {
'statusCode': 200,
'body': json.dumps({'random_fact': fact})
}
Primer implementación
Felicidades! Tienes lo mas basico que puedes usar, ahora podemos enviarlo al internet. Serverless tienen una interfaz de linea de comando interactiva para poner código, llamado serverless deploy.
$ serverless deploy
Serverless: Packaging service...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (15 KB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
..............
Serverless: Stack update finished...
Service Information
service: catfacts
stage: dev
region: us-east-1
api keys:
None
endpoints:
GET - https://2s75j3z966.execute-api.us-east-1.amazonaws.com/dev/show
functions:
show: catfacts-dev-show
Ahora que la aplicacion catfacts-py esta activa podras copiar el vinculo de API de la pasarela en tu navegador o usar curl para probarla en la linea de comando. Veras algo como esto
# you'll have to replace 2s75.... to match your deployment URL
$ curl https://2s75j3z966.execute-api.us-east-1.amazonaws.com/dev/
{"random_fact": "The average cat is 70% fluff"}
Gracias por leer este tutorial, espero que te haya dado una introduccion, el tutorial original aun sigue, si quieres revisarlo ve a este vinculo:
https://serverlesscode.com/post/python-3-on-serverless-framework/