Introducción a las funciones Serverless en Go con AWS Lambda
\nLa 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\nParte principal
\n\n1. Creación y estructura de una función Lambda en Go
\nCualquier función Lambda en Go comienza con la importación del paquete github.com/aws/aws-lambda-go/lambda. Veamos un ejemplo mínimo:
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\nPuntos 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
2. Manejo de eventos de diferentes servicios de AWS
\nLambda 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.
Ejemplo para API Gateway (solicitud HTTP):
\npackage 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\nEjemplo para S3 (nuevo objeto en el bucket):
\npackage 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.DynamoDBEventy otros. \n - Para eventos personalizados (por ejemplo, de CloudWatch), use
json.Unmarshal. \n
3. Compilación, despliegue y mejores prácticas
\nGo 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\nLuego empaquete en ZIP y cargue mediante AWS CLI o consola:
\nzip function.zip bootstrap\naws lambda create-function \\\n --function-name my-go-function \\\n --runtime provided.al2023 \\\n --role arn:aws:iam::XXXXXXXXXXX