<h2>Fundamentos do ECS com Fargate: Arquitetura e Componentes</h2>
<p>O Amazon ECS (Elastic Container Service) é um serviço gerenciado para orquestração de containers que simplifica o deployment de aplicações Docker em produção. Quando você usa Fargate, a AWS cuida da infraestrutura subjacente — você paga apenas pelos recursos que consome, sem gerenciar instâncias EC2. Três pilares sustentam essa arquitetura: Task Definitions (o blueprint do seu container), Services (que mantém tarefas rodando continuamente) e Service Discovery (o mecanismo que permite que seus serviços se encontrem).</p>
<p>Uma Task Definition é essencialmente um arquivo de configuração que descreve como rodar uma imagem Docker no ECS. Ela especifica qual imagem usar, quanto CPU e memória alocar, variáveis de ambiente, volumes e muito mais. Um Service, por sua vez, garante que um número específico de task definitions esteja sempre em execução, reiniciando automaticamente qualquer tarefa que falhe. O Service Discovery resolve o problema clássico de microsserviços: como um container sabe onde encontrar outro quando os endereços IP podem mudar dinamicamente?</p>
<h2>Criando Task Definitions Profissionais</h2>
<p>Uma Task Definition bem estruturada é crucial para a confiabilidade em produção. Você define a memória mínima (soft limit) e máxima (hard limit), configurando assim a elasticidade dos seus containers. Para Fargate, as combinações de CPU e memória são específicas — por exemplo, 256 CPU (0.25 vCPU) requer entre 512MB e 3GB de memória.</p>
<pre><code class="language-json">{
"family": "meu-app-api",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "512",
"memory": "1024",
"containerDefinitions": [
{
"name": "app-container",
"image": "123456789012.dkr.ecr.us-east-1.amazonaws.com/meu-app:v1.0",
"portMappings": [
{
"containerPort": 3000,
"hostPort": 3000,
"protocol": "tcp"
}
],
"essential": true,
"environment": [
{
"name": "NODE_ENV",
"value": "production"
},
{
"name": "LOG_LEVEL",
"value": "info"
}
],
"secrets": [
{
"name": "DATABASE_PASSWORD",
"valueFrom": "arn:aws:secretsmanager:us-east-1:123456789012:secret:db-pass"
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/meu-app-api",
"awslogs-region": "us-east-1",
"awslogs-stream-prefix": "ecs"
}
},
"dependsOn": [
{
"containerName": "cloudwatch-agent",
"condition": "START"
}
]
}
],
"executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
"taskRoleArn": "arn:aws:iam::123456789012:role/ecsTaskRole"
}</code></pre>
<p>Observe que separamos <code>executionRoleArn</code> (permissões para o ECS puxar imagens e logs) de <code>taskRoleArn</code> (permissões para sua aplicação acessar AWS services). Use <code>secrets</code> via AWS Secrets Manager em vez de variáveis de ambiente simples para dados sensíveis. O <code>logDriver: awslogs</code> envia logs diretamente para CloudWatch, essencial para debugging em produção.</p>
<h2>Configurando Services com Auto Scaling e Service Discovery</h2>
<p>Um ECS Service mantém suas tarefas saudáveis e gerencia balanceamento de carga. Para produção, você deve usar um Application Load Balancer (ALB) para distribuir tráfego e configurar health checks rigorosos. Service Discovery permite que seus microsserviços se comuniquem sem hardcoding de IPs — use AWS Cloud Map para isso.</p>
<pre><code class="language-json">{
"serviceName": "meu-app-service",
"cluster": "producao",
"taskDefinition": "meu-app-api:2",
"desiredCount": 3,
"launchType": "FARGATE",
"networkConfiguration": {
"awsvpcConfiguration": {
"subnets": [
"subnet-0a1b2c3d4e5f",
"subnet-1f2e3d4c5b6a"
],
"securityGroups": ["sg-0987654321"],
"assignPublicIp": "DISABLED"
}
},
"loadBalancers": [
{
"targetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/meu-app/abcdef1234567890",
"containerName": "app-container",
"containerPort": 3000
}
],
"deploymentConfiguration": {
"maximumPercent": 200,
"minimumHealthyPercent": 100,
"deploymentCircuitBreaker": {
"enable": true,
"rollback": true
}
},
"serviceRegistries": [
{
"registryArn": "arn:aws:servicediscovery:us-east-1:123456789012:service/srv-abcd1234"
}
],
"enableECSManagedTags": true,
"enableExecuteCommand": true
}</code></pre>
<p>A chave aqui é a estratégia de deployment: <code>maximumPercent: 200</code> permite lançar containers novos antes de remover os antigos (blue-green), enquanto <code>minimumHealthyPercent: 100</code> garante que nunca ficamos sem serviço. O <code>deploymentCircuitBreaker</code> com rollback automático previne deployments ruins de derrubarem sua produção. Para Service Discovery, registre seu serviço com Cloud Map — seus containers serão automaticamente descobertos via <code>http://meu-app-service.producao.local</code>.</p>
<h2>Service Discovery em Produção</h2>
<p>Service Discovery resolve um problema fundamental em arquiteturas de microsserviços: como você encontra outro serviço quando tudo é dinâmico? AWS Cloud Map integrado ao ECS fornece descoberta automática baseada em DNS — quando uma tarefa inicia, ela se registra automaticamente; quando termina, é removida do DNS.</p>
<pre><code class="language-yaml"># Exemplo de configuração CloudFormation para Service Discovery
ServiceDiscoveryService:
Type: AWS::ServiceDiscovery::Service
Properties:
Name: meu-app-service
NamespaceId: !Ref PrivateNamespace
DnsConfig:
RoutingPolicy: MULTIVALUE
DnsRecords:
- TTL: 60
Type: A
- TTL: 60
Type: SRV
HealthCheckCustomConfig:
FailureThreshold: 3
PrivateNamespace:
Type: AWS::ServiceDiscovery::PrivateDnsNamespace
Properties:
Name: producao.local
Vpc: vpc-0123456789abcdef0</code></pre>
<p>Em sua aplicação, use simplesmente <code>http://meu-app-service.producao.local:3000</code> para chamar outro serviço. A resolução DNS retorna todos os IPs saudáveis dinamicamente. Para auto scaling, configure políticas baseadas em CPU ou memória usando AWS Application Auto Scaling — defina target tracking de 70% de CPU para manter performance sem over-provisioning.</p>
<h2>Conclusão</h2>
<p>Você domina agora os três pilares do ECS com Fargate em produção: <strong>(1)</strong> Task Definitions bem estruturadas com separação clara de roles IAM e gerenciamento de secrets via Secrets Manager; <strong>(2)</strong> Services com deployment strategies seguras, health checks rigorosos e integração com ALB; <strong>(3)</strong> Service Discovery automático via Cloud Map para comunicação confiável entre microsserviços. O próximo passo é implementar observabilidade completa com CloudWatch Logs, X-Ray para tracing distribuído e alertas via SNS para mudanças críticas.</p>
<h2>Referências</h2>
<ul>
<li><a href="https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html" target="_blank" rel="noopener noreferrer">AWS ECS Documentation - Fargate Launch Type</a></li>
<li><a href="https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html" target="_blank" rel="noopener noreferrer">Task Definition Parameters Reference</a></li>
<li><a href="https://docs.aws.amazon.com/cloud-map/latest/dg/what-is-cloud-map.html" target="_blank" rel="noopener noreferrer">AWS Cloud Map Service Discovery</a></li>
<li><a href="https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-configure-deployment.html" target="_blank" rel="noopener noreferrer">ECS Service Deployment Strategies</a></li>
<li><a href="https://docs.aws.amazon.com/wellarchitected/latest/userguide/workloads.html" target="_blank" rel="noopener noreferrer">Production Readiness Checklist - AWS Well-Architected Framework</a></li>
</ul>