Настройка 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, etc.) |
| Холодный старт | ~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% инфраструктурного бюджета. Свяжитесь с нами для консультации.







