Cloud & Infraestrutura

Como Usar ECS com Fargate: Task Definitions, Services e Service Discovery em Produção

8 min de leitura

Como Usar ECS com Fargate: Task Definitions, Services e Service Discovery em Produção

Fundamentos do ECS com Fargate: Arquitetura e Componentes 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). 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

<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">{

&quot;family&quot;: &quot;meu-app-api&quot;,

&quot;networkMode&quot;: &quot;awsvpc&quot;,

&quot;requiresCompatibilities&quot;: [&quot;FARGATE&quot;],

&quot;cpu&quot;: &quot;512&quot;,

&quot;memory&quot;: &quot;1024&quot;,

&quot;containerDefinitions&quot;: [

{

&quot;name&quot;: &quot;app-container&quot;,

&quot;image&quot;: &quot;123456789012.dkr.ecr.us-east-1.amazonaws.com/meu-app:v1.0&quot;,

&quot;portMappings&quot;: [

{

&quot;containerPort&quot;: 3000,

&quot;hostPort&quot;: 3000,

&quot;protocol&quot;: &quot;tcp&quot;

}

],

&quot;essential&quot;: true,

&quot;environment&quot;: [

{

&quot;name&quot;: &quot;NODE_ENV&quot;,

&quot;value&quot;: &quot;production&quot;

},

{

&quot;name&quot;: &quot;LOG_LEVEL&quot;,

&quot;value&quot;: &quot;info&quot;

}

],

&quot;secrets&quot;: [

{

&quot;name&quot;: &quot;DATABASE_PASSWORD&quot;,

&quot;valueFrom&quot;: &quot;arn:aws:secretsmanager:us-east-1:123456789012:secret:db-pass&quot;

}

],

&quot;logConfiguration&quot;: {

&quot;logDriver&quot;: &quot;awslogs&quot;,

&quot;options&quot;: {

&quot;awslogs-group&quot;: &quot;/ecs/meu-app-api&quot;,

&quot;awslogs-region&quot;: &quot;us-east-1&quot;,

&quot;awslogs-stream-prefix&quot;: &quot;ecs&quot;

}

},

&quot;dependsOn&quot;: [

{

&quot;containerName&quot;: &quot;cloudwatch-agent&quot;,

&quot;condition&quot;: &quot;START&quot;

}

]

}

],

&quot;executionRoleArn&quot;: &quot;arn:aws:iam::123456789012:role/ecsTaskExecutionRole&quot;,

&quot;taskRoleArn&quot;: &quot;arn:aws:iam::123456789012:role/ecsTaskRole&quot;

}</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">{

&quot;serviceName&quot;: &quot;meu-app-service&quot;,

&quot;cluster&quot;: &quot;producao&quot;,

&quot;taskDefinition&quot;: &quot;meu-app-api:2&quot;,

&quot;desiredCount&quot;: 3,

&quot;launchType&quot;: &quot;FARGATE&quot;,

&quot;networkConfiguration&quot;: {

&quot;awsvpcConfiguration&quot;: {

&quot;subnets&quot;: [

&quot;subnet-0a1b2c3d4e5f&quot;,

&quot;subnet-1f2e3d4c5b6a&quot;

],

&quot;securityGroups&quot;: [&quot;sg-0987654321&quot;],

&quot;assignPublicIp&quot;: &quot;DISABLED&quot;

}

},

&quot;loadBalancers&quot;: [

{

&quot;targetGroupArn&quot;: &quot;arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/meu-app/abcdef1234567890&quot;,

&quot;containerName&quot;: &quot;app-container&quot;,

&quot;containerPort&quot;: 3000

}

],

&quot;deploymentConfiguration&quot;: {

&quot;maximumPercent&quot;: 200,

&quot;minimumHealthyPercent&quot;: 100,

&quot;deploymentCircuitBreaker&quot;: {

&quot;enable&quot;: true,

&quot;rollback&quot;: true

}

},

&quot;serviceRegistries&quot;: [

{

&quot;registryArn&quot;: &quot;arn:aws:servicediscovery:us-east-1:123456789012:service/srv-abcd1234&quot;

}

],

&quot;enableECSManagedTags&quot;: true,

&quot;enableExecuteCommand&quot;: 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>

Comentários

Mais em Cloud & Infraestrutura

Dominando Redshift e Athena: Data Warehouse e Query Serverless em S3 em Projetos Reais
Dominando Redshift e Athena: Data Warehouse e Query Serverless em S3 em Projetos Reais

Entendendo Redshift e Athena: Duas Abordagens para Data Warehouse Redshift e...

Dominando AWS Config e CloudTrail: Compliance, Auditoria e Rastreabilidade em Projetos Reais
Dominando AWS Config e CloudTrail: Compliance, Auditoria e Rastreabilidade em Projetos Reais

AWS Config: Fundação da Compliance Contínua O AWS Config é um serviço que mon...

Dominando Kinesis: Data Streams, Firehose e Analytics para Dados em Tempo Real em Projetos Reais
Dominando Kinesis: Data Streams, Firehose e Analytics para Dados em Tempo Real em Projetos Reais

Entendendo os Três Pilares do Kinesis O AWS Kinesis é um serviço gerenciado p...