Перейти до вмісту

Модуль 1.7: Elastic Container Service (ECS) та Fargate

Час на виконання: 3 години

Розділ «Час на виконання: 3 години»

Перед початком цього модуля ви повинні завершити:


Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

У грудні 2020 року велика авіакомпанія США використовувала систему бронювання на флоті EC2-екземплярів. Під час святкового сплеску трафік зріс утричі. Команда операторів намагалася запустити нові сервери, але процес підготовки — встановлення залежностей, завантаження образів, реєстрація в балансувальнику — займав 8 хвилин на кожну машину. Протягом цих 8 хвилин клієнти бачили помилки таймауту. Бронювання зривалися. Збитки оцінили у $2.3 мільйона лише за цей інцидент.

Через шість тижнів вони перейшли на ECS на базі Fargate. Наступний сплеск трафіку Fargate обробив, запускаючи нові контейнери менш ніж за 15 секунд. Жодних EC2 для налаштування. Жодних AMI для підтримки. Трафік зріс у 4 рази, але цього ніхто не помітив — система просто працювала.

Amazon Elastic Container Service (ECS) — це нативна платформа оркестрації контейнерів від AWS. Якщо Kubernetes — це швейцарський ніж, то ECS — це спеціалізований хірургічний інструмент для запуску контейнерів саме в AWS. Він глибоко інтегрований з кожним сервісом AWS — IAM, VPC, ALB, CloudWatch, Secrets Manager. У поєднанні з Fargate (безсерверні обчислення для контейнерів) ECS дозволяє фокусуватися на додатку, а не на інфраструктурі під ним.

У цьому модулі ви вивчите ECS з нуля: кластери, Task Definitions, сервіси, типи запуску (EC2 та Fargate), інтеграцію з ALB, ролі IAM та відладку через ECS Exec. Наприкінці ви розгорнете мікросервіс на Fargate за балансувальником навантаження.


Огляд архітектури ECS

Розділ «Огляд архітектури ECS»

ECS базується на кількох основних концепціях, що вкладаються одна в одну як матрьошки.

Архітектура ECS:
+------------------------------------------------------------------+
| ECS Cluster |
| (Логічне групування сервісів та задач) |
| |
| +---------------------------+ +-----------------------------+ |
| | Сервіс: api-service | | Сервіс: worker-service | |
| | Desired count: 3 | | Desired count: 2 | |
| | Launch type: FARGATE | | Launch type: FARGATE | |
| | | | | |
| | +-------+ +-------+ +--+ | | +-------+ +-------+ | |
| | | Task | | Task | |T | | | | Task | | Task | | |
| | | (api) | | (api) | |(a)| | | |(work)| |(work)| | |
| | +-------+ +-------+ +--+ | | +-------+ +-------+ | |
| +---------------------------+ +-----------------------------+ |
+------------------------------------------------------------------+

Cluster (Кластер): Логічне групування задач та сервісів. Це не обчислювальний ресурс сам по собі, а скоріше простір імен.

Task Definition (Визначення задачі): JSON-шаблон, що описує, як запускати контейнери. Вказує образ, ресурси (CPU/RAM), порти, змінні оточення та ролі IAM. Має версії (revisions).

Task (Задача): Запущений екземпляр Task Definition. Одна задача може містити кілька контейнерів, що мають спільну мережу і бачать один одного через localhost.

Service (Сервіс): Конфігурація, що підтримує потрібну кількість запущених задач. Якщо задача падає, сервіс запускає нову.

Це головне архітектурне рішення в ECS.

АспектEC2 Launch TypeFargate Launch Type
ІнфраструктураВи керуєте EC2 віртуалкамиAWS керує обчисленнями
ОплатаЗа сервери EC2 (навіть якщо вони пусті)За кожну задачу (секундна тарифікація)
МасштабуванняТреба масштабувати і сервери, і задачіМасштабуються тільки задачі
Час запускуСекунди (на готових серверах)45-90 секунд (холодний старт)
Патчі ОСВаша відповідальністьБере на себе AWS
Коли обиратиКоли потрібен повний контроль над залізом або GPUУ всіх інших випадках (рекомендовано)

Task Definitions: Креслення контейнера

Розділ «Task Definitions: Креслення контейнера»

Ось як виглядає професійне визначення задачі для Fargate:

{
"family": "api-service",
"networkMode": "awsvpc",
"requiresCompatibilities": ["FARGATE"],
"cpu": "512",
"memory": "1024",
"executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
"taskRoleArn": "arn:aws:iam::123456789012:role/api-task-role",
"containerDefinitions": [
{
"name": "api",
"image": "123456789012.dkr.ecr.us-east-1.amazonaws.com/myapp/api:v1.3.0",
"portMappings": [
{ "containerPort": 8080, "protocol": "tcp" }
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/api-service",
"awslogs-region": "us-east-1",
"awslogs-stream-prefix": "api"
}
}
}
]
}

Ролі IAM: Execution Role vs Task Role

Розділ «Ролі IAM: Execution Role vs Task Role»

Це концепція, яку часто плутають:

  1. Task Execution Role: Використовується агентом ECS для запуску задачі (завантажити образ із ECR, відправити логи в CloudWatch, отримати секрети з Secrets Manager).
  2. Task Role: Використовується вашим кодом всередині контейнера (прочитати файл з S3, зробити запит до DynamoDB).

Сервіси та балансування навантаження

Розділ «Сервіси та балансування навантаження»

Сервіс гарантує, що ваш додаток завжди доступний.

Параметри розгортання:

  • maximumPercent: Скільки додаткових задач можна запустити під час оновлення (напр., 200% — подвоїти кількість на час деплою).
  • minimumHealthyPercent: Скільки задач мають залишатися в робочому стані під час оновлення (напр., 100% — спочатку запустити нові, потім вбити старі).
  • Deployment Circuit Breaker: Якщо нові задачі падають при запуску, ECS автоматично відкотить деплой до попередньої робочої версії.

ECS Exec: Відладка в реальному часі

Розділ «ECS Exec: Відладка в реальному часі»

ECS Exec дозволяє виконувати команди всередині працюючого контейнера Fargate — аналог docker exec або kubectl exec. Це набагато безпечніше за SSH, бо використовує IAM для контролю доступу та логує всі дії.

Terminal window
# Вхід у контейнер через CLI
aws ecs execute-command \
--cluster production \
--task ID_ЗАДАЧІ \
--container api \
--interactive \
--command "/bin/sh"

  1. ECS старший за публічний реліз Kubernetes. Amazon запустив ECS у квітні 2015 року. Хоча Kubernetes переміг у “війні за розуми”, ECS досі запускає більше контейнерів в AWS, ніж EKS. Величезні системи, як-от сам Amazon.com, працюють на ECS.

  2. Контейнери Fargate насправді запускаються на Firecracker microVM. Це та сама технологія віртуалізації, що забезпечує роботу AWS Lambda. Кожна задача ізольована на рівні віртуальної машини, що дає найвищий рівень безпеки в мульти-тенентному середовищі.

  3. Режим мережі awsvpc дає кожній задачі власну IP-адресу в VPC. Це означає, що групи безпеки (Security Groups) застосовуються до кожної задачі окремо, а не до хоста. Ви можете налаштувати мережевий доступ для кожного мікросервісу дуже гранулярно.


ПомилкаЧому це стаєтьсяЯк виправити
Плутанина з ролями IAMНазви схожі, документація об’ємнаExecution = для ECS (ECR/Logs). Task = для вашого коду (S3/DB)
Відсутність Circuit BreakerЦя фіча з’явилася не відразу і вимкнена за замовчуваннямЗавжди вмикайте deploymentCircuitBreaker з rollback: true, щоб невдалий деплой не тривав вічно
Публічні IP для задачЗдається простішим шляхом для доступу в інтернетЗавжди запускайте задачі в приватних підмережах через NAT Gateway або VPC Endpoints. Публічні IP — це ризик
Використання тегу latestЗручно при розробціДля продакшну використовуйте тільки версії або Git SHA. latest унеможливлює надійний відкат

1. У чому різниця між задачею (task) та сервісом (service) в ECS?

Задача — це один запущений екземпляр вашого контейнера (або групи контейнерів). Сервіс — це менеджер, який стежить, щоб потрібна кількість задач завжди працювала, автоматично їх перезапускає при збоях та інтегрує з балансувальником навантаження. Задача — це процес, сервіс — це керуючий рівень.

2. Чому для Fargate обов'язковим є режим мережі `awsvpc`?

Оскільки у Fargate немає хоста, до якого ви мали б доступ, кожна задача повинна отримати власний віртуальний мережевий інтерфейс (ENI) безпосередньо у вашій VPC. Це дає кожній задачі приватну IP-адресу і дозволяє застосовувати до неї окремі Security Groups.


Практична вправа: Деплой мікросервісу на Fargate

Розділ «Практична вправа: Деплой мікросервісу на Fargate»

У цій вправі ви розгорнете сервіс на ECS Fargate, підключите його до балансувальника та перевірите працездатність.

Terminal window
# 1. Створення кластера
aws ecs create-cluster --cluster-name kubedojo-lab
# 2. Реєстрація Task Definition (використовуйте JSON з Модуля 1.6)
aws ecs register-task-definition --cli-input-json file://task-def.json
# 3. Створення сервісу за балансувальником
aws ecs create-service \
--cluster kubedojo-lab \
--service-name my-web-app \
--task-definition api-service:1 \
--desired-count 2 \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[SUBNET_ID],securityGroups=[SG_ID]}" \
--load-balancers "targetGroupArn=TG_ARN,containerName=api,containerPort=8080"

Далі: Модуль 1.8: AWS Lambda та безсерверні патерни — перейдіть від постійно запущених контейнерів до обчислень за подіями. Ви дізнаєтеся про модель виконання Lambda, тригери та побудуєте свій перший безсерверний пайплайн.