В чем разница между EC2 и ECS в AWS?

«В чем разница между EC2 и ECS в AWS?» — вопрос из категории Облачные платформы, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

EC2 (Elastic Compute Cloud) — это сервис виртуальных серверов (инстансов), где вы полностью управляете операционной системой, устанавливаете ПО, настраиваете сеть и вручную занимаетесь масштабированием. Это инфраструктура как сервис (IaaS).

ECS (Elastic Container Service) — это сервис оркестрации контейнеров (контейнеры как сервис, CaaS). Он автоматизирует развертывание, управление и масштабирование контейнеризованных приложений, работающих поверх кластера EC2-инстансов или бессерверной платформы Fargate.

Ключевые отличия на практике:

  • Уровень абстракции: EC2 — это виртуальная машина. ECS — платформа для запуска задач (Tasks) и сервисов (Services), состоящих из одного или нескольких контейнеров.
  • Масштабирование: В EC2 вы масштабируете количество инстансов (Auto Scaling Groups). В ECS вы масштабируете количество копий задачи (desired count) в сервисе, а ECS сам распределяет их по инстансам кластера.
  • Управление состоянием: Для stateful-нагрузок (базы данных) часто используют EC2. ECS в паре с Fargate идеально подходит для stateless-микросервисов.
  • Пример использования: Веб-приложение на Node.js можно развернуть на инстансе EC2, установив Node.js и PM2. Тот же микросервис, упакованный в Docker-образ, будет запущен в ECS как задача, описанная в Task Definition.

Пример Task Definition для ECS (JSON):

{
  "family": "api-service",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "name": "app",
      "image": "123456789.dkr.ecr.eu-west-1.amazonaws.com/my-api:latest",
      "portMappings": [
        {
          "containerPort": 3000,
          "protocol": "tcp"
        }
      ],
      "environment": [
        {
          "name": "DB_HOST",
          "value": "prod-database.cluster-abc.eu-west-1.rds.amazonaws.com"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/api-service",
          "awslogs-region": "eu-west-1",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ],
  "requiresCompatibilities": ["FARGATE"],
  "cpu": "512",
  "memory": "1024"
}