Containers oferecem consistência entre ambientes (dev/staging/prod), isolamento de dependências e densidade de workloads. A AWS oferece dois orquestradores principais: ECS (proprietary, simplesidade) e EKS (Kubernetes, portabilidade).
ECS Cluster
└── Service (define quantas Tasks rodar + onde)
└── Task (1-N containers rodando juntos)
└── Task Definition (blueprint: imagem, CPU, RAM, ports, volumes, IAM role)
- Task Definition: arquivo JSON versionado que define containers (como Dockerfile mas para o ECS)
- Task: instância rodando de uma Task Definition (1 task = 1 ou mais containers co-localizados)
- Service: garante que N tasks estejam sempre rodando; integra com ALB/NLB; rolling updates
- Cluster: agrupamento lógico de resources (pode ser EC2 instances ou Fargate)
| Launch Type | Infraestrutura | Gerenciamento | Controle |
|---|---|---|---|
| EC2 | EC2 instances que você registra no cluster | Você gerencia as instâncias (AMI, patches, scaling) | Total sobre o host |
| Fargate | Serverless — AWS gerencia o host | Sem instâncias para gerenciar | Apenas task-level |
| External (ECS Anywhere) | Seus servidores on-premises | Você gerencia | Híbrido |
| Modo | Descrição | Quando usar |
|---|---|---|
| bridge | Container ports mapeados para IPs dinâmicos do host | EC2, múltiplos containers no mesmo host |
| host | Container usa diretamente a rede do host | EC2, alta performance, sem NAT |
| awsvpc | Cada task recebe própria ENI com IP privado da VPC | Recomendado — Fargate obrigatório; isolamento de SG por task |
| none | Sem rede | Tasks offline |
Com awsvpc, cada task tem seu próprio Security Group — granularidade máxima de isolamento de rede.
| Papel IAM | Para | Quem usa |
|---|---|---|
| Task Role | O que o container pode fazer (S3, DynamoDB, etc.) | A aplicação dentro do container |
| Task Execution Role | O que o ECS pode fazer para lançar a task (pull ECR, push CloudWatch Logs, Secrets Manager) | O ECS agent |
Nunca embuta credenciais no container — use Task Role com
awsvpcmode. As credenciais são obtidas via IMDS do task metadata endpoint.
- ALB com dynamic port mapping (launch type EC2): containers registram portas dinâmicas no TG
- NLB para tráfego alto throughput ou non-HTTP
- Service Connect: Service Mesh gerenciado para comunicação service-to-service dentro do ECS (mTLS, observabilidade)
- Cloud Map: service discovery baseado em DNS para comunicação entre containers
- Escala o número de tasks (não instâncias — para EC2 Launch Type, escalar instâncias é separado)
- Políticas: Target Tracking, Step Scaling, Scheduled
- ECS Capacity Provider: gerencia automaticamente o scaling do cluster EC2 subjacente com base nas tasks pendentes
Compute engine serverless para ECS e EKS. Você não gerencia servidores:
- Define: CPU (0,25 vCPU a 16 vCPU) + RAM (proporcional ao CPU)
- Cobrado por vCPU-hora e GB-hora enquanto task está rodando
- Cada task em Fargate obrigatoriamente usa
awsvpc(própria ENI) - Spot Fargate: até 70% de desconto para tasks interrompíveis
- Fargate Savings Plans: compromisso de uso para desconto
Kubernetes gerenciado na AWS. AWS gerencia o control plane (API server, etcd); você gerencia os worker nodes.
| Modo | Descrição | Flexibilidade |
|---|---|---|
| Managed Node Groups | AWS gerencia o lifecycle dos EC2 nodes (launch, update, terminate) | Alta — pode customizar AMI, tipo, etc. |
| Self-managed Nodes | Você gerencia completamente (launch template, userdata) | Total |
| Fargate Profiles | Pods rodam em Fargate (serverless) | Sem node management |
- Control Plane: gerenciado pela AWS (multi-AZ por padrão, altamente disponível)
- Worker Nodes: EC2 ou Fargate onde os Pods rodam
- Add-ons: AWS gerencia componentes como CoreDNS, kube-proxy, Amazon VPC CNI, AWS Load Balancer Controller
- Amazon VPC CNI: pods recebem IPs diretamente da VPC (igual ao ECS awsvpc — cada pod = IP da VPC)
- EBS: volumes persistentes para pods (node-specific, não multi-attach)
- EFS: volumes compartilhados entre múltiplos pods/nodes
- Amazon FSx for Lustre: high-performance para ML/HPC workloads
| Aspecto | ECS | EKS |
|---|---|---|
| Orquestrador | Proprietário AWS | Kubernetes (open source) |
| Curva de aprendizado | Menor | Maior |
| Portabilidade | Apenas AWS | Qualquer Kubernetes (on-prem, GKE, AKS) |
| Ecossistema | Integrado com AWS natively | Helm charts, operadores Kubernetes |
| Multi-cloud/on-prem | ECS Anywhere (limitado) | EKS Anywhere, Kubernetes em qualquer lugar |
| Custo control plane | Sem custo de cluster | $0,10/hora por cluster EKS |
Registry privado (e público) de imagens Docker/OCI:
- Repositórios privados: imagens acessíveis apenas dentro da conta (ou cross-account via resource policy)
- Repositórios públicos (ECR Public): imagens públicas (hub.docker similar)
- Image Scanning: enhanced scanning via Amazon Inspector (CVEs, malware) ou básica
- Lifecycle Policies: descarta imagens antigas automaticamente (ex: manter apenas as 10 mais recentes)
- Replication: cross-region ou cross-account para DR e distribuição global
- PaaS para containers web: você fornece o código ou imagem, App Runner gerencia tudo
- Auto-scaling, HTTPS, load balancing — sem configuração de ECS/Fargate/ALB
- Mais simples, menos controle
- CLI para implantar aplicações containerizadas no ECS/Fargate com melhores práticas incorporadas
- Cria automaticamente: ECR, ECS Service, ALB, SSM Parameters, etc.
- Service Mesh baseado em Envoy proxy para ECS e EKS
- Observabilidade (tracing, metrics) e mTLS para comunicação service-to-service
- Alternativa AWS-native ao Istio
Route 53 → ALB (public)
├── /api/users/* → ECS Service: UserService (Fargate)
│ └── Task Role → DynamoDB (Users table)
├── /api/orders/* → ECS Service: OrderService (Fargate)
│ └── Task Role → RDS Aurora (Orders DB)
└── /api/notify/* → ECS Service: NotifyService (Fargate)
└── Task Role → SNS/SES
Comunicação interna:
OrderService → SNS "order-placed" → SQS → NotifyService
(fan-out via EventBridge para auditoria no S3)
ECR → Task Definition (imagem versionada)
CloudWatch Logs → Container logs (awslogs driver)
AWS X-Ray → Distributed tracing
| Necessidade | Serviço |
|---|---|
| Simplicidade máxima, app web containerizada | App Runner |
| Containers AWS-native sem gerenciar infra | ECS + Fargate |
| Containers AWS-native com controle do host | ECS + EC2 |
| Kubernetes para portabilidade | EKS |
| Kubernetes serverless | EKS + Fargate |
| Kubernetes on-premises | EKS Anywhere |
- Task Role = permissões da aplicação; Task Execution Role = permissões do ECS para gerenciar a task
- awsvpc mode = cada task tem ENI e SG próprios — isolamento de rede por task (Fargate obrigatório)
- ECS EC2 ainda precisa de EC2 instances no cluster; Fargate = zero infra para gerenciar
- Managed Node Groups no EKS ≠ Fargate — ainda são EC2 nodes mas gerenciados pela AWS
- ECR Lifecycle Policy evita acúmulo de imagens antigas; usar para controle de custos
- EKS tem custo fixo de cluster ($0,10/hora ≈ $72/mês); ECS não cobra pelo cluster
- Para portabilidade multi-cloud: EKS (Kubernetes) é mais adequado que ECS
- VPC CNI no EKS = pods com IPs da VPC (como awsvpc no ECS) — importante para segurança e roteamento
- ECS Auto Scaling escala tasks; Capacity Provider escala o cluster EC2 subjacente automaticamente
- Service Connect = nova alternativa ao App Mesh para comunicação service-to-service no ECS
Credito autoral: Thiago Cardoso - LinkedIn