Доступная и масштабируемая 3-уровневая архитектура AWS

Сегодня мы подробно расскажем, как построить трехуровневую структуру AWS. AWS, как и торт, с добавлением уровней становится только интереснее. Испечем AWS-торт с тремя уровнями: веба, приложения и базы данных. Это модульная архитектура: каждый уровень масштабируется независимо, прямое взаимодействие клиентов с БД предотвращается группами безопасности. Постепенно разберем значение и вклад каждого уровня, но прежде рассмотрим архитектуру.

Ключевые термины

VPC  —  конфигурируемый по запросу пул общих ресурсов, выделяемых в общедоступной облачной среде.

Подсеть  —  диапазон IP-адресов для подключения ресурсов, например экземпляров EC2.

Интернет-шлюз  —  компонент VPC для взаимодействия VPC с интернетом.

Шлюз NAT  —  служба AWS для подключения экземпляров закрытой подсети к службам вне VPC, но без возможности внешним службам инициировать подключение.

Список ингредиентов

  • Учетная запись AWS;
  • интерфейс командной строки.

Порядок приготовления

Убедиться в наличии доступа из интернета к веб-странице веб-уровня.

Выполнив команду ping из экземпляра EC2 в веб-уровне, убедиться в том, что уровень приложения пингуется из веб-уровня.

Дополнительные требования

Веб-уровень:

  • две публичные подсети;
  • минимум два экземпляра EC2 с выбранной ОС бесплатного уровня в группе автомасштабирования;
  • группой безопасности веб-сервера EC2 разрешаются права входящих подключений из интернета;
  • выполнить начальную загрузку статической веб-страницы или создать пользовательский AMI, в котором эта страница уже имеется;
  • создать публичную маршрутную таблицу и связать две публичные подсети.

Уровень приложения:

  • две закрытые подсети;
  • минимум два экземпляра EC2 с выбранной ОС бесплатного уровня в группе автомасштабирования;
  • группой безопасности сервера приложений EC2 разрешаются права входящих подключений из группы безопасности веб-сервера;
  • связать с закрытой маршрутной таблицей. 
    Это не настоящий уровень приложения: отсутствует код для запуска в экземплярах EC2.

Уровень базы данных:

  • использовать бесплатную БД MySQL RDS служб реляционных баз данных;
  • группой безопасности БД разрешается входящий трафик для MySQL из группы безопасности сервера приложений.

Рецепт

Этап 1. Создание VPC

Подготовим основу для торта  —  виртуальное частное облако VPC. В Services («Службы») VPC нажимаем Create VPC («Создать VPC»):

В VPC settings («Настройки VPC») выбираем VPC only («Только VPC»), добавляем тег, выбираем IPv4 CIDR manual input («Ручной ввод IPv4 CIDR»), вводим IPv4 CIDR, оставляем в Tenancy («Аренда») Default («По умолчанию») и нажимаем Save («Сохранить»):

В выпадающем меню Actions («Действия») домашней страницы VPC выбираем Edit VPC settings («Редактировать настройки VPC»). Отмечаем галочкой Enable DNS hostnames («Включить имена хостов DNS»), нажимаем Save («Сохранить»).

Атрибутом DNS hostnames определяется, получаются ли экземплярами, запущенными в VPC, общедоступные имена хостов DNS, которые соответствуют их общедоступным IP-адресам.

Этап 2. Создание подсетей

Чтобы соответствовать требованиям, нужны две публичные подсети для веб-уровня и по две закрытые подсети для уровня приложения и уровня БД.

В выпадающем меню виртуального частного облака выбираем Subnets («Подсети»), на странице подсети нажимаем Create a subnet («Создать подсеть»), выбираем созданный нами VPC:

Выбрав VPC ID («Идентификатор VPC»), вводим настройки подсети:

Повторяем этот этап пять раз и по необходимости редактируем настройки для подсетей приложения и БД. 

Чтобы для каждой подсети включить автоприсвоение общедоступных IPv4-адресов, в подсети выбираем Actions («Действия») > Edit subnet settings («Редактировать настройки подсети») > Enable auto-assign public IPv4 address («Включить автоприсвоение общедоступного IPv4-адреса») > Save («Сохранить»):

Не забываем сохранить

Создав подсети, переходим к третьему этапу.

Этап 3. Интернет-шлюз

Чтобы создать интернет-шлюз, в выпадающем меню виртуального частного облака слева выбираем Internet Gateways («Интернет-шлюзы»), в дашборде интернет-шлюзов нажимаем Create internet gateway («Создать интернет-шлюз»):

Создав интернет-шлюз, в выпадающем меню Actions («Действия») выбираем Attach to VPC («Подключить к VPC»), а из выпадающего меню  —  VPC:

Это важнейший этап

Этап 4. Создание шлюза NAT

В выпадающем меню виртуального частного облака выбираем NAT gateways («Шлюзы NAT»), затем Create NAT gateway («Создать шлюз NAT»), в NAT gateway settings («Настройки шлюза NAT») называем NAT, выбираем веб-подсеть из выпадающего меню, далее Public («Публичная») и выделяем Elastic IP address («Эластичный IP-адрес»):

Готов к работе

Этап 5. Создание маршрутной таблицы

В выпадающем меню виртуального частного облака выбираем Route tables («Маршрутные таблицы»), справа вверху нажимаем Create route table («Создать маршрутную таблицу»), вводим имя и подключаем трехуровневый VPC:

Все обратно увязывается с VPC

Редактируем связи подсетей, перейдя в Subnet associations («Связи подсетей») и Edit subnet associations («Редактировать связи подсетей»):

Выбираем две публичные веб-подсети из списка Available subnets («Доступные подсети»), нажимаем Save associations («Сохранить связи»):

Добавим интернет-шлюз в цель трехуровневой публичной маршрутной таблицы. Выбираем Route («Маршрут») > Edit route («Редактировать маршрут») > Add route («Добавить маршрут») > 0.0.0.0/0 > Target («Цель»): интернет-шлюз > Save changes («Сохранить изменения»):

Чтобы связать еще четыре подсети, создадим дополнительную таблицу маршрутизации. В отличие от предыдущего этапа выбираем закрытые подсети:

Сохранив настройки, меняем маршрут на шлюз NAT в Edit route settings («Редактировать настройки маршрута»):

Переходим к веб-уровню.

Этап 6. Создание шаблона запуска

Приступаем к веб-уровню нашего торта. Это внешняя часть архитектуры: пользовательский интерфейс и взаимодействие клиентов с бизнесом.

Начнем с создания шаблона запуска, переходим в дашборд EC2 > Instances («Экземпляры») > Launch templates («Шаблоны запуска») > Create launch template («Создать шаблон запуска»):

Вводим имя и описание версии шаблона запуска, отмечаем галочкой Auto Scaling Guidance («Руководство по автомасштабированию»):

В Application and OS Images («Приложение и образы ОС») выбираем Quick Start («Быстрый запуск») > Amazon Linux > любой AMI бесплатного уровня:

Выбираем тип экземпляра t1.micro:

Для входа повторно используем старую пару ключей, при ее отсутствии выбираем Create new key pair («Создать новую пару ключей») и сохраняем ее для последующего применения:

В Network settings («Настройки сети») выбираем Create security group («Создать группу безопасности»), называем ее, выбираем VPC:

В Inbound security group rules («Правила входящих подключений для групп безопасности») создаем два правила. Первым разрешается HTTP-трафик, вторым  —  SSH-трафик:

В Advanced network configuration («Расширенная конфигурация сети») включаем Auto-assign public IP Info («Автоприсвоение общедоступных IPv4-адресов»):

В Advanced Details («Дополнительные сведения») User data («Пользовательские данные») добавляем скрипт bash, им устанавливается, обновляется и запускается Apache. По завершении нажимаем Create launch template («Создать шаблон запуска»):

#!/bin/bash
sudo yum update -y
#Обновляется операционная система
sudo yum install -y httpd
sudo systemctl enable httpd
sudo systemctl start httpd
#Устанавливается, включается и запускается веб-сервер Apache
sudo echo "<html><body><h1>Is it time for cake yet?</h1></body></html>" > /var/www/html/index.html
#Меняем текст и настраиваем веб-страницу

Этап 7. Создание группы автомасштабирования

Чтобы создать для шаблона группу автомасштабирования, нажимаем View template («Просмотр шаблонов»), выбираем шаблон из списка Launch templates («Шаблоны запуска»), переходим к Launch template version details («Сведения о версии шаблона запуска»), выбираем Actions («Действия») и Create Auto Scaling group («Создать группу автомасштабирования»):

Введем имя группы автомасштабирования, в Launch template («Шаблон запуска») выбираем Three_Tier_Template («Трехуровневый шаблон»), остальные параметры оставляем по умолчанию, нажимаем Next («Далее»):

В Network («Сеть») выбираем из выпадающего меню трехуровневый VPC и публичные подсети, нажимаем Next («Далее»):

В Load balancing («Балансировка нагрузки») выбираем Attach to a new load balancer («Подключиться к новому балансировщику нагрузки»), Application Load Balancer («Балансировщик нагрузки приложений») и Internet-facing («С выходом в интернет»):

В Listeners and routing («Прослушиватели и маршрутизация») выбираем Create a target group («Создать целевую группу»), нажимаем Next («Далее»):

В Group size («Размер группы») меняем Desired capacity («Желаемая емкость») и Minimum capacity («Минимальная емкость») на Two («Два»), Maximum capacity («Максимальная емкость») на Four («Четыре»), нажимаем Next («Далее»):

Обойдемся без уведомлений, нажимаем Next («Далее»), и без тегов. Тщательного просмотрев все настройки, нажимаем Create Auto Scaling group («Создать группу автомасштабирования»).

Чтобы убедиться в работоспособности экземпляров, нажимаем EC2, переходим к экземпляру, копипастим IPv4-адрес в механизм поиска:

Отличная работа

Этап 8. Создание уровня приложения

Добрались до середины архитектуры торта, уровня приложения. Его часто называют уровнем логики, здесь обрабатываются все собранные данные.

Чтобы создать уровень приложения, в меню Launch template («Шаблон запуска») создаем другой шаблон запуска, нажимая Create launch template, и называем его. Шаблоны должны отличаться, снова отмечаем галочкой Auto Scaling Guidance («Руководство по автомасштабированию»):

В Launch template («Шаблон запуска») выбираем Quick Start («Быстрый запуск») > Amazon Linux > AMI бесплатного уровня > тип экземпляра t1.micro условно-бесплатного уровня > в Key Pair Login («Вход по паре ключей») выбираем пару ключей.

В Network settings («Настройки сети») создаем группу безопасности, в Subnet («Подсеть») оставляем по умолчанию Don’t include in launch template («Не включать в шаблон запуска»), переходим в Firewall Security («Безопасность брандмауэра»), выбираем Create security group («Создать группу безопасности»), называем ее ThreeTierPrivateSecurityGroup, в Description («Описание») вводим Allow Security Group and SSH Access («Разрешить группу безопасности и SSH-доступ»), выбираем свой VPC:

В Inbound security group rules («Правила входящих подключений для групп безопасности») создаем правило для разрешения SSH-трафика и меняем источник на нашу группу безопасности, выбрав ее из Source («Источник»):

Дежавю?

Настроив эти элементы, нажимаем Create launch template («Создать шаблон запуска»). Создав шаблон, нажимаем View launch templates («Просмотреть шаблоны запуска») и создаем группу автомасштабирования. Как прежде, выбираем Launch template ID («Идентификатор шаблона запуска»), переходим в Actions («Действия») и создаем группу автомасштабирования:

Создаем новое имя группы автомасштабирования, выбираем Three_Tier_Application_Template, нажимаем Next («Далее»):

В Network («Сеть») выбираем свой VPC и зоны доступности приложения, нажимаем Next («Далее»):

В Configured Advanced Options («Настраиваемые расширенные параметры») выбираем Attach to a new load balancer («Подключиться к новому балансировщику нагрузки») > Application Load Balancer («Балансировщик нагрузки приложений») > вводим Load balancer name («Имя балансировщика нагрузки») > Internet-facing («С выходом в интернет»):

В Listeners and routing («Прослушиватели и маршрутизация») выбираем Create a target group («Создать целевую группу»), нажимаем Next («Далее»):

В Group size («Размер группы») меняем Desired capacity («Желаемая емкость») и Minimum capacity («Минимальная емкость») на Two («Два»), Maximum capacity («Максимальная емкость») на Four («Четыре») и нажимаем Next («Далее»), пока не доберемся до просмотра:

Просмотрев настройки, нажимаем Create an Auto Scaling group («Создать группу автомасштабирования») и видим их обе:

Видим также, что экземпляры запущены:

Настал последний этап этой гонки: создание базы данных.

Этап 9. Создание уровня базы данных

Уровень БД последний в нашем торте. Это уровень бэкенда, где хранится и контролируется обрабатываемая на уровне приложения информация.

Чтобы создать БД, переходим к RDS службе реляционных БД в Services («Службы») и нажимаем Create database («Создать базу данных»):

Выбираем Standard create («Стандартное создание») > MySQL > Free tier («Бесплатный уровень»):

В Settings («Настройки») меняем DB Instance Identifier («Идентификатор экземпляра БД»), создаем для нее пароль:

В Connectivity («Возможность подключения») из выпадающего списка выбираем VPC. Ниже меняем группу безопасности VPC, нажимая Create new («Создать новую»). Вводим ее имя, остальные элементы оставляем по умолчанию и создаем БД:

Создав БД, редактируем правила группы безопасности. Переходим в EC2 Instance Dashboard («Дашборд экземпляров EC2») > Network & Security («Сеть и безопасность») > Security Groups («Группы безопасности»), выбираем Three Tier Database Security Group («Трехуровневую группу безопасности базы данных»), а в выпадающем меню Actions («Действия»)—  Edit inbound rules («Редактировать правила входящих подключений»):

Удаляем текущее правило, добавляем новое, меняя тип на MYSQL/Aurora, сохраняя Source («Источник») как Custom («Пользовательский»), выполняя поиск группы безопасности БД, затем нажимаем Save Rules («Сохранить правила»):

Построение уровней завершено  —  убедимся в их корректной работе и взаимодействии. В дашборде EC2 выбираем экземпляр в публичной подсети и копипастим общедоступный IP-адрес:

Общедоступный IP-адрес рабочий. Убедимся, что уровень приложения тоже. Выбираем в выпадающем меню один из публичных экземпляров и нажимаем Connect («Подключиться»):

Переходим в SSH Client («Клиент SSH»).

Открываем командную строку и подключаемся к экземпляру по ssh. Из этого экземпляра командой ping пропингуем закрытый экземпляр:

В случае успеха вернется такой ответ:

А значит, уровни взаимодействуют и наш трехуровневый торт завершен.

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Donald Kish: Available & Scalable AWS 3-Tier Architecture

Предыдущая статьяКэширование Redis для максимальной производительности в Spring Boot и Java
Следующая статья18 продвинутых навыков JavaScript для старших инженеров-программистов