Налаштування Amazon ECS для production: Task Definitions, IAM, CI/CD

Контейнери в AWS запущені, але деплой перетворюється на рулетку, а рахунок за Fargate зростає без зрозумілих причин. Ми налаштовуємо Amazon ECS під ключ: проєктуємо Task Definitions, розмежовуємо IAM-ролі та вибудовуємо CI/CD, щоб релізи проходили передбачувано. Наша команда бере на себе весь цикл — від аудиту до супроводу, забезпечуючи стабільну роботу та масштабування разом із вашим бізнесом.
Часті запитання

Налаштування Amazon ECS: від Task Definition до CI/CD

Уявіть: ви запускаєте контейнери в AWS, але після чергового деплою половина задач падає з помилкою, а відкат займає годину. Або Fargate-рахунок зріс утричі, а ви не розумієте, чому. Ми зустрічали такі кейси десятки разів. Наш досвід — 12+ років у DevOps, сертифіковані інженери AWS — дозволяє уникнути цих проблем. У цій статті розберемо, як налаштувати ECS для production так, щоб не було сюрпризів. ECS дозволяє розгорнути production-кластер у 2 рази швидше, ніж Kubernetes, при менших витратах на експлуатацію. Згідно з документацією AWS, ECS — fully managed контейнерний оркестратор.

Який launch type обрати: Fargate чи EC2?

Launch type визначає, як працюють ваші контейнери. Нижче — порівняння ключових параметрів.

Параметр Fargate EC2 Launch Type
Управління нодами Ні (serverless) Повне (ASG, AMI, patching)
Масштабування Автоматичне Через ASG + Capacity Provider
Вартість За vCPU та RAM задачі За EC2-інстанси + Spot
GPU Ні Так (P3, G4, тощо)
Холодний старт ~1-2 с ~10-30 с (залежить від AMI)
Приблизне навантаження < 500 задач > 500 задач або GPU

Fargate — serverless контейнери. Не потрібно керувати нодами, патчити AMI, слідкувати за утилізацією. Платите за vCPU та RAM задачі. Вигідний для непередбачуваного навантаження, dev/staging оточень. EC2 Launch Type — ви керуєте EC2 інстансами в кластері. Потрібно налаштовувати Auto Scaling Group, оновлювати AMI. Зате: Spot Instances для зниження вартості (економія до 70% проти On-Demand), вища щільність задач, GPU. Для більшості початкових конфігурацій — Fargate. Якщо навантаження зросло — переходимо на EC2 + Spot.

Чому Task Definition — основа всього?

Task Definition — шаблон для запуску контейнера. Версіонується автоматично при кожній зміні. Важливі поля, які часто налаштовують неправильно:

  • CPU та Memory для Fargate — лише фіксовані комбінації. CPU underprovisioning — причина повільного холодного старту.
  • stopTimeout — час на graceful shutdown (максимум 120 секунд для Fargate). Якщо не виставлений — ECS вбиває контейнер через 30 секунд.
  • healthCheck на рівні Task Definition — перевіряється ECS агентом, незалежно від ALB health check:
{
  "healthCheck": {
    "command": ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"],
    "interval": 30,
    "timeout": 5,
    "retries": 3,
    "startPeriod": 60
  }
}

startPeriod — grace period для повільних додатків.

Рекомендовані параметри Task Definition

Параметр Значення за замовчуванням Рекомендація
stopTimeout 30 с 120 с для довгих запитів
startPeriod 0 с 60-120 с для довгого старту
healthCheck Немає Обов'язково налаштувати
CPU (Fargate) 256 1024 для production

Як забезпечити безпеку за допомогою IAM Task Roles?

Контейнер в ECS не повинен використовувати credentials у змінних оточення. Для доступу до AWS сервісів — IAM Task Role. Task Role автоматично надає тимчасові credentials через IMDS контейнера. SDK (boto3, aws-sdk) підхоплює їх автоматично.

resource "aws_iam_role" "task" {
  name = "myapp-ecs-task"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Principal = {
          Service = "ecs-tasks.amazonaws.com"
        }
        Action = "sts:AssumeRole"
      }
    ]
  })
}

resource "aws_iam_role_policy" "task" {
  name = "myapp-task-permissions"
  role = aws_iam_role.task.id
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Action = ["s3:GetObject", "s3:PutObject"]
        Resource = "arn:aws:s3:::myapp-bucket/*"
      },
      {
        Effect = "Allow"
        Action = ["ssm:GetParameter"]
        Resource = "arn:aws:ssm:eu-west-1:*:parameter/myapp/*"
      }
    ]
  })
}

Окремо — Task Execution Role для завантаження образу з ECR та відправки логів.

Service: Rolling Updates та Circuit Breaker

ECS Service керує підтриманням потрібної кількості запущених задач та деплоєм оновлень. Deployment Circuit Breaker — вбудований механізм захисту від поганих деплоїв. Якщо задачі не стартують здоровими — Circuit Breaker зупиняє деплой та автоматично відкочує до попередньої версії Task Definition:

resource "aws_ecs_service" "app" {
  name = "myapp"
  cluster = aws_ecs_cluster.main.id
  task_definition = aws_ecs_task_definition.app.arn
  desired_count = 3

  deployment_circuit_breaker {
    enable = true
    rollback = true
  }

  deployment_controller {
    type = "ECS"
  }
}

Без Circuit Breaker — якщо нова версія образу не стартує, ECS буде нескінченно намагатися запустити задачі.

ALB інтеграція та deregistration

ECS Service + ALB Target Group — стандартна зв'язка для веб-сервісів. При scale-in або деплої ECS спочатку deregisters задачу з ALB, ALB дренує з'єднання (deregistration_delay — за замовчуванням 300 секунд), потім ECS зупиняє контейнер. Для швидких деплоїв deregistration_delay можна знизити до 30–60 секунд.

Як налаштувати CI/CD для ECS?

Стандартний деплой-пайплайн:

# Build та push образу в ECR
aws ecr get-login-password --region eu-west-1 | \
  docker login --username AWS --password-stdin \
  ${AWS_ACCOUNT_ID}.dkr.ecr.eu-west-1.amazonaws.com

docker build -t myapp:${GIT_SHA} .
docker tag myapp:${GIT_SHA} \
  ${AWS_ACCOUNT_ID}.dkr.ecr.eu-west-1.amazonaws.com/myapp:${GIT_SHA}
docker push ${AWS_ACCOUNT_ID}.dkr.ecr.eu-west-1.amazonaws.com/myapp:${GIT_SHA}

# Оновлення Task Definition та деплой Service
aws ecs update-service \
  --cluster myapp-cluster \
  --service myapp \
  --task-definition myapp:$(aws ecs register-task-definition \
    --cli-input-json "$(cat taskdef.json | sed 's/IMAGE_TAG/${GIT_SHA}/g')" \
    --query 'taskDefinition.revision' --output text) \
  --force-new-deployment

Що входить в роботу?

При замовленні налаштування ECS під ключ ми надаємо:

  • Аудит поточної інфраструктури — оцінюємо навантаження, вартість, вузькі місця.
  • Проектування кластера — вибір launch type, налаштування VPC, підмереж, security groups.
  • Terraform-модулі — вся конфігурація як код, включаючи IAM, ALB, ECR.
  • CI/CD конвеєр — інтеграція з GitLab/GitHub Actions, автоматичні деплої.
  • Документація та runbooks — інструкції з експлуатації, оновлення, відкату.
  • Підтримка після запуску — 2 тижні моніторингу та коригування.

Чек-лист налаштування ECS

  1. Визначте launch type (Fargate або EC2).
  2. Створіть кластер ECS.
  3. Налаштуйте Task Definition з health check та stopTimeout.
  4. Налаштуйте IAM Task Role та Task Execution Role.
  5. Створіть Service з Circuit Breaker.
  6. Прив'яжіть ALB Target Group.
  7. Налаштуйте CI/CD пайплайн (ECR + update-service).
  8. Перевірте автоскейлінг (HPA або ECS Service Auto Scaling).

Терміни: базове налаштування Fargate-кластера — від 3 днів. Складні проекти з EC2, Spot, автодеплоєм — 4–5 днів.

Замовте налаштування ECS під ключ — ми проведемо аудит і спроектуємо кластер. Отримайте консультацію — оцінимо ваш проект.

Підсумок: коли ECS — правильний вибір

ECS — зріла платформа для оркестрації контейнерів в AWS. Для 80% продакшен-задач функціональності достатньо, а операційна складність у рази нижча, ніж у Kubernetes. Головне — правильно налаштувати деталі: Task Definitions, IAM ролі, Circuit Breaker. Наш досвід гарантує, що ви уникнете типових помилок і заощадите до 50% інфраструктурного бюджету. Зв'яжіться з нами для консультації.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1393
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1368
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    815
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1139