Para que sirve el serverless framework
- 9 serverless
- 14 golang
Traduccion en proceso
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.
-
Comentarios
Online: 0
Por favor inicie sesión para poder escribir comentarios.