AWS Admin

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

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

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 IP podem mudar dinamicamente?

Criando Task Definitions Profissionais

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.

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

Observe que separamos executionRoleArn (permissões para o ECS puxar imagens e logs) de taskRoleArn (permissões para sua aplicação acessar AWS services). Use secrets via AWS Secrets Manager em vez de variáveis de ambiente simples para dados sensíveis. O logDriver: awslogs envia logs diretamente para CloudWatch, essencial para debugging em produção.

Configurando Services com Auto Scaling e Service Discovery

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.

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

A chave aqui é a estratégia de deployment: maximumPercent: 200 permite lançar containers novos antes de remover os antigos (blue-green), enquanto minimumHealthyPercent: 100 garante que nunca ficamos sem serviço. O deploymentCircuitBreaker 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 http://meu-app-service.producao.local.

Service Discovery em Produção

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.

# 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

Em sua aplicação, use simplesmente http://meu-app-service.producao.local:3000 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.

Conclusão

Você domina agora os três pilares do ECS com Fargate em produção: (1) Task Definitions bem estruturadas com separação clara de roles IAM e gerenciamento de secrets via Secrets Manager; (2) Services com deployment strategies seguras, health checks rigorosos e integração com ALB; (3) 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.

Referências


Artigos relacionados