Você faz o push da imagem, cria o serviço, e as primeiras tasks nunca chegam a RUNNING. Elas param com um ResourceInitializationError: unable to pull secrets or registry auth. A imagem está certa. As tasks estão em sub-redes privadas sem rota para o Amazon ECR nem para o Secrets Manager, então o Fargate não consegue iniciá-las.
Muitos problemas do ECS no Fargate parecem com este: os contêineres funcionam, mas a rede, as roles ou as configurações do balanceador de carga ao redor deles não. Este post percorre um serviço web de produção no Amazon ECS com AWS Fargate, da rede e do balanceamento de carga ao IAM, ao escalonamento, aos deployments e a ECS vs EKS, com um diagrama que você pode copiar.
Os conceitos do ECS em uma tabela
| Conceito | O que é | No exemplo |
|---|---|---|
| Cluster | Um grupo lógico de serviços e tasks | prod |
| Task definition | Modelo versionado: imagem, CPU, memória, portas, roles, secrets, logging | orders-api:42 |
| Task | Uma cópia em execução de uma task definition; no Fargate ela tem seu próprio kernel, memória e interface de rede | De 2 a 10 cópias |
| Serviço | Mantém o número desejado de tasks, registra as tasks no balanceador de carga, executa os deployments | orders-api |
| Capacity provider | Onde as tasks rodam: FARGATE, FARGATE_SPOT, grupos do EC2 Auto Scaling ou ECS Managed Instances |
FARGATE e FARGATE_SPOT |
O cluster não é um limite de rede: as tasks rodam nas sub-redes que você indicar, atrás de seus próprios security groups. O ECS não cobra nada pela orquestração; o Fargate cobra por segundo a vCPU, a memória e o armazenamento de cada task, com mínimo de um minuto.
Rede: uma ENI por task
As tasks do Fargate sempre usam o modo de rede awsvpc: cada task recebe sua própria interface de rede elástica (ENI), um IP privado da sua sub-rede e seus próprios security groups (rede das tasks do Fargate). Três consequências:
- As sub-redes precisam de espaço. Cada task ocupa um IP, e a AWS reserva cinco por sub-rede. Sessenta tasks em duas AZs são 30 por sub-rede, e um deployment rolling a 200% precisa de 60 por um instante. Uma /24 (251 utilizáveis) serve; uma /27 (27 utilizáveis) não.
- Os security groups funcionam por task. Abra a porta do contêiner só para o grupo do balanceador de carga, e a porta 5432 do banco de dados só para o grupo das tasks.
- As tasks precisam de um caminho até as APIs da AWS. Antes de o seu código rodar, o Fargate baixa a imagem, busca os secrets e começa a enviar logs pela ENI da task.
A partir de uma sub-rede privada, esse caminho é um NAT gateway ou endpoints de VPC (preços de US East no momento da escrita, novembro de 2026):
| Caminho | Você cria | Custo | Contrapartida |
|---|---|---|---|
| NAT gateway | Um por AZ, ou um NAT gateway regional | US$ 0,045 por hora e AZ mais US$ 0,045 por GB | Também alcança APIs de terceiros |
| Endpoints de VPC | Endpoints de interface ecr.api, ecr.dkr, logs, secretsmanager, mais o endpoint de gateway do S3 |
US$ 0,01 por endpoint, hora e AZ mais US$ 0,01 por GB; o gateway do S3 é gratuito | Nenhum caminho para a internet |
Não pule o endpoint de gateway do S3: o ECR guarda as camadas das imagens no S3 (endpoints de interface do ECR). Quatro endpoints de interface em duas AZs custam cerca de US$ 58 por mês antes dos dados (8 × US$ 0,01 × 730 horas), quase o mesmo que dois NAT gateways a US$ 66. Os endpoints ganham em custos de dados e privacidade, e o NAT em alcance. Desde novembro de 2025, um NAT gateway regional abrange as AZs sozinho e não precisa de sub-rede pública. IPs públicos nas tasks também funcionam, mas deixam cada task a uma regra de security group da internet. O diagrama de VPC da AWS cobre as rotas e o posicionamento do NAT.
O balanceador de carga: target groups e health checks
O ALB precisa de sub-redes em pelo menos duas AZs, cada uma /27 ou maior com oito endereços livres. Como uma task awsvpc é uma ENI, e não uma instância EC2, o tipo do target group precisa ser ip. Use um target group por serviço; o ECS registra e remove o registro das tasks.
| Configuração | Padrão | Considere |
|---|---|---|
| Intervalo do health check | 30 s | 5 s se o serviço iniciar em menos de 10 s (sugestão da AWS) |
| Limite de não saudável | 2 verificações | Uma task com falha sai em cerca de um minuto |
| Limite de saudável | 5 verificações | Novos alvos precisam de apenas uma verificação bem-sucedida |
| Atraso de cancelamento do registro (deregistration delay) | 300 s | 30 s ou menos para requisições curtas; as tasks antigas podem drenar por esse tempo |
healthCheckGracePeriodSeconds |
0 | Cubra o tempo de inicialização, ou as tasks de partida lenta são substituídas em loop |
Desde novembro de 2025, o ECS Express Mode pode criar essa configuração de ALB, HTTPS e escalonamento a partir de uma imagem de contêiner. O diagrama de balanceador de carga cobre health checks e draining em geral.
IAM: a execution role e a task role
Duas roles, dois trabalhos:
- A task execution role é usada pelo ECS e pelo agente do Fargate, não pelo seu código: ela baixa a imagem, grava os logs e lê os secrets citados na task definition (task execution role).
AmazonECSTaskExecutionRolePolicycobre o ECR e os logs; adicionesecretsmanager:GetSecretValuevocê mesmo, ekms:Decryptpara uma chave gerenciada pelo cliente. - A task role é a que o seu código usa pelo AWS SDK, para S3 ou SQS, e a que o ECS Exec precisa.
Os secrets chegam como variáveis de ambiente:
"secrets": [{
"name": "DB_PASSWORD",
"valueFrom": "arn:aws:secretsmanager:us-east-1:111122223333:secret:prod/orders/db-AbCdEf:password::"
}]
O ECS lê o valor quando o contêiner inicia. Um secret rotacionado não chega às tasks em execução, então faça um novo deployment após a rotação ou deixe o app ler o secret com a sua task role. Escolher uma única chave JSON, como acima, exige a versão de plataforma 1.4.0, a atual LATEST.
Escalonamento: target tracking e Fargate Spot
Para o Service Auto Scaling, comece com target tracking em ECSServiceAverageCPUUtilization, ECSServiceAverageMemoryUtilization ou ALBRequestCountPerTarget. Ele aumenta rápido, reduz devagar e pausa a redução durante os deployments; com várias políticas, só reduz quando todas concordam. Mantenha pelo menos uma task por AZ.
O Fargate Spot custa até 70% menos. Quando a AWS recupera a capacidade, a task recebe um aviso de dois minutos, como evento do EventBridge com o stop code SpotInterruption e como SIGTERM (capacity providers do Fargate). stopTimeout tem máximo de 120 segundos, e o Fargate nunca volta sozinho para a capacidade regular, então mantenha uma base:
"capacityProviderStrategy": [
{ "capacityProvider": "FARGATE", "base": 2, "weight": 1 },
{ "capacityProvider": "FARGATE_SPOT", "weight": 1 }
]
As duas primeiras tasks sempre rodam no Fargate regular; o restante se divide um para um. Um serviço de uma única task no Spot simplesmente para até a capacidade voltar.
Deployments: rolling, blue/green, linear e canary
O rolling é o padrão: com minimumHealthyPercent em 100 e maximumPercent em 200, o ECS inicia as tasks novas antes de parar as antigas. Ative o deployment circuit breaker com rollback; por padrão, ele faz um deployment falhar quando as tasks com falha chegam à metade do número desejado (no mínimo 3, no máximo 200). Alarmes do CloudWatch podem disparar o mesmo rollback.
Desde julho de 2025, o ECS executa deployments blue/green por conta própria, sem o CodeDeploy, e desde outubro de 2025 também os lineares e canary. Eles iniciam a nova revisão atrás de um segundo target group, deslocam o tráfego do listener e mantêm as tasks antigas por um bake time, de modo que o rollback é uma troca de tráfego.
| Estratégia | Deslocamento do tráfego | Rollback | Capacidade extra |
|---|---|---|---|
| Rolling | Tasks substituídas em lotes | Novo deployment | Até maximumPercent |
| Blue/green | Tudo de uma vez, após tráfego de teste opcional | Voltar a troca | 2x |
| Linear | Passos iguais, como 10% a cada poucos minutos | Voltar a troca | 2x |
| Canary | Uma pequena parte, depois o resto | Voltar a troca | 2x |
Hooks de Lambda ou de pausa podem condicionar cada etapa. O target tracking em ALBRequestCountPerTarget não é compatível com blue/green. O diagrama de estratégias de deployment compara os padrões.
Observabilidade
O driver awslogs precisa de awslogs-group, awslogs-region e, no Fargate, awslogs-stream-prefix. Desde 25 de junho de 2025, ele usa por padrão o modo non-blocking com um buffer de 10 MB: uma falha do CloudWatch não congela mais o seu app, mas um buffer cheio perde linhas. Adicione o Container Insights com observabilidade aprimorada, o ECS Exec para shells e uma regra do EventBridge sobre mudanças de estado das tasks; o motivo da parada (stopped reason) diz por que uma task morreu. Para traces, rode um OpenTelemetry Collector como sidecar na task; ele é a camada de agente de um pipeline de logs, métricas e traces com OpenTelemetry.
ECS vs EKS
| Amazon ECS | Amazon EKS | |
|---|---|---|
| Control plane | Gratuito | US$ 0,10 por hora e cluster, cerca de US$ 73 por mês |
| API | Task definitions e serviços da AWS | Kubernetes, Helm, operators |
| Computação | Fargate, EC2, ECS Managed Instances | Fargate, node groups do EC2, EKS Auto Mode |
| Atualizações | Nenhuma para o control plane | 14 meses de suporte padrão por versão do Kubernetes, depois US$ 0,60 por hora e cluster |
| Deployments integrados | Rolling, blue/green, linear, canary | Rolling; os outros por ferramentas como Argo Rollouts |
Os preços vêm da página de preços do EKS no momento da escrita (novembro de 2026). Escolha o EKS quando precisar da portabilidade do Kubernetes ou do seu ecossistema; o diagrama de arquitetura do Kubernetes mostra esse cenário. Para trabalho curto e orientado a eventos, os designs serverless baseados em Lambda dispensam qualquer serviço rodando o tempo todo.
O diagrama do ECS no Fargate
Conteúdo do diagrama
- VPC
- Public subnet · AZ a
- Public subnet · AZ b
- Private subnet · AZ a
- Private subnet · AZ b
- Application Load Balancer
- orders-api task
- RDS for PostgreSQL
- VPC endpoints
- Users
- Amazon ECR
- Secrets Manager
- CloudWatch Logs
- HTTPS 443
- HTTP 8080
- SQL 5432
- image pull
- secrets at start
- awslogs
Como ler:
- As AZs são linhas. Cada uma tem uma sub-rede pública e uma privada. O ALB, o RDS e os endpoints ficam entre as linhas porque cada um abrange as duas AZs: um nó do ALB em cada sub-rede pública, um standby Multi-AZ para o banco de dados.
- O azul contínuo é o caminho das requisições: HTTPS até o ALB, HTTP 8080 até uma task por AZ, SQL na porta 5432.
- O roxo tracejado é o tráfego da plataforma: o pull da imagem, os secrets e os logs, enviados pelo Fargate com a task execution role pelos endpoints de VPC.
- Só as sub-redes públicas roteiam 0.0.0.0/0 para o internet gateway.
- O bloco Markdown lista as configurações do serviço.
Desenhando diagramas de ECS com clareza
- Coloque as tasks dentro de sub-redes por AZ. Uma caixa «cluster ECS» em volta de tudo esconde onde as tasks rodam e o que elas alcançam.
- Desenhe uma task por AZ, com a faixa de escalonamento ao lado.
- Mostre o caminho até o ECR, o Secrets Manager e o CloudWatch Logs. Um caminho ausente é um motivo comum para as tasks não iniciarem.
- Rotule a aresta do ALB com a porta e o tipo de alvo, e nomeie a role por trás das arestas tracejadas em uma legenda.
- Deixe de fora sidecars, CI/CD e registros DNS, a menos que o diagrama seja sobre eles.
O modelo de arquitetura de três camadas da AWS tem o mesmo layout de VPC com EC2.
Monte no Archboard
- Entre com Google ou GitHub e crie um diagrama.
- Adicione uma VPC do pacote Rede e quatro nós Sub-rede dentro dela, uma pública e uma privada para cada AZ.
- Adicione um Balanceador de carga na nuvem do pacote Nuvem entre as sub-redes públicas, e notas de Texto nas sub-redes públicas para a rota e o nó do ALB.
- Adicione uma Instância de computação do pacote Nuvem em cada sub-rede privada, com o tamanho da task no campo do tipo de instância.
- Entre as sub-redes privadas, adicione um Banco de dados gerenciado com alta disponibilidade ativada e um Recurso de nuvem para os endpoints de VPC, ambos do pacote Nuvem.
- Fora da VPC, adicione Internet do pacote Rede, Registro do pacote Docker, Cofre do pacote Segurança e Registros do pacote DevOps.
- Desenhe arestas rotuladas, tracejadas para o tráfego da plataforma, e adicione um bloco Markdown do pacote Básico com as configurações.
As ferramentas CloudFormation para diagrama e Terraform para diagrama transformam o código de um stack existente em um primeiro rascunho; ao desenhar o serviço a partir do Terraform, enxugue o rascunho e adicione à mão o caminho das requisições.
O exemplo usa 15 nós de diagrama e fica dentro do plano Free.
Perguntas frequentes
O Fargate exige o modo de rede awsvpc?
Sim. Cada task do Fargate recebe sua própria interface de rede e endereço IP privado, e é por isso que seus target groups precisam usar o tipo de alvo ip.
Qual é a diferença entre a task role do ECS e a task execution role? A execution role permite que o ECS inicie a task: baixar a imagem, buscar os secrets, enviar os logs. A task role é a que o código da sua aplicação usa para as próprias chamadas à AWS.
As tasks do Fargate em sub-redes privadas precisam de um NAT gateway? Não para os serviços da AWS. Endpoints de interface para ECR, CloudWatch Logs e Secrets Manager, mais o endpoint de gateway do S3, bastam. Você só precisa do NAT para alcançar a internet.
O ECS oferece suporte a deployments blue/green sem o CodeDeploy? Sim. O ECS executa blue/green nativamente desde julho de 2025, e linear e canary desde outubro de 2025, com bake times, lifecycle hooks e rollback baseado em alarmes.
O ECS é mais barato que o EKS? Para o control plane, sim: o ECS não tem taxa de orquestração, enquanto um cluster do EKS custa US$ 0,10 por hora no suporte padrão. Os preços do Fargate e das instâncias EC2 são os mesmos nos dois.