Para que sirve el serverless framework


Traduccion en proceso

serveless

Introducción

El framework serverless es una excelente herramienta para gestionar todas tus funciones en la nube. Desde su página:

El Serverless Framework te ayuda a desarrollar y desplegar tus funciones de AWS Lambda, junto con los recursos de infraestructura de AWS que requieren. Es una CLI que ofrece estructura, automatización y mejores prácticas listas para usar, permitiéndote enfocarte en construir arquitecturas sofisticadas, impulsadas por eventos y sin servidor, compuestas por funciones y eventos.


Probemos el ejemplo en Go

Vamos a generar un proyecto con el framework serverless y ver todo lo que hace por nosotros.

mkdir foo && cd "$_" &&  serverless create -t aws-go
# OUTPUT:
# Serverless: Generating boilerplate...
#  _______                             __
# |   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
# |   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
# |____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
# |   |   |             The Serverless Application Framework
# |       |                           serverless.com, v1.36.1
#  -------'
#
# Serverless: Successfully generated boilerplate for template: "aws-go"
# Serverless: NOTE: Please update the "service" property in serverless.yml with your service name

Te tiré un poco de magia de la línea de comandos con el $_ (significa el primer parámetro del comando anterior).


¿Todo bien hasta acá, pero qué acaba de pasar? Inicializamos un proyecto del framework serverless con la plantilla aws-go (como ya habrás imaginado) el framework serverless puede manejar diferentes lenguajes y proveedores de nube. En este ejemplo elegimos AWS y Go (hay otra plantilla para Go llamada aws-go-dep que, como su nombre indica, usa dep para gestionar dependencias), pero suficiente charla.


Veamos los archivos

tree .
# OUTPUT:
# ├── hello
# │   └── main.go
# ├── Makefile
# ├── serverless.yml
# └── world
#     └── main.go
#
# 2 directories, 4 files

Tenemos un manifiesto serverless.yml, un Makefile (que podés usar para compilar tus funciones, validar errores de sintaxis o ejecutar en modo de prueba antes de subirlas a AWS, y que también será utilizado para compilarlas al desplegarlas).


El archivo del manifiesto indica muchas cosas, le agregaré comentarios al código

frameworkVersion: ">=1.28.0 <2.0.0"

provider:
  name: aws
  runtime: go1.x

# Archivos que deben incluirse y los que deben ser ignorados
package:
 exclude:
   - ./**
 include:
   - ./bin/**

# Las funciones y los manejadores (la definición real de la función en el código), y los eventos que luego se traducen en endpoints de API Gateway para tus funciones
functions:
  hello:
    handler: bin/hello
    events:
      - http:
          path: hello
          method: get
  world:
    handler: bin/world
    events:
      - http:
          path: world
          method: get

Veamos la función hello

package main

import (
    "bytes"
    "context"
    "encoding/json"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
)

// Response es de tipo APIGatewayProxyResponse ya que estamos aprovechando la
// funcionalidad de AWS Lambda Proxy Request (comportamiento por defecto)
//
// https://serverless.com/framework/docs/providers/aws/events/apigateway/#lambda-proxy-integration
type Response events.APIGatewayProxyResponse

// Handler es nuestro manejador lambda invocado por la llamada a `lambda.Start`
func Handler(ctx context.Context) (Response, error) {
    var buf bytes.Buffer

    body, err := json.Marshal(map[string]interface{}{
        "message": "¡Go Serverless v1.0! Tu función se ejecutó correctamente.",
    })
    if err != nil {
        return Response{StatusCode: 404}, err
    }
    json.HTMLEscape(&buf, body)

    resp := Response{
        StatusCode:      200,
        IsBase64Encoded: false,
        Body:            buf.String(),
        Headers: map[string]string{
            "Content-Type":           "application/json",
            "X-MyCompany-Func-Reply": "hello-handler",
        },
    }

    return resp, nil
}

func main() {
    lambda.Start(Handler)
}

Esta función simplemente devuelve un texto con algunos encabezados. Cada función Lambda requiere de lambda.Start con el nombre de tu función como punto de entrada, en este caso Handler. El context generalmente se utiliza para pasar datos entre llamadas o funciones. El resto del código es bastante directo: construye un objeto JSON y lo devuelve junto con algunos encabezados.


Vamos a desplegarlo
serverless deploy
# OUTPUT:
# Serverless: Packaging service...
# Serverless: Uploading CloudFormation file to S3...
# Serverless: Uploading artifacts...
# Serverless: Uploading service .zip file to S3 (10.88 MB)...
# Serverless: Validating template...
# Serverless: Updating Stack...
# Serverless: Checking Stack update progress...
# ............
# Serverless: Stack update finished...
# Service Information
# service: aws-go
# stage: dev
# region: us-east-1
# stack: aws-go-dev
# api keys:
#   None
# endpoints:
#   GET - https://cfr9zyw3r1.execute-api.us-east-1.amazonaws.com/dev/hello
#   GET - https://cfr9zyw3r1.execute-api.us-east-1.amazonaws.com/dev/world
# functions:
#   hello: aws-go-dev-hello
#   world: aws-go-dev-world
# layers:
#   None

Entonces, pasó mucho aquí: el comando deploy compiló nuestro binario, lo empaquetó, subió ese paquete a S3, creó un stack de CloudFormation, y después de que todo se completó, nos devolvió los endpoints que habíamos definido. Como ves, el framework nos permitió crear y desplegar una función (en realidad dos) muy fácilmente, simplificando totalmente el proceso de gestionar funciones y eventos.


Y lo probamos
curl -v https://cfr9zyw3r1.execute-api.us-east-1.amazonaws.com/dev/hello
# OUTPUT:
# *   Trying 99.84.27.2...
# ...
# {"message":"¡Go Serverless v1.0! Tu función se ejecutó correctamente."}%

Como era de esperar, podemos ver los encabezados x-my-company-func-reply y el objeto JSON que creó para nosotros.


Limpiar todo

serverless remove
# OUTPUT:
# Serverless: Removing Stack...
# Serverless: Checking Stack removal progress...
# ...............
# Serverless: Stack removal finished...

Esto, como esperabas, eliminará todo lo que se creó con el comando deploy.


En el próximo artículo vamos a explorar cómo crear y desplegar una función como esta manualmente.


Errata

Si encontrás algún error o tenés alguna sugerencia, por favor enviame un mensaje para que lo corrija.



No tienes cuenta? Regístrate aqui

Ya registrado? Iniciar sesión a tu cuenta ahora.

Iniciar session con GitHub
Iniciar sesion con Google
  • Comentarios

    Online: 0

Por favor inicie sesión para poder escribir comentarios.

by Gabriel Garrido