Para que sirve el serverless framework
- 8 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.