Padrões do GCP Cloud Run e AWS Fargate
Plataformas de contêineres permitem que equipes Go executem um main normal com net/http ou gRPC enquanto a nuvem gerencia escalonamento, patches e balanceamento de carga.
Busque em todas as páginas da documentação
Plataformas de contêineres permitem que equipes Go executem um main normal com net/http ou gRPC enquanto a nuvem gerencia escalonamento, patches e balanceamento de carga.
Cloud Run otimiza para HTTP orientado a requisições com escala para zero; AWS Fargate executa tarefas ECS sem gerenciar EC2 - frequentemente para serviços estáveis em vez de economias de ociosidade para zero.
Envie uma imagem OCI mínima com um binário Go estático, escute em $PORT e configure verificações de saúde da plataforma.
Cloud Run define requisições simultâneas máximas por instância - ajuste-o em relação à latência do handler e ao tamanho do pool de banco de dados.
Tarefas Fargate precisam de CPU/memória na definição da tarefa, rede awsvpc e Service Connect opcional para descoberta estilo service mesh.
Ambas as plataformas se beneficiam do desligamento gracioso ciente de SIGTERM em Go.
Cartão de receita de referência rápida - pronto para copiar e colar.
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())# Esboço de deploy do Cloud Run
gcloud run deploy api --image IMAGE --region REGION --concurrency 80 --cpu 1 --memory 512MiQuando usar isso:
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: pingar banco de dados com timeout curto
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("iniciando desligamento")
ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
slog.Error("erro no desligamento", "err", err)
}
}()
slog.Info("escutando", "addr", srv.Addr)
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
slog.Error("erro no servidor", "err", err)
os.Exit(1)
}
}O que isso demonstra:
/healthz) e readiness (/readyz) separadas para orquestradores.ReadHeaderTimeout no servidor para proteção contra clientes lentos.Shutdown limitado - Cloud Run envia SIGTERM antes de matar o contêiner.| Configuração | Efeito no serviço Go |
|---|---|
--concurrency | Requisições simultâneas máximas por instância; aumente quando os handlers forem limitados por I/O |
--cpu / --memory | Mais CPU acelera JSON e TLS; memória afeta o espaço livre para GC |
--min-instances | Reduz inícios a frio com custo base |
--timeout | Prazo da requisição imposto no proxy |
| Conector VPC | Acesso privado RFC1918 ao 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
}]
}Combine o stopTimeout do contêiner com o orçamento de Shutdown do seu Go para que o ECS não mate com SIGKILL no meio do descarregamento.
| Plataforma | Custo ocioso | Início a frio | Melhor ajuste |
|---|---|---|---|
| Cloud Run | Quase zero na escala para zero | Início do contêiner + inicialização Go | Picos de HTTP |
| Fargate (desejado >= 1) | Horas de tarefa estáveis | Nenhum enquanto as tarefas executam | Workers, RPC estável |
| Lambda | Zero entre invocações | Carregamento do binário + inicialização | Gatilhos de evento |
:8080 codificado ignorando PORT - Cloud Run injeta PORT; vincular a porta errada falha nas verificações de saúde do deploy. Correção: Ler os.Getenv("PORT") com fallback.signal.Notify + srv.Shutdown.MaxOpenConns=10 causa esperas ou timeouts. Correção: Alinhe a concorrência do Cloud Run com a matemática do pool./readyz, mantenha /healthz barato.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| AWS Lambda | Picos de eventos, handlers curtos | Sessões longas de streaming HTTP |
| GKE / EKS | Operadores, rede complexa | APIs simples de serviço único |
| App Engine standard | Padrões legados de PaaS do GCP | Você já padronizou no Cloud Run |
| EC2 + systemd | Controle total do host necessário | Você quer patches gerenciados |
Cloud Run suporta gRPC sobre HTTP/2 com TLS.
Para tráfego interno leste-oeste, muitas equipes ainda usam REST ou se conectam via VPC a backends gRPC do GKE.
Use imagens menores, defina --min-instances para tráfego base e evite trabalho pesado em init().
Meça com Cloud Trace antes de superprovisionar CPU.
Você não gerencia EC2, mas ainda escolhe o tamanho da tarefa e a contagem desejada.
É "capacidade serverless" em vez de funções de escala para zero.
Sim, se o processo escutar em uma porta configurável e ler a configuração de variáveis de ambiente.
IaC difere por nuvem, não pelo binário Go.
Quando você precisa de tarefas sempre ativas, tempos de execução mais longos sem limites do API Gateway, ou integração estreita com descoberta de serviços ECS e primitivas de rede da AWS.
gcloud run deployhttp.Server em produçãoVersões de Stack: Esta página foi escrita para Go 1.26.x (padrão GC Green Tea, go fix modernizers - verifique o patch na compilação), chi (última versão - verifique na compilação), gin (última versão - verifique na compilação), echo (última versão - verifique na compilação), google.golang.org/grpc (última versão - verifique na compilação), sigs.k8s.io/controller-runtime (última versão - verifique na compilação), kubebuilder (última versão - verifique na compilação), tinygo (última versão - verifique os alvos de placa na compilação), wazero (última versão - verifique na compilação) e golangci-lint (última versão - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026