Funciones Serverless en Go: AWS Lambda — Guía Completa
La arquitectura Serverless sigue ganando popularidad entre los desarrolladores gracias a su escalabilidad, reducción de costos operativos y la ausencia de necesidad de gestionar servidores. AWS Lambda es uno de los líderes en este ámbito. ¿Y qué pasa si combinamos el poder de serverless con el rendimiento y la simplicidad de Go (Golang)? En este artículo, analizaremos cómo crear, configurar y desplegar funciones serverless en Go para AWS Lambda. Conocerá las ventajas de este enfoque, escribirá su primera función y obtendrá consejos prácticos para la optimización.
¿Por qué Go (Golang) es ideal para AWS Lambda?
La elección del lenguaje de programación para funciones serverless es crítica. Go (Golang) tiene una serie de ventajas únicas que lo convierten en uno de los mejores candidatos para trabajar con AWS Lambda:
- Inicio en frío rápido: A diferencia de los lenguajes interpretados (Python, Node.js), Go se compila en un archivo binario nativo. El tiempo de inicio (cold start) se mide en milisegundos, lo cual es crítico para APIs y microservicios.
- Bajo consumo de memoria: Las aplicaciones Go son ligeras y utilizan la memoria de manera eficiente, lo que afecta directamente al costo de ejecución de las funciones (se paga por la memoria asignada).
- Simplicidad de despliegue: Se compila un único archivo binario, se sube a AWS Lambda y funciona sin dependencias externas (excepto la biblioteca estándar). Sin entornos virtuales ni node_modules.
- Alto rendimiento: Go es un lenguaje compilado con soporte integrado para concurrencia (goroutines). Esto permite procesar miles de solicitudes dentro de una sola función Lambda sin una sobrecarga significativa.
- Excelente integración con AWS SDK: El AWS SDK oficial para Go (v2) proporciona clientes convenientes y tipados para todos los servicios de AWS.
Creación de la primera función Serverless en Go para AWS Lambda
Escribamos una función simple que procese una solicitud HTTP a través de AWS Lambda Function URL o API Gateway. Para ello, necesitaremos el paquete github.com/aws/aws-lambda-go.
Paso 1: Inicialización del proyecto e instalación de dependencias
mkdir my-lambda-gocd my-lambda-gogo mod init my-lambda-gogo get github.com/aws/aws-lambda-go/lambdago get github.com/aws/aws-lambda-go/eventsPaso 2: Código de la función (main.go)
Esta función recibirá una solicitud JSON con el nombre de un usuario y devolverá un saludo.
package main
import (\t"context"\t"encoding/json"\t"fmt"\t"log"
\t"github.com/aws/aws-lambda-go/events"\t"github.com/aws/aws-lambda-go/lambda")
// Request estructura para la solicitud entrantetype Request struct {\tName string `json:"name"`}
// Response estructura para la respuestatype Response struct {\tMessage string `json:"message"`}
func handleRequest(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {\tvar req Request
\t// Parseamos el cuerpo de la solicitud\tif err := json.Unmarshal([]byte(request.Body), &req); err != nil {\t\tlog.Printf("Error parsing request: %v", err)\t\treturn events.APIGatewayProxyResponse{\t\t\tStatusCode: 400,\t\t\tBody: `{"error":"Invalid JSON"}`,\t\t\tHeaders: map[string]string{"Content-Type": "application/json"},\t\t}, nil\t}
\t// Formamos la respuesta\tmessage := fmt.Sprintf("Hello, %s! Welcome to Serverless Go.", req.Name)\tresp := Response{Message: message}
\tjsonResp, _ := json.Marshal(resp)
\treturn events.APIGatewayProxyResponse{\t\tStatusCode: 200,\t\tBody: string(jsonResp),\t\tHeaders: map[string]string{"Content-Type": "application/json"},\t}, nil}
func mai