Funciones Serverless en Go: AWS Lambda de la A a la Z

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción a las funciones Serverless en Go con AWS Lambda

\n

La arquitectura Serverless se ha convertido en un estándar para crear aplicaciones escalables y rentables. AWS Lambda es uno de los líderes en este ámbito, y Go (Golang) es el lenguaje ideal para escribir funciones serverless gracias a su rendimiento, inicio rápido y pequeño tamaño del archivo binario. En este artículo, analizaremos el ciclo completo de trabajo: desde la creación de una función simple hasta el despliegue y monitoreo.

\n

¿Por qué Go? A diferencia de Node.js o Python, Go se compila en un archivo binario nativo, lo que reduce el arranque en frío (cold start) a decenas de milisegundos. Esto es crítico para sistemas de alta carga.

\n\n

Parte principal

\n\n

1. Creación y estructura de una función Lambda en Go

\n

Cualquier función Lambda en Go comienza con la importación del paquete github.com/aws/aws-lambda-go/lambda. Veamos un ejemplo mínimo:

\n\n
package main\n\nimport (\n    "github.com/aws/aws-lambda-go/lambda"\n)\n\ntype MyEvent struct {\n    Name string `json:"name"`\n}\n\ntype MyResponse struct {\n    Message string `json:"message"`\n}\n\nfunc HandleRequest(event MyEvent) (MyResponse, error) {\n    return MyResponse{Message: "¡Hola, " + event.Name + "!"}, nil\n}\n\nfunc main() {\n    lambda.Start(HandleRequest)\n}
\n\n

Puntos clave:

\n
    \n
  • Handler — es la función que llama AWS Lambda. Puede aceptar y devolver cualquier tipo de datos (estructuras, cadenas, interfaces).
  • \n
  • Contexto — primer argumento opcional: func HandleRequest(ctx context.Context, event MyEvent) (MyResponse, error). Permite cancelar la ejecución por tiempo de espera.
  • \n
  • Un error (error) le indica a Lambda que hubo una falla en la ejecución.
  • \n
\n\n

2. Manejo de eventos de diferentes servicios de AWS

\n

Lambda se usa a menudo como desencadenador para eventos de S3, DynamoDB, SQS y API Gateway. Go admite todos los tipos de eventos a través del paquete github.com/aws/aws-lambda-go/events.

\n\n

Ejemplo para API Gateway (solicitud HTTP):

\n
package main\n\nimport (\n    "github.com/aws/aws-lambda-go/lambda"\n    "github.com/aws/aws-lambda-go/events"\n)\n\nfunc handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {\n    return events.APIGatewayProxyResponse{\n        Body:       "Hello, World!",\n        StatusCode: 200,\n        Headers:    map[string]string{"Content-Type": "text/plain"},\n    }, nil\n}\n\nfunc main() {\n    lambda.Start(handler)\n}
\n\n

Ejemplo para S3 (nuevo objeto en el bucket):

\n
package main\n\nimport (\n    "context"\n    "fmt"\n    "github.com/aws/aws-lambda-go/lambda"\n    "github.com/aws/aws-lambda-go/events"\n)\n\nfunc handler(ctx context.Context, s3Event events.S3Event) error {\n    for _, record := range s3Event.Records {\n        bucket := record.S3.Bucket.Name\n        key := record.S3.Object.Key\n        fmt.Printf("Nuevo archivo: %s en el bucket %s\\n", key, bucket)\n    }\n    return nil\n}\n\nfunc main() {\n    lambda.Start(handler)\n}
\n
    \n
  • Use events.S3Event, events.SNSEvent, events.DynamoDBEvent y otros.
  • \n
  • Para eventos personalizados (por ejemplo, de CloudWatch), use json.Unmarshal.
  • \n
\n\n

3. Compilación, despliegue y mejores prácticas

\n

Go se compila para Linux (arquitectura x86_64 o arm64). Compile el archivo binario para Lambda:

\n
# Para x86_64\nGOOS=linux GOARCH=amd64 go build -o bootstrap main.go\n\n# Para ARM (Graviton) — más barato y rápido\nGOOS=linux GOARCH=arm64 go build -o bootstrap main.go
\n\n

Luego empaquete en ZIP y cargue mediante AWS CLI o consola:

\n
zip function.zip bootstrap\naws lambda create-function \\\n    --function-name my-go-function \\\n    --runtime provided.al2023 \\\n    --role arn:aws:iam::XXXXXXXXXXX                

Blogs

Book Recommendations