3 Aplicaciones servrerless en Python

in #programming6 years ago (edited)


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/