Llevo tiempo utilizando AWS Lambda pero en su mayoría con Node.js y Python, la verdad quize hacer un experimento para ver cuales eran las ventajas de utilizar una función en un lenguaje que genera un archivo binario como Go.
Este es el proceso básico para crear una función de AWS Lambda con el lenguaje Go.
Primero hay que crear la función dentro de consola y hay que asegurarnos de cambiar el handler
a main
:
Para estas funciones, no es posible utilizar el editor de texto en la consola de AWS, por lo tanto es necesario crear la función en la computadora donde estamos trabajando, compilarla y subirla.
Empezamos creando el directorio:
mkdir test-go
cd test-go
Luego generamos el archivo go.mod
y descargamos las dependencias requeridas para la función:
go mod init test-go
go get github.com/aws/aws-lambda-go/lambda
Y creamos el archivo main.go
con el siguiente código:
package main
import (
"context"
"fmt"
"github.com/aws/aws-lambda-go/lambda"
)
type MyEvent struct {
Name string `json:"name"`
}
type Response struct {
StatusCode int `json:"statusCode"`
Headers map[string]string `json:"headers"`
Body string `json:"body"`
}
func Handler(ctx context.Context, event MyEvent) (Response, error) {
return Response{
StatusCode: 200,
Headers: map[string]string{"Content-Type": "application/json"},
Body: fmt.Sprintf("Hello %s!", event.Name),
},
nil
}
func main() {
lambda.Start(Handler)
}
Lo que el código anterior hace, es obtener el evento y regresar un json
con el name
que fue enviado a la función.
Luego compilamos para AWS Lambda, comprimimos el archivo generado, y subimos el archivo comprimido a la lambda:
GOOS=linux GOARCH=amd64 go build -o main main.go
zip main.zip main
aws lambda update-function-code --function-name test-go --zip-file fileb://main.zip
Invocamos la función desde la terminal y revisamos el resultado:
aws lambda invoke --function-name test-go --cli-binary-format raw-in-base64-out --payload '{ "name": "World" }' response.json
cat response.json
Este es el template básico de una función de AWS Lambda utilizando Go.
* Fuente: https://docs.aws.amazon.com/lambda/latest/dg/golang-handler.html