Налаштування 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
- Визначте launch type (Fargate або EC2).
- Створіть кластер ECS.
- Налаштуйте Task Definition з health check та stopTimeout.
- Налаштуйте IAM Task Role та Task Execution Role.
- Створіть Service з Circuit Breaker.
- Прив'яжіть ALB Target Group.
- Налаштуйте CI/CD пайплайн (ECR + update-service).
- Перевірте автоскейлінг (HPA або ECS Service Auto Scaling).
Терміни: базове налаштування Fargate-кластера — від 3 днів. Складні проекти з EC2, Spot, автодеплоєм — 4–5 днів.
Замовте налаштування ECS під ключ — ми проведемо аудит і спроектуємо кластер. Отримайте консультацію — оцінимо ваш проект.
Підсумок: коли ECS — правильний вибір
ECS — зріла платформа для оркестрації контейнерів в AWS. Для 80% продакшен-задач функціональності достатньо, а операційна складність у рази нижча, ніж у Kubernetes. Головне — правильно налаштувати деталі: Task Definitions, IAM ролі, Circuit Breaker. Наш досвід гарантує, що ви уникнете типових помилок і заощадите до 50% інфраструктурного бюджету. Зв'яжіться з нами для консультації.







