01 - AWS ECS (Elastic Container Service)
video: https://youtu.be/... no frontmatter da nota.AWS ECS (Elastic Container Service)
O Amazon ECS é o serviço de orquestração de contêineres nativo da AWS, usado para agendar e executar contêineres Docker em clusters gerenciados sem administrar um control plane de Kubernetes. A escala de operação sustenta a confiança em produção: a AWS processa cerca de 3 bilhões de tasks ECS por semana, distribuídas entre contas de clientes de todos os portes, o que significa que o scheduler, as integrações e os modos de falha do serviço são exaustivamente exercitados diariamente. O modelo mental é simples e fechado: você descreve contêineres em uma task definition, declara réplicas e balanceamento em um service e escolhe a capacidade em um cluster, com integração nativa de IAM, ALB, autoscaling e CloudWatch. Em 2025, o lançamento do ECS Managed Instances adicionou uma terceira forma de capacidade, combinando a simplicidade operacional do Fargate com o controle de instâncias EC2 para cargas com GPU, privileged containers e memória acima do teto de 120 GB do Fargate. Para times AWS-first, o ECS costuma entregar orquestração de produção com custo e complexidade menores que Kubernetes.
Conceito e modelo de objetos
O ECS organiza a operação em três objetos centrais, e entender a fronteira entre eles elimina a maior parte da confusão inicial. O cluster agrupa capacidade de computação, seja de instâncias EC2, Fargate ou Managed Instances. A task definition é o documento declarativo que descreve a aplicação: imagem, CPU, memória, variáveis, segredos, portas, logs e health check. A task é uma instância em execução dessa definição, e o service mantém o número desejado de tasks saudáveis, substitui falhas e orquestra deploys rolantes.
| Objeto | Análogo em Kubernetes | Função |
|---|---|---|
| Cluster | Cluster | Agrupa capacidade de computação |
| Task definition | Pod spec / template de Deployment | Descreve contêineres, recursos e configuração |
| Task | Pod | Processo em execução com ciclo de vida próprio |
| Service | Deployment + Service | Mantém réplicas, health, registro no ALB e deploy |
| Capacity provider | Node pool + autoscaler | Define a origem e a dinâmica da capacidade |
A task definition é versionada por revision, e o deploy de produção é, na prática, a publicação de uma nova revision seguida da atualização do service para essa revision. Esse fluxo é fácil de automatizar em pipeline e de reverter, pois a revisão anterior permanece registrada e disponível.
{
"family": "pedidos-api",
"requiresCompatibilities": ["FARGATE"],
"networkMode": "awsvpc",
"cpu": "512",
"memory": "1024",
"taskRoleArn": "arn:aws:iam::123456789012:role/pedidosTaskRole",
"executionRoleArn": "arn:aws:iam::123456789012:role/ecsExecutionRole",
"containerDefinitions": [
{
"name": "api",
"image": "123456789012.dkr.ecr.sa-east-1.amazonaws.com/pedidos:1.15.2",
"portMappings": [{ "containerPort": 8080, "protocol": "tcp" }],
"secrets": [
{
"name": "DB_PASSWORD",
"valueFrom": "arn:aws:secretsmanager:sa-east-1:...:secret:pedidos/db"
}
],
"healthCheck": {
"command": ["CMD-SHELL", "curl -f http://localhost:8080/healthz || exit 1"],
"interval": 30,
"retries": 3
},
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/pedidos-api",
"awslogs-region": "sa-east-1",
"awslogs-stream-prefix": "api"
}
}
}
]
}
Launch types: EC2, Fargate e Managed Instances
A escolha da capacidade é a decisão arquitetural central do ECS, porque define operação, custo e limites técnicos ao mesmo tempo. Os três modos compartilham a mesma API de tasks e services, o que torna a migração entre eles viável sem reescrever a aplicação.
| Critério | EC2 (autoadministrado) | Fargate | Managed Instances (2025) |
|---|---|---|---|
| Administração de instâncias | Do time de plataforma | Nenhuma | AWS administra o ciclo de vida |
| GPU e privileged containers | Sim | Não | Sim, com GPU |
| Memória máxima por task | Limitada pela instância | 120 GB | Acima do teto do Fargate |
| Custo de base | Instâncias ociosas por conta do time | Zero em ociosidade; prêmio por vCPU | Cobrança por instância gerenciada |
| Densidade e bin packing | Manuais, via placement strategies | Automático pelo serviço | Automático dentro do limite |
| Perfil ideal | Custo otimizado com equipe de infra | Times focados em produto | Controle de host sem operar cluster |
O Fargate elimina patching de SO, dimensionamento de ASG e planejamento de bin packing, cobrando por vCPU e GB de memória por segundo, com prêmio de preço em relação a instâncias reservadas. O modo EC2 reduz custo unitário em escala constante e permite qualquer recurso do host, ao preço de administrar AMI, agente ECS e escala do grupo. O Managed Instances fecha essa lacuna em 2025: o time continua definindo tasks e services da mesma forma, mas a AWS provisiona e administra instâncias EC2 escolhidas para o caso, incluindo GPU, containers privileged e memória além de 120 GB, sem expor a complexidade de operar um cluster.
Integração com ALB, IAM e autoscaling
A integração com o restante da plataforma é o diferencial prático do ECS em produção. Um service associado a um Target Group registra cada task no ALB automaticamente, respeitando portas dinâmicas com awsvpc e suportando roteamento por host e path em múltiplos services no mesmo domínio. O IAM substitui credenciais embutidas: a task role concede permissões granulares à aplicação, e a execution role cobre ações da plataforma, como pull de imagem do ECR e leitura de segredos do Secrets Manager.
O autoscaling do service ajusta o número desejado de tasks com políticas de target tracking, tipicamente sobre utilização de CPU, número de requisições por target do ALB ou métricas customizadas no CloudWatch. A escala de capacidade, quando o launch type é EC2, fica a cargo do capacity provider, que aciona o ASG subjacente conforme a demanda de tasks.
# Atualiza o service para a nova revision com contagem desejada
aws ecs update-service \
--cluster producao \
--service pedidos-api \
--task-definition pedidos-api:47 \
--desired-count 8
# Política de escala: mantém a média de CPU do service em 60%
aws application-autoscaling register-scalable-target \
--service-namespace ecs --resource-id service/producao/pedidos-api \
--scalable-dimension ecs:service:DesiredCount --min-capacity 4 --max-capacity 40
aws application-autoscaling put-scaling-policy \
--service-namespace ecs --resource-id service/producao/pedidos-api \
--scalable-dimension ecs:service:DesiredCount \
--policy-name cpu-target-60 \
--policy-type TargetTrackingScaling \
--target-tracking-configuration '{
"TargetValue": 60.0,
"PredefinedMetricSpecification": {"PredefinedMetricType": "ECSServiceAverageCPUUtilization"}
}'
Fargate versus EC2 por custo e controle
A comparação de custo é matemática de perfil de carga, e não preferência. Fargate cobra por segundo com preço unitário maior que instância equivalente; em cargas estáveis e previsíveis, EC2 com Savings Plans ou instâncias Spot sai significativamente mais barato por vCPU hora. Em cargas variáveis, o preço de ociosidade desaparece no Fargate, e o custo total frequentemente empata com a economia teórica do EC2 mal utilizada.
Controle segue a mesma lógica de trade-off. Fargate restringe: sem privileged, sem host network, teto de 120 GB de memória por task, e customizações de kernel fora de alcance. EC2 libera tudo, mas transfere a responsabilidade de AMI, patching e capacidade. O Managed Instances entra como resposta 2025 para o caso específico de precisar de controle de host sem querer operar o cluster, e times com requisitos de GPU ou memória alta têm nele o caminho suportado que antes exigia EC2 autoadministrado ou contornos criativos.
| Perfil de carga | Escolha recomendada | Justificativa |
|---|---|---|
| API com tráfego variável | Fargate | Zero ociosidade e operação mínima |
| Batch estável e volumoso | EC2 reservado ou Spot | Menor custo por vCPU hora |
| Modelos com GPU | EC2 ou Managed Instances | Fargate não oferta GPU |
| Memória acima de 120 GB por task | Managed Instances | Fargate limitado nesse teto |
| Migração corporativa com requisitos de host | EC2 com capacity provider | Controle total do ambiente |
Deploy, ciclo de vida e segurança de operação
O service executa deploys rolantes por padrão: publica tasks novas da revision, aguarda registro saudável no Target Group, drena as antigas e reverte automaticamente se o rollout não convergir quando o deployment circuit breaker está habilitado. Para padrões canário e blue-green mais sofisticados, o deploy controller do CodeDeploy alterna Target Groups no ALB, mantendo o ECS como executor.
A segurança de operação combina menor privilégio por task role, imagens assinadas e imutabilidade de tags no ECR, secrets via Secrets Manager ou Parameter Store e logs centralizados no CloudWatch com retenção definida. Container Insights fecha o ciclo de observabilidade com métricas agregadas por cluster, service e task, base para calibrar dimensionamento e custo.
ECS versus EKS
| Critério | ECS | EKS |
|---|---|---|
| Complexidade operacional | Baixa; modelo fechado e integrado | Alta; upgrades de versão e taxonomia extensa |
| Portabilidade | Acoplado à AWS | Multi-cloud e on-premises |
| Ecossistema | Fechado, cobre o caso comum | Vastíssimo, com operators e CRDs |
| Escala comprovada | Cerca de 3 bilhões de tasks por semana | Padrão de mercado multi-ambiente |
| Custo de control plane | Sem cobrança adicional | Cobrança por cluster gerenciado |
| Curva de aprendizado | Rasa para quem conhece AWS | Íngreme, com jargão próprio |
A decisão prática favorece ECS para times pequenos e médios AWS-first que querem foco em produto, e EKS para estratégias multi-cloud, plataformas internas maduras ou necessidades de extensibilidade específicas. Ambos rodam as mesmas imagens e podem compartilhar ECR, ALB e observabilidade, o que mantém o custo de mudança calculável.
Erros comuns e boas práticas
- Subdimensionar CPU ou memória na task definition, gerando loops de OOM kill com restarts silenciosos; monitore memória por service e calibre com dados reais.
- Ignorar a escassez de IPs da sub-rede com awsvpc, que trava novas tasks durante picos de escala; dimensione CIDR para o máximo de réplicas previsto.
- Conceder task role ampla demais, violando menor privilégio; defina policies por serviço e audite com IAM Access Analyzer.
- Desabilitar o deployment circuit breaker e permitir rollouts defeituosos consumirem todas as tasks do serviço.
- Misturar ambientes no mesmo cluster; prefira clusters por ambiente com security groups e IAM distintos.
- Usar tags mutáveis de imagem e perder rastreabilidade de versão; fixe digests no pipeline e aplique imutabilidade no ECR.
- Combinar Fargate em cargas estáveis de 24x7 sem revisar custo; onde a demanda é constante, avalie EC2 com Savings Plans ou Managed Instances.
Como prática consolidada, trate task definitions como código versionado gerado por templates no pipeline, habilite Container Insights e alarmes de memória desde o primeiro serviço, e revise a escolha de launch type por workload periodicamente, pois o lançamento do ECS Managed Instances em 2025 mudou a fronteira entre Fargate e EC2 autoadministrado e tornou viáveis cenários que antes exigiam contornos.