AWS EC2: виртуальные серверы

EC2 (Elastic Compute Cloud) — сервис виртуальных серверов AWS: выбираешь тип инстанса, операционную систему и запускаешь сервер в облаке за секунды.

Зачем нужно

EC2 — это полноценный Linux-сервер в облаке, которым разработчик управляет как своим VPS. В отличие от serverless, здесь есть полный контроль над окружением, возможность запускать Docker, настраивать systemd-сервисы и долгоживущие процессы. EC2 масштабируется от t3.micro (бесплатный tier) до сотен ядер.

Где используется

  • Хостинг Node.js / Python backend API
  • Запуск Docker-контейнеров (без Kubernetes)
  • Self-hosted базы данных или Redis (когда RDS/ElastiCache дорог)
  • Build-серверы, воркеры очередей

Основной контент

Запуск инстанса через AWS CLI

# Создать key pair для SSH
aws ec2 create-key-pair \
  --key-name my-key \
  --query 'KeyMaterial' \
  --output text > my-key.pem
chmod 400 my-key.pem

# Запустить инстанс (Amazon Linux 2023, t3.micro)
aws ec2 run-instances \
  --image-id ami-0c55b159cbfafe1f0 \
  --instance-type t3.micro \
  --key-name my-key \
  --security-group-ids sg-xxxxxxxxx \
  --subnet-id subnet-xxxxxxxxx \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=my-api}]'

# Получить публичный IP
aws ec2 describe-instances \
  --filters "Name=tag:Name,Values=my-api" \
  --query 'Reservations[*].Instances[*].PublicIpAddress' \
  --output text

Подключение и базовая настройка

# SSH-подключение
ssh -i my-key.pem ec2-user@<PUBLIC_IP>

# Установка Node.js на Amazon Linux 2023
sudo dnf install -y nodejs npm

# Или через nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install 20
nvm use 20

User Data — автоматическая настройка при запуске

# user-data.sh — выполняется при первом запуске инстанса
#!/bin/bash
dnf update -y
dnf install -y docker
systemctl start docker
systemctl enable docker
usermod -aG docker ec2-user

# Установка docker compose plugin
DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 \
  -o $DOCKER_CONFIG/cli-plugins/docker-compose
chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
# Запуск с user-data
aws ec2 run-instances \
  --user-data file://user-data.sh \
  --image-id ami-0c55b159cbfafe1f0 \
  --instance-type t3.micro \
  --key-name my-key

Security Groups (правила firewall)

# Открыть порты 22 (SSH), 80 (HTTP), 443 (HTTPS)
aws ec2 authorize-security-group-ingress \
  --group-id sg-xxxxxxxxx \
  --protocol tcp --port 22 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress \
  --group-id sg-xxxxxxxxx \
  --protocol tcp --port 80 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress \
  --group-id sg-xxxxxxxxx \
  --protocol tcp --port 443 --cidr 0.0.0.0/0

Типы инстансов (для веб-разработчика)

Тип vCPU RAM Назначение
t3.micro 2 1 GB Free tier, маленький API
t3.small 2 2 GB Небольшой прод
t3.medium 2 4 GB Средняя нагрузка
c5.large 2 4 GB CPU-интенсивные задачи

Частые ошибки

  • Открывать порт 22 (SSH) для 0.0.0.0/0 в продакшне — ограничь своим IP
  • Хранить секреты в User Data (они видны в консоли AWS) — используй AWS Secrets Manager
  • Не использовать Elastic IP — публичный IP меняется при перезапуске
  • Забыть остановить инстанс — EC2 тарифицируется за время работы

Связанные темы

Ресурсы