Patrones de GCP Cloud Run y AWS Fargate
Las plataformas de contenedores permiten a los equipos de Go ejecutar un main normal con net/http o gRPC mientras la nube gestiona el escalado, el parcheo y el balanceo de carga.
Busca en todas las páginas de la documentación
Las plataformas de contenedores permiten a los equipos de Go ejecutar un main normal con net/http o gRPC mientras la nube gestiona el escalado, el parcheo y el balanceo de carga.
Cloud Run optimiza para HTTP impulsado por solicitudes con escalado a cero; AWS Fargate ejecuta tareas de ECS sin gestionar EC2, a menudo para servicios estables en lugar de economías de inactivo a cero.
Envía una imagen OCI mínima con un binario Go estático, escucha en $PORT y configura las comprobaciones de salud de la plataforma.
Cloud Run establece solicitudes concurrentes máximas por instancia, ajústalo según la latencia del manejador y el tamaño del grupo de bases de datos.
Las tareas de Fargate necesitan CPU/memoria en la definición de la tarea, red awsvpc y Service Connect opcional para el descubrimiento estilo service mesh.
Ambas plataformas se benefician del apagado elegante consciente de SIGTERM en Go.
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
srv := &http.Server{
Addr: ":" + port,
Handler: mux,
ReadHeaderTimeout: 5 * time.Second,
ReadTimeout: 30 * time.Second,
WriteTimeout: 30 * time.Second,
IdleTimeout: 120 * time.Second,
}
go func() {
<-shutdown
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
defer cancel()
_ = srv.Shutdown(ctx)
}()
log.Fatal(srv.ListenAndServe())# Esquema de despliegue de Cloud Run
gcloud run deploy api --image IMAGE --region REGION --concurrency 80 --cpu 1 --memory 512MiCuándo usar esto:
docker run local.package main
import (
"context"
"log/slog"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
mux := http.NewServeMux()
mux.HandleFunc("GET /healthz", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNoContent)
})
mux.HandleFunc("GET /readyz", func(w http.ResponseWriter, r *http.Request) {
// opcional: hacer ping a la base de datos con un tiempo de espera corto
w.WriteHeader(http.StatusNoContent)
})
mux.HandleFunc("GET /api/status", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
_, _ = w.Write([]byte(`{"status":"ok"}`))
})
srv := &http.Server{
Addr: ":" + port,
Handler: mux,
ReadHeaderTimeout: 5 * time.Second,
}
stop := make(chan os.Signal, 1)
signal.Notify(stop, syscall.SIGTERM, syscall.SIGINT)
go func() {
<-stop
slog.Info("inicio de apagado")
ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
slog.Error("error de apagado", "err", err)
}
}()
slog.Info("escuchando", "addr", srv.Addr)
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
slog.Error("error del servidor", "err", err)
os.Exit(1)
}
}Lo que esto demuestra:
/healthz) y readiness (/readyz) separadas para orquestadores.ReadHeaderTimeout en el servidor para protección contra clientes lentos.Shutdown limitado: Cloud Run envía SIGTERM antes de matar el contenedor.| Configuración | Efecto en el servicio Go |
|---|---|
--concurrency | Solicitudes simultáneas máximas por instancia; aumenta cuando los manejadores están limitados por E/S |
--cpu / --memory | Más CPU acelera JSON y TLS; la memoria afecta el margen de GC |
--min-instances | Reduce los arranques en frío a un costo base |
--timeout | Límite de solicitud aplicado en el proxy |
| Conector VPC | Acceso privado RFC1918 a Cloud SQL / Memorystore |
{
"family": "go-api",
"cpu": "512",
"memory": "1024",
"networkMode": "awsvpc",
"containerDefinitions": [{
"name": "api",
"image": "ACCOUNT.dkr.ecr.REGION.amazonaws.com/go-api:latest",
"portMappings": [{"containerPort": 8080}],
"healthCheck": {
"command": ["CMD-SHELL", "wget -q -O- http://127.0.0.1:8080/healthz || exit 1"],
"interval": 30,
"timeout": 5,
"retries": 3
},
"stopTimeout": 30
}]
}Haz coincidir stopTimeout del contenedor con el presupuesto de Shutdown de tu Go para que ECS no haga SIGKILL a mitad del vaciado.
| Plataforma | Costo en inactivo | Arranque en frío | Mejor ajuste |
|---|---|---|---|
| Cloud Run | Casi cero con escalado a cero | Inicio del contenedor + inicialización de Go | Ráfagas HTTP |
| Fargate (deseado >= 1) | Horas de tarea estables | Ninguno mientras las tareas se ejecutan | Trabajadores, RPC estables |
| Lambda | Cero entre invocaciones | Carga binaria + inicialización | Disparadores de eventos |
:8080 codificado ignorando PORT: Cloud Run inyecta PORT; enlazar el puerto incorrecto falla las comprobaciones de salud del despliegue. Solución: Leer os.Getenv("PORT") con un respaldo.signal.Notify + srv.Shutdown.MaxOpenConns=10 causan esperas o tiempos de espera. Solución: Alinear la concurrencia de Cloud Run con las matemáticas del grupo./readyz, mantener /healthz económico.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| AWS Lambda | Picos de eventos, manejadores cortos | Sesiones de streaming HTTP largas |
| GKE / EKS | Operadores, redes complejas | APIs simples de servicio único |
| App Engine standard | Estándares PaaS heredados de GCP | Ya te has estandarizado en Cloud Run |
| EC2 + systemd | Se requiere control total del host | Quieres parches gestionados |
Cloud Run soporta gRPC sobre HTTP/2 con TLS.
Para tráfico interno este-oeste, muchos equipos todavía usan REST o se conectan a través de VPC a backends gRPC de GKE.
Usa imágenes más pequeñas, establece --min-instances para el tráfico base y evita un trabajo pesado en init().
Mide con Cloud Trace antes de aprovisionar en exceso la CPU.
No gestionas EC2, pero aún eliges el tamaño de la tarea y el recuento deseado.
Es "capacidad serverless" en lugar de funciones de escalado a cero.
Sí, si el proceso escucha en un puerto configurable y lee la configuración de las variables de entorno.
IaC difiere por nube, no el binario Go.
Cuando necesites tareas siempre activas, tiempos de ejecución más largos sin los límites de API Gateway, o una integración estrecha con el descubrimiento de servicios ECS y los primitivos de red de AWS.
gcloud run deployhttp.Server en producciónVersiones de Stack: Esta página fue escrita para Go 1.26.x (predeterminado GC Green Tea, go fix modernizers - verifica el parche en la compilación), chi (última versión - verifica en la compilación), gin (última versión - verifica en la compilación), echo (última versión - verifica en la compilación), google.golang.org/grpc (última versión - verifica en la compilación), sigs.k8s.io/controller-runtime (última versión - verifica en la compilación), kubebuilder (última versión - verifica en la compilación), tinygo (última versión - verifica los objetivos de la placa en la compilación), wazero (última versión - verifica en la compilación) y golangci-lint (última versión - verifica el conjunto de linters en la compilación).
Revisado por Chris St. John·Última actualización: 16 jul 2026