Модуль 1.7: Elastic Container Service (ECS) та Fargate
Складність: [COMPLEX]
Розділ «Складність: [COMPLEX]»Час на виконання: 3 години
Розділ «Час на виконання: 3 години»Передумови
Розділ «Передумови»Перед початком цього модуля ви повинні завершити:
- Модуль 1.2: VPC та основи мереж
- Модуль 1.6: Elastic Container Registry (ECR)
- Базове розуміння контейнерів та Docker
- Знайомство з форматом JSON
- AWS CLI налаштований з відповідними дозволами
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»У грудні 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 (Сервіс): Конфігурація, що підтримує потрібну кількість запущених задач. Якщо задача падає, сервіс запускає нову.
EC2 Launch Type vs Fargate
Розділ «EC2 Launch Type vs Fargate»Це головне архітектурне рішення в ECS.
| Аспект | EC2 Launch Type | Fargate 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»Це концепція, яку часто плутають:
- Task Execution Role: Використовується агентом ECS для запуску задачі (завантажити образ із ECR, відправити логи в CloudWatch, отримати секрети з Secrets Manager).
- 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 для контролю доступу та логує всі дії.
# Вхід у контейнер через CLIaws ecs execute-command \ --cluster production \ --task ID_ЗАДАЧІ \ --container api \ --interactive \ --command "/bin/sh"Чи знали ви?
Розділ «Чи знали ви?»-
ECS старший за публічний реліз Kubernetes. Amazon запустив ECS у квітні 2015 року. Хоча Kubernetes переміг у “війні за розуми”, ECS досі запускає більше контейнерів в AWS, ніж EKS. Величезні системи, як-от сам Amazon.com, працюють на ECS.
-
Контейнери Fargate насправді запускаються на Firecracker microVM. Це та сама технологія віртуалізації, що забезпечує роботу AWS Lambda. Кожна задача ізольована на рівні віртуальної машини, що дає найвищий рівень безпеки в мульти-тенентному середовищі.
-
Режим мережі
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, підключите його до балансувальника та перевірите працездатність.
# 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, тригери та побудуєте свій перший безсерверний пайплайн.