Предлагаем вашему вниманию проект Михаила Бурочкина, успешно окончившего курс “Cloud Solution Architecture”.

Я работаю над разработкой 3-уровневой архитектуры веб-приложения в облаке AWS. Вся инфраструктура разворачивается по парадигме IaaC через terraform.

Модель предполагает наличие трёх типов компонентов (уровней):

  • балансировщиков (которые принимают на себя весь входящий трафик);
  • серверов приложений (с которыми работают клиентские приложения);
  • серверов баз данных (с которыми работают серверы приложений).

Цели проектной работы:

  1. Использовать знания и лучшие практики, полученные на курсе.
  2. Подготовить дизайн и архитектуру решения для облака AWS.
  3. Развернуть инфраструктуру через terraform (IaaC).

Используемые технологии:

  • Облачные сервисы AWS
  • Terraform

Дизайн/архитектура решения:

Реализация:

Используется два региона AWS, в каждом из них развёрнута идентичная сетевая инфраструктура (поэтому схема второго не описана подробно): отдельные vpc для приложения и для БД. В реализованном проекте используются две зоны доступности, но схема может быть масштабирована на три. В vpc для БД используется только одна сеть в каждой зоне доступности, а в vpc для приложений создаётся по три подсети, условные названия:

  • private (там разворачиваются инстансы приложений);
  • public (там разворачиваются ALB и NAT Gateway, через который приложения выходят в интернет);
  • bastion (в этой подсети находится хост-бастион, через который можно попасть во внутреннюю часть проекта для возможной отладки).

Между vpc внутри одного региона установлен пиринг, между vpc app и data в соседнем регионе также установлен пиринг (поскольку приложению необходимо ходить в мастер базы данных для записи), между vpc app между регионами также установлен пиринг для работы хоста-бастион. Приложение разворачивается на EC2 инстансы, которые управляются autoscaling группами (автомасштабирование). Приложение настроено сохранять загружаемые файлы в s3-бакеты. Бакеты синхронизируются между регионами, а перед ними установлен aws cloudfront. В каждом из регионов установлен кластер БД RDS из двух инстансов, но во втором регионе он является репликой, поэтому он может работать только на чтение.

Описание конфигурации

Сетевая адресация:

Регион us-east-1:

Весь регион10.1.0.0/16
vpc app10.1.0.0/18
vpc data10.1.64.0/18
subnet app_private us-east-1a10.1.0.0/21
subnet app_public us-east-1a10.1.8.0/21
subnet app_private us-east-1b10.1.16.0/21
subnet app_public us-east-1b10.1.24.0/21
subnet app_bastion us-east-1a10.1.48.0/24
subnet data us-east-1a10.1.64.0/21
subnet data us-east-1b10.1.80.0/21

Регион us-central-1:

Весь регион10.2.0.0/16

Внутри региона нарезка адресов аналогична региону us-east-1

Security group

ALB (Балансировщики): разрешены входящие подключения на порт 80 и 443 из интернета App

EC2(виртуальные машины приложений): разрешены входящие подключения на порт 80 из vpc app своего региона и на порт 22 из всей приватной сети (10.0.0.0/8)

DB (БД): разрешены входящие подключения на порт 3306 из всей приватной сети (10.0.0.0/8)

Bastion: разрешены входящие подключения на порт 22 из интернета

Таблицы маршрутизации

Для каждой vpc создаётся таблица маршрутизации, с маршрутом по умолчанию на созданный internet gateway и добавляются маршруты в те vpc, с которыми требуются пиринг (для app во все регионы в app и data, для data — во все регионы в app). Также для каждой сети с приложениями (subnet app private) создаётся отдельная таблица маршрутизации с аналогичными правилами, но маршрут по умолчанию ведёт на nat gateway, созданный в той же зоне доступности в сети public.

Правила масштабирования

Приложение может нелинейно зависеть от количества пользователей и выбран способ масштабирования по нагрузке на cpu на ec2 инстансы. При средней нагрузке более 70% за 2 минуты на все инстансы приложения в данном регионе поднимается ещё один инстанс. При падении нагрузки ниже 20% удаляется один из инстансов. 

Сценарии реагирования

  1. Увеличение входящего трафика выше настроенных правил автомасштабирования

При деградации работы приложения необходимо выполнить следующие действия:

  • проверить метрики ALB, увеличилось ли количество трафика на приложение, в случае, если есть корреляция с выкаткой новой версией — откатить к предыдущему релизу;
  • проверить нагрузку на поднятые инстансы, если есть проблемы с одним из них, удалить его, чтобы он был пересоздан;
  • включить бастион хост (если выключен), подключиться к нему и с него зайти на одну из нод с приложением и проанализировать, откуда взялась повышенная нагрузка;
  • увеличить максимально возможное количество инстансов в autoscaling группе — увеличить тип инстанса в autoscaling группе на более мощный;
  • если проблема наблюдается только в одном регионе, рассмотреть возможность переключить нагрузку только на второй (смотрите следующий сценарий);
  • проанализировать трафик на хостах, является ли он легитимным. В случае подозрения на нелегитимный трафик (боты, атака) рассмотреть возможность подключения AWS WAF или AWS Shield.
  • Выход из строя одного региона

При выходе из строя одного из регионов, если это регион с мастером БД, необходимо через консоль выполнить для реплики Promote, затем поменять локальную переменную в app/main.tf main_region на второй регион и сделать импорт ресурса терраформ: terraform import module.app-eu.aws_db_instance.default[0] <db-instance> — тут db-instance — это название БД, которое можно увидеть в консоли. После чего прокатать terraform, он заменит шаблон для создания инстансов на новый, с новым хостом БД для подключения и поменяет дефолтную запись в route53 (эти действия можно выполнить и вручную через консоль). После чего надо удалить в route53 записи, которые ведут в вышедший из строя регион. Если это регион с репликой БД, необходимо только удалить в route53 проблемные записи. 

Комментарии по реализации

Запуск терраформа производится в три этапа. 

  1. Первый — от админской учётки, которая создаст необходимых для работы пользователей и необходимые для работы аккаунты. 
  2. Второй — от учётки сетевого инженера, которая создаст необходимые vpc, подсети, шлюзы, пиринги и таблицы маршрутизации.
  3. Третий — от учётки разработчиков. Здесь описываются необходимые security groups, базы данных, конфигурация приложений, бакетов и балансировщиков, настраиваются политики доступов в бакеты с ec2-инстансов, заводятся записи в днс и сертификаты для них. 

Из того, что остаётся сделать «руками» после прокатки — настройка уже непосредственно приложения и как потенциал роста его деплой в рамках CI/CD pipeline.