🐛 Типичные ошибки при работе с AWS

⚡ Топ-5 ошибок

  • Регион по умолчанию: us-east-1 — данные далеко от европейских пользователей, нарушение GDPR
  • SSH 0.0.0.0/0 в production: порт 22 открыт для всего интернета — уязвимость
  • Забытые ресурсы: EC2/RDS оставлены запущенными и продолжают тарифицироваться
  • Root аккаунт для работы: никогда не работайте под root — только IAM-пользователь
  • Access Keys в коде: ключи уходят в git, взломщики мониторят репозитории 24/7

Ошибка 1: Регион по умолчанию для production

Симптом: все ресурсы создаются в us-east-1, хотя пользователи в Европе.

Проблема:

  • Задержка (latency) 80–120 мс вместо 10–30 мс
  • Нарушение GDPR — данные граждан ЕС хранятся вне ЕС
  • Транзитный трафик через Атлантику — дополнительные расходы

Решение: Перед созданием ресурсов всегда выбирайте регион явно. Для ЕС — eu-west-1 (Ирландия) или eu-central-1 (Франкфурт). Зафиксируйте регион в AWS CLI:

aws configure set region eu-central-1

Ошибка 2: Security Group с SSH открытым для всего интернета в production

Симптом: Security Group для EC2 имеет правило Inbound: Type=SSH, Port=22, Source=0.0.0.0/0.

Проблема: Порт 22, открытый для всего интернета — это постоянная атака brute-force. Боты сканируют весь IPv4 за несколько часов.

Решение для production:

  • Ограничьте Source только вашим IP: YOUR.IP.ADDRESS.HERE/32
  • Используйте AWS Systems Manager Session Manager — SSH-доступ без открытых портов
  • Настройте EC2 Instance Connect — временный доступ через консоль
Для учёбы (как в лекции): 0.0.0.0/0 допустимо, но только если инстанс создан с учебными целями и будет удалён после занятия. Не оставляйте его запущенным на ночь.

Ошибка 3: Забытые (running) ресурсы и неожиданный счёт

Симптом: в конце месяца приходит счёт на $50+, хотя думали, что всё удалили.

Проблема: EC2, RDS, NAT Gateway, Elastic IP — тарифицируются, пока запущены, даже если не используются. Elastic IP стоит денег, когда он выделен, но не привязан к запущенному инстансу.

Решение:

  • После учёбы: EC2 → Instance → Terminate (не просто Stop — при Stop EBS-том продолжает тарифицироваться)
  • RDS → Delete (и не создавайте final snapshot, если он не нужен)
  • Освободите Elastic IPs: EC2 → Elastic IPs → Release
  • Настройте AWS Budget с порогом $5/месяц и email-оповещением — это поймает забытые ресурсы
  • Проверяйте Billing Dashboard еженедельно

Ошибка 4: Работа под root-аккаунтом

Симптом: вход в консоль AWS через email + пароль (не через IAM User).

Проблема:

  • Root аккаунт имеет неограниченные права — ошибка или взлом приводят к катастрофе
  • Нельзя настроить детализированные права (IAM Policies)
  • Нельзя создать Access Keys для специфичных задач

Решение:

  1. Войдите под root один раз
  2. Создайте IAM User с правами AdministratorAccess и включите MFA
  3. Больше никогда не используйте root для повседневных задач
  4. На root-аккаунт тоже включите MFA

Ошибка 5: Access Keys в коде или git-репозитории

Симптом: в коде встречается aws_access_key_id='AKIA...' или в .env файле без .gitignore.

Проблема: Боты сканируют GitHub на наличие AWS ключей 24/7. AWS сами мониторят Partner Event Buses и отзывают скомпрометированные ключи — но к этому времени злоумышленники уже могут запустить GPU-кластер на майнинг за ваш счёт.

Решение:

# Никогда не коммитьте эти файлы!
# .gitignore
.env
*.pem
*.ppk
aws_credentials*
  • Для локальной разработки: aws configure — сохраняет ключи в ~/.aws/credentials
  • Для CI/CD: переменные окружения (GitHub Secrets, GitLab CI Variables)
  • Для EC2: IAM Role — вообще без Access Keys
  • Если ключ утёк: немедленно деактивируйте его в IAM → Users → Security credentials

Ошибка 6: Auto-assign Public IP отключён (из лекции)

Симптом: EC2 запущен, но невозможно подключиться по SSH.

Проблема: При создании EC2 не включили Auto-assign Public IP. Инстанс получил только приватный IP внутри VPC, недоступный из интернета.

Решение:

  • При создании нового инстанса: Network settings → Auto-assign Public IP: Enable
  • Для уже запущенного инстанса без публичного IP: выделите Elastic IP и привяжите к инстансу (EC2 → Elastic IPs → Allocate → Associate)
  • Проверьте, что подсеть публичная (имеет маршрут через Internet Gateway)