Funciones Serverless en Go: AWS Lambda de la A a la Z
La arquitectura serverless se ha convertido en el estándar de facto para crear aplicaciones escalables y rentables en la nube. AWS Lambda es uno de los servicios más populares para ejecutar código sin administrar servidores. En este artículo, analizaremos cómo crear, configurar y desplegar funciones serverless en Go (Golang) en AWS Lambda, desde lo más básico hasta técnicas avanzadas.
¿Por qué Go para AWS Lambda?
Go es el lenguaje ideal para funciones serverless. Se compila en un único archivo binario, tiene un tiempo de arranque en frío mínimo (a menudo menos de 100 ms) y un bajo consumo de memoria. Esto lo convierte en una de las opciones más rápidas y económicas para Lambda.
- Inicio rápido: El binario compilado se ejecuta instantáneamente.
- Bajo costo: El consumo mínimo de recursos reduce las facturas de la nube.
- Simplicidad de despliegue: Un solo archivo, sin dependencias del lado del servidor.
- Excelente integración: Soporte nativo de AWS SDK para Go.
Configuración del entorno y primer Handler
Antes de escribir código, asegúrese de tener instalado:
- Go versión 1.19+
- Utilidad AWS CLI (configurada con claves de acceso)
- Make o cualquier sistema de compilación (opcional)
Cree un nuevo módulo e instale el paquete oficial para Lambda:
mkdir my-lambda-functioncd my-lambda-functiongo mod init my-lambda-functiongo get github.com/aws/aws-lambda-go/lambdaAhora escribamos una función muy simple que devuelve un saludo:
package main
import ( "context" "github.com/aws/aws-lambda-go/lambda")
type MyEvent struct { Name string `json:"name"`}
type MyResponse struct { Message string `json:"message"`}
func HandleRequest(ctx context.Context, event MyEvent) (MyResponse, error) { if event.Name == "" { event.Name = "Invitado" } return MyResponse{Message: "¡Hola, " + event.Name + "!"}, nil}
func main() { lambda.Start(HandleRequest)}Este código recibe un JSON con el campo name y devuelve un saludo personalizado. Tenga en cuenta: la función debe ser exportable (con mayúscula inicial) y la firma debe coincidir estrictamente con las expectativas del runtime.
Compilación y despliegue en AWS Lambda
Para un binario compatible con Linux (que es lo que espera Lambda), use la compilación cruzada:
GOOS=linux GOARCH=amd64 go build -o bootstrap main.gozip function.zip bootstrapEl nombre del archivo de salida debe ser bootstrap — este es un requisito del runtime de Go en AWS Lambda.
Ahora creemos la función a través de AWS CLI:
aws lambda create-function \ --function-name my-go-function \ --runtime provided.al2023 \ --role arn:aws:iam::123456789012:role/lambda-execution-role \ --handler bootstrap \ --zip-file fileb://function.zipTenga en cuenta --runtime provided.al2023 — este es el runtime especial para Go (basado en Amazon Linux 2023). Si tiene una versión anterior, use provided.al2.
Después de la creación, pruebe la función:
aws lambda invoke --function-name my-go-function \ --payload '{"name": "Mundo"}' output.jsoncat output.jsonDebería ver: {"message":"¡Hola, Mundo!"}
Trabajo con eventos de AWS (S3, DynamoDB, API Gateway)
El verdadero poder de Lambda se revela al integrarse con otros servicios de AWS. Veamos un ejemplo de un handler para eventos de S3:
package main
import ( "context" "fmt" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda")
func HandleS3Event(ctx context.Context, s3Event even