Вибір між EC2, ECS та EKS для завдань на Node.js
Порівнює, як EC2, ECS з Fargate та EKS обробляють роботу додатків на Node.js з точки зору експлуатації, що допомагає вам обрати правильний сервіс обчислень AWS відповідно до масштабу та навичок вашої команди.
Джерела: EC2 vs ECS vs EKS for Node.js: Which AWS Service Should You Actually Choose?
Коли настає час перенести бекенд на Node.js на Amazon Web Services, доводиться майже негайно приймати рішення. Консоль AWS пропонує щонайменше три окремі продукти обчислювальних ресурсів: Amazon EC2, Amazon ECS та Amazon EKS.
Якщо запитати інших, ви отримаєте суперечливі поради. Деякі розробники стверджують, що звичайна віртуальна машина на EC2 — це найпростіший та найкращий варіант. Інші наполягають на тому, що ніщо не може замінити використання Kubernetes через EKS, якщо потрібна справді сучасна архітектура. Тим часом багато команд, які працюють з продакшн-платформами, тихо стандартизувалися на ECS для всіх своїх мікросервісів.
Вибір неправильного інструменту зазвичай призводить до двох розчаровуючих наслідків: або ви змушені вручну виправляти операційні системи та доглядати за серверами, або ви потрапляєте у хаос через конфігураційні файли Kubernetes, лише щоб підтримувати у роботі невеликий API на базі Express — такий, який може обробляти лише кілька десятків запитів на секунду.
Це порівняння відкидає всю рекламу та безпосередньо аналізує, як EC2, ECS та EKS підходять саме для додатків на Node.js: які вимоги кожен з них ставить до роботи вашої команди та як ви можете обрати найкращий варіант для своєї ситуації.
Три сервіси пояснені просто
Перш ніж порівнювати переваги та недоліки, корисно чітко визначити, що саме являє собою кожен сервіс.
+-------------------------------------------------------------------------+
| Amazon EKS |
| Fully managed Kubernetes. High control, high complexity, multi-cloud. |
+-------------------------------------------------------------------------+
▲
│ Built for complex orchestration
+-------------------------------------------------------------------------+
| Amazon ECS |
| AWS-native container orchestration. Fast, simple, deeply integrated. |
+-------------------------------------------------------------------------+
▲
│ Built for containers
+-------------------------------------------------------------------------+
| Amazon EC2 |
| Raw virtual machines in the cloud. Full OS access, manual maintenance.|
+-------------------------------------------------------------------------+
1. Amazon EC2 (Elastic Compute Cloud)
EC2 надає вам віртуальну машину, яку називають „інстанцією“. Ви обираєте операційну систему — поширеними варіантами є Ubuntu та Amazon Linux — уходите підключенням через SSH, встановлюєте Node.js разом із менеджером процесів на кшталт PM2 та самостійно запускаєте своє застосунок.
Усе, що знаходиться вище ядра, знаходиться під вашим прямим контролем.
2. Amazon ECS (Elastic Container Service)
ECS — це власна система AWS для оркестрації контейнерів Docker. Замість прямого керування операційною системою ви створюєте свій застосунок на Node.js у вигляді образу Docker та даєте вказівку ECS підтримувати певну кількість працюючих та справних копій цього контейнера — скажімо, чотири репліки.
Якщо поєднати ECS із AWS Fargate, його безсерверним шаром обчислень, ви повністю звільняєтесь від необхідності керувати серверами, які знаходяться під контейнерами. AWS автоматично виділяє CPU та пам’ять для кожного контейнера в залежності від навантаження.
3. Amazon EKS (Elastic Kubernetes Service)
EKS надає керовані кластери Kubernetes на основі інфраструктури AWS. Сам Kubernetes — це стандарт оркестрації контейнерів з відкритим кодом, який був створений у Google.
За допомогою EKS AWS бере на себе відповідальність за контрольний план Kubernetes — мастер-вузли, тоді як ви все ще несете відповідальність за визначення подів, розгортань, сервісів, правил входу та мережевих політик.
Чому тут важливі характеристики Node.js
Перш ніж обрати певний сервіс, варто згадати кілька моментів щодо того, як насправді працює Node.js:
- Виконання JavaScript відбувається у одному потоці: процес Node.js використовує лише один ядро CPU для запуску вашого JS-коду. Якщо розмістити один процес на інстанції EC2 з 8 ядрами, сім з них залишаться невикористаними, якщо ви не запустите спеціально кластер процесів чи не розподілите роботу між кількома інстанціями.
- Швидке запуск та невеликі вимоги до ресурсів: додаток Node.js у контейнері зазвичай може почати працювати менш ніж за дві секунди, що робить його ідеальним для середовищ, побудованих на основі контейнерів та автомасштабування.
- Робочі навантаження здебільшого є I/O-орієнтованими: більшість сервісів Node.js проводять більшу частину часу у очікуванні від баз даних, зовнішніх API-запитів чи операцій з диском, а не виконуючи інтенсивні обчислення на CPU.
Ці характеристики безпосередньо впливають на те, наскільки простим — або складним — буде масштабування у кожному з трьох сервісів.
1. Amazon EC2: максимальний контроль, інтенсивне технічне обслуговування
Робота з EC2 дуже схожа на розробку на власному Linux-сервері, адже по суті це і є такий сервер.
Bash
# Typical manual setup on an EC2 instance:
sudo apt update && sudo apt install -y nodejs npm
git clone https://github.com/your-org/api.git
cd api && npm ci --omit=dev
npm install -g pm2
pm2 start app.js -i max
Traffic ──> Application Load Balancer (ALB)
│
┌────────┴────────┐
▼ ▼
[EC2 Instance] [EC2 Instance]
├─ Node Process ├─ Node Process
├─ Node Process ├─ Node Process
└─ PM2 Manager └─ PM2 Manager
Переваги:
- Прогнозована ціна: ви платите фіксовану годинну ставку, залежну від обраного розміру інстанції.
- Повний доступ до системи: ви можете переглядати журнали системи, налаштовувати параметри ядра за допомогою
sysctlчи встановлювати будь-які нативні бібліотеки, необхідні вашому додатку.
Недоліки:
Робота з вантажем у продакшені на EC2 потребує значних зусиль у технічному обслуговуванні. Ви несете відповідальність за:
- Застосування патчів безпеки операційної системи.
Практичний погляд розробника: EC2 добре підходить для одного монолітичного додатку, який майже не змінюється. Але коли ви використовуєте три чи чотири мікросервіси, розміщення їх на окремих інстанціях EC2 або марнує ресурси, або змушує вас використовувати заплутану конфігурацію спільного сервера.
2. Amazon ECS: ідеальний вибір для більшості команд
Якщо ваш додаток на Node.js вже знаходиться у контейнері Docker, ECS, як правило, є найефективнішим варіантом у AWS.
Написати кодовий файл Dockerfile для продакшн-додатку на Node.js не складно:
# Multi-stage Dockerfile for Node.js
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
FROM node:20-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
USER node
EXPOSE 3000
CMD ["node", "server.js"]
Як тільки ви завантажите це зображення до Amazon ECR (Elastic Container Registry), ви створюєте ECS Task Definition, яка визначає:
- Розподіл CPU (наприклад,
0.5 vCPU) та пам’яті (наприклад,1 GB) для контейнера. - Змінні середовища, отримані з AWS Secrets Manager або Parameter Store.
- Кінцеві точки перевірки стану.
Traffic ──> ALB
│
├── Path /api/users ──> [ECS Task: Users] (0.5 vCPU)
└── Path /api/orders ─> [ECS Task: Orders] (0.5 vCPU)
[ECS Task: Orders] (0.5 vCPU)
Чому ECS з Fargate ідеально підходить для Node.js:
Поєднання ECS з Fargate повністю усуває серверний шар — немає потреби керувати базовими інстанцями EC2.
Під час сплеску трафіку ECS може створити п’ять нових завдань протягом кількох секунд. Оскільки процеси Node.js використовують мало ресурсів, можна налаштовувати обчислювальні ресурси у дрібних порціях (0.25 vCPU та 512 MB RAM), що дозволяє тримати неактивну потужність — та витрати — майже на рівні нуля.
Компроміси:
- Залежність від AWS: конфігурація ECS є специфічною для AWS. JSON-опис завдань, який ви створюєте для ECS, не може бути перенесений до Google Cloud чи Azure без додаткової роботи.
- Обмежена екосистема інструментів: ECS гармонійно інтегрується з CloudWatch та IAM, але у нього значно менше екосистеми сторонніх плагінів, ніж у Kubernetes.
3. Amazon EKS: масштабування та портативність на рівні корпорацій
EKS — це сервіс Kubernetes під управлінням AWS. Kubernetes дозволяє не лише запускати контейнери, а й надає спільну платформу для мережевих з’єднань, виявлення сервісів, поступового розгортання та керування конфіденційними даними.
У EKS розгортання Node.js описується за допомогою маніфестів Kubernetes:
apiVersion: apps/v1
kind: Deployment
metadata:
name: node-api
spec:
replicas: 3
selector:
matchLabels:
app: node-api
template:
metadata:
labels:
app: node-api
spec:
containers:
- name: node-api
image: 123456789012.dkr.ecr.us-east-1.amazonaws.com/node-api:v1.2.0
resources:
limits:
cpu: "500m"
memory: "512Mi"
requests:
cpu: "250m"
memory: "256Mi"
ports:
- containerPort: 3000
Переваги:
- Справжня портативність: ті самі YAML-маніфести будуть працювати в EKS, GKE від Google, AKS від Azure чи на серверах у вашому власному дата-центрі.
- Широка екосистема: інструменти на кшталт Helm, ArgoCD, Prometheus та Istio інтегруються за допомогою стандартної конфігурації.
- Точний контроль автомасштабування: ви можете масштабувати поди на основі користувацьких метрик — таких як кількість повідомлень у черзі SQS чи розмір буфера Redis — за допомогою KEDA (Kubernetes Event-driven Autoscaling).
Компроміси:
Kubernetes також створює значний операційний тягар:
- Витрати на план керування: EKS стягує приблизно 73 долари на місяць за кластер лише для підтримки роботи плану керування, окремо від витрат на робочі вузли та запуск контейнерів.
Поширена помилка: Іноді команди обирають EKS лише через те, що Kubernetes є стандартом у галузі. Для невеликої інженерної команди — з менше ніж 15 розробниками — підтримка роботи кластера Kubernetes може зайняти від 20 до 30 відсотків часу старшого інженера на тиждень, час, який інакше можна було б використати на розробку самого продукту.
Пряме порівняння
| Функція | Amazon EC2 | Amazon ECS (Fargate) | Amazon EKS |
|---|---|---|---|
| Рівень абстракції | Віртуальні машини | Контейнери | Контейнери та Podи |
| Складність налаштування | Низька | Низька–середня |
Практичний спосіб прийняття рішення
Замість того, щоб мучитися через кожну функцію, скористайтеся цим простим критерієм:
Обирайте EC2, коли:
- Ваша додаток на Node.js є застарілою та залежить від локальних фонових демонів, програмного забезпечення, специфічного для операційної системи, або файлів, які мають зберігатися на локальному диску.
- Ви створюєте тимчасовий прототип на сервері за $5 на місяць, де єдиним важливим фактором є ціна.
Обирайте ECS з Fargate, коли:
- Ви хочете запускати сучасні, контейнеризовані сервіси на Node.js без необхідності контролю за операційною системою.
- У вашій команді є інженери бекенду без спеціаліста з інфраструктури чи DevOps.
- Ви повністю орієнтуєтесь на екосистему AWS (DynamoDB, SQS, RDS, IAM) та хочете інтеграцію безпеки, яка працює автоматично.
- Ця конфігурація підходить приблизно для 80 відсотків компаній, які працюють з AWS, тому є розумним стандартом.
Обирайте EKS, коли:
- Ви керуєте десятками чи сотнями мікросервісів, створених на різних мовах програмування, таких як Node.js, Go, Python та Java.
- У вашій організації вимагається підхід багатохмарності чи гібридної хмарності, який потребує єдиних інструментів у всіх середовищах.
- У вас вже є платформа чи команда SRE, здатна ефективно відстежувати, захищати та оновлювати кластери Kubernetes.
Підсумок
Хороша архітектура хмари — це не вибір найяскравішої доступної технології; це вибір того, що дозволяє вирішити проблему з мінімальними витратами на технічне обслуговування.
Щодо Node.js зокрема:
- EC2 надає вам повний контроль, але змушує брати на себе рутинне обслуговування серверів.
- EKS забезпечує величезні можливості та здатність переміщуватися між екосистемами, але це супроводжується значною складністю та додатковими витратами на керування кластером.
Розумний підхід — почати з малого: запакуйте свій додаток у легкий Docker-контейнер, спочатку запустіть його на ECS, а лише пізніше перейдіть на Kubernetes, якщо ваша організація справді переросте цей інструмент. Оскільки сам контейнер не змінюється, він вже готовий до використання в EKS у момент, коли це станеться.