Руководство по AWS: настройка экземпляра EC2 для развертывания приложений Java

Готовясь к получению сертификата AWS Cloud Practitioner и имея практическую возможность поработать с экземплярами AWS EC2, я решил поделиться знаниями о них, установке Java и сервера Tomcat, других инструментах для процесса развертывания в EC2.

Рассмотрим такие темы:

  • Что такое AWS и экземпляр EC2?
  • Регионы и зоны в AWS.
  • Группы безопасности и эластичный IP-адрес.
  • Создание экземпляра EC2.
  • Установка программного обеспечения в экземпляре EC2.
  • Настройка правил входящих подключений для групп безопасности.
  • Тестирование экземпляра EC2.

Вам понадобится активная учетная запись AWS. В случае отсутствия заводим ее и завершаем процесс регистрации здесь.


Что такое AWS и экземпляр EC2?

Если вкратце, AWS предназначен для быстрого и безопасного размещения приложений  —  имеющихся и новых. Это простой в использовании, гибкий, экономичный, масштабируемый, высокопроизводительный инструмент.

EC2 расшифровывается как Amazon Elastic Compute Cloud, то есть веб-служба для предоставления в облаке безопасных вычислительных мощностей изменяемого размера, создания пользователями собственных виртуальных машин и упрощения веб-масштабируемых облачных вычислений для разработчиков. Благодаря простому интерфейсу веб-сервиса EC2 получение и конфигурирование мощностей осуществляется с минимальными усилиями.

Особенности Amazon EC2

  • Экземпляры или виртуальные вычислительные среды.
  • Преднастроенные шаблоны экземпляров Amazon Machine Images со всем необходимым для сервера, включая операционную систему и дополнительное ПО.
  • Типы экземпляров или разные конфигурации ЦП, памяти, хранилища и сетевых мощностей экземпляров.
  • Информация для входа в экземпляры защищена парами ключей. Открытый ключ хранится в AWS, закрытый  —  у вас в безопасном месте.
  • Тома хранилища экземпляров, или тома хранения временных данных, удаляемых при остановке, переходе в спящий режим или завершении работы экземпляра.
  • Регионы и зоны доступности, или физические местоположения ресурсов: экземпляров и томов Amazon EBS.
  • Брандмауэр для указания протоколов, портов и диапазонов IP-адресов источника, по которым экземпляры доступны с помощью групп безопасности.
  • Эластичные IP-адреса, или статические IPv4-адреса для динамических облачных вычислений.

Регионы и зоны

Amazon EC2 размещается в нескольких высокодоступных ЦОД по всему миру. Цель такой географической рассредоточенности  —  дополнительная масштабируемость и надежность. Эти ЦОД распределены по регионам и зонам доступности.

  • Каждый регион  —  отдельная, полностью независимая географическая область.
  • Зоны доступности  —  это изолированные местоположения в пределах каждого региона.
  • В локальных зонах размещаются ресурсы  —  вычислительные и хранилища  —  в местоположениях ближе к конечным пользователям.

Группы безопасности

Группа безопасности  —  это такой виртуальный брандмауэр экземпляров EC2 для контроля входящего и исходящего трафика экземпляра. Входящий трафик контролируется правилами входящего трафика, исходящий  —  правилами исходящего.

  • Имеется две группы безопасности: по умолчанию и пользовательская. Первая привязывается к экземпляру при его создании, вторая  —  к уже имеющемуся.
  • В группах безопасности содержатся правила исходящего трафика, которыми разрешается весь исходящий трафик.
  • Правилами групп безопасности трафик фильтруется по протоколам и номерам портов.
  • Правила добавляются и удаляются в любое время. Изменения автоматически применяются к экземплярам, привязанным к группе безопасности.
  • Правила групп безопасности всегда разрешительные: нельзя создать правила для запрета доступа.

Эластичные IP-адреса

Эластичный IP-адрес  —  это зарезервированный общедоступный IP-адрес, который присваивается любому экземпляру EC2 в конкретном регионе до тех пор, пока не освободится. Эластичный IP-адрес присваивается учетной записи в конкретном регионе так.

  • Когда к экземпляру EC2 привязывается эластичный IP-адрес, этим адресом заменяется общедоступный IP-адрес по умолчанию.
  • Эластичный IP-адрес остается неизменным несмотря на события, такие как остановка и перезагрузка экземпляра, которые обычно чреваты изменением адреса.
  • Чтобы распределить эластичные IP-адреса по различным категориям, например назначению, владельцу и среде, им присваиваются пользовательские теги. По таким тегам конкретный эластичный IP-адрес находится быстро.
  • Эластичный IP-адрес отвязывается от экземпляра в любое время, после чего привязывается к другому.

Создание экземпляра EC2

Создадим и запустим экземпляр EC2:

  • Открываем консоль AWS.
  • Нажимаем кнопку Sign in to the Console («Войти в консоль»).
  • Указываем учетные данные привилегированного пользователя, нажимаем Sign in («Войти»).
  • Войдя, нажимаем Services («Службы») и переходим в All Services -> EC2 («Все службы -> EC2») или вводим EC2 в строке поиска.
  • Выбираем конкретный регион в заголовке.
  • Переходим в Instance («Экземпляр») и нажимаем Launch Instance («Запустить экземпляр»). Откроется страница создания экземпляра.
  • Вводим название экземпляра, выбираем конкретный образ ОС Amazon Machine Image: Windows, Ubuntu, macOS и т. д. Для целей обучения выбираем любую из имеющихся в Amazon ОС условно-бесплатного уровня.
  • Выбираем тип экземпляра t2.micro, тоже условно-бесплатного уровня.
  • Нажимаем Create new key pair («Создать новую пару ключей»), указываем имя, выбираем тип пары RSA и формат файла pem, нажимаем Create key pair («Создать пару ключей»). Загрузится pem-файл. Сохраняем его в безопасной папке  —  он понадобится позже для подключения экземпляра. Нельзя загрузить тот же файл снова.
  • В Network settings («Сетевые параметры»), нажав Create security group («Создать группу безопасности»), создаем группу безопасности для экземпляра или выбираем Default security group («Группа безопасности по умолчанию»).
  • Нажимаем Launch instance («Запустить экземпляр»), и отобразится успешно выполненный запуск экземпляра.
  • Созданный экземпляр появится на боковой панели в Instances («Экземпляры»).
  • Если в Instance state («Состояние экземпляров») состояние Running, значит, экземпляр запущен корректно и предстоит его настройка.
  • Если отметить экземпляр галочкой, отобразятся все его сведения и конфигурации.
  • В разделе Details («Подробности») имеется общедоступный IPv4-адрес по умолчанию, который меняется в основном при остановке или перезагрузке экземпляра.
  • Этот адрес заменится созданным эластичным IP-адресом, неизменным даже после перезагрузки экземпляра.
  • В меню боковой панели в Network and Security («Сеть и безопасность») нажимаем Elastic IPs («Эластичные IP-адреса») и создаем эластичный IP-адрес, выбираем Allocate Elastic IP address («Выделить эластичный IP-адрес») и нажимаем Allocate («Выделить»).
  • Созданный эластичный IP-адрес появится в разделе Elastic IP addresses («Эластичные IP-адреса»). Нажав на эластичный IP-адрес, откроем страницу его привязывания к экземпляру.
  • Нажимаем Associate Elastic IP address («Привязать эластичный IP-адрес»), выбираем Instance («Экземпляр»), нажимаем Associate («Привязать»).
  • Эластичный IP-адрес привязан к экземпляру:
  • Переходим к подробностям экземпляра: эластичным IP-адресом, неизменным даже после перезагрузки экземпляра, заменяется общедоступный IPv4-адрес по умолчанию.

Установка ПО в экземпляре EC2

Запустив экземпляр EC2, установим и протестируем в нем ПО: Java 11 и Tomcat Server 9.

  • В списке экземпляров нажимаем правой кнопкой мыши по идентификатору экземпляра и выбираем Connect («Подключиться»).
  • Переходим во вкладку SSH client («Клиент SSH»), копируем URL-адрес под Example:
  • Из папки с pem-файлом открываем любой терминал  —  рекомендуется Git Bash  —  и вставляем скопированный URL-адрес.
  • Правильно запущенный экземпляр подключится через терминал, в консоли появится такой вывод:
  • Командой sudo su предоставляем права суперпользователя, а командой apt-get update загружаем и устанавливаем обновления для каждого устаревшего пакета и зависимости в системе, то есть установленной в экземпляре EC2 ОС:

Устанавливаем Java

  • Командой apt install openjdk-11-jdk устанавливаем JDK, а также JRE.
  • Командой java -version проверяем установку:

Устанавливаем Tomcat Server

  • Прежде чем устанавливать сервер Tomcat с конкретными пользователями и разрешениями, в целях безопасности командой useradd -m -d /opt/tomcat -U -s /bin/false tomcat сделаем отдельную учетную запись пользователя для запуска веб-сервера tomcat в системе Ubuntu, где будут созданы пользователь и группа tomcat.
  • Конкретную версию tomcat 9.0.73 загружаем с помощью wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.73/bin/apache-tomcat-9.0.73.tar.gz.
  • Загруженный файл разархивируем и все содержимое копируем в домашний каталог tomcat командами tar xzf apache-tomcat-9.0.73.tar.gz и sudo mv apache-tomcat-9.0.73/* /opt/tomcat/ соответственно.
  • Корректное владение всеми файлами задаем командой sudo chown -R tomcat:tomcat /opt/tomcat/.
  • Командой mkdir создаем две папки в Catalina/localhost в /opt/tomcat/conf/.
  • В /opt/tomcat/conf/Catalina/localhost/manager.xml создаем файл manager.xml.
  • Командой sudo nano /opt/tomcat/conf/Catalina/localhost/manager.xml добавляем и сохраняем такой код:
<Context privileged="true" antiResourceLocking="false"
docBase="{catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</Context>
  • Затем в /opt/tomcat/conf/Catalina/localhost/host-manager.xml создаем файл host-manager xml.
  • Командой sudo nano /opt/tomcat/conf/Catalina/localhost/host-manager.xml добавляем и сохраняем такой код:
<Context privileged="true" antiResourceLocking="false"
docBase="${catalina.home}/webapps/host-manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</Context>
  • Теперь настроим tomcat с учетными записями пользователей для безопасного доступа к страницам администратора/диспетчера.
  • Командой sudo nano /opt/tomcat/conf/tomcat-users.xml редактируем файл conf/tomcat-users.xml в терминале и вставляем внутри тегов <tomcat-users> </tomcat-users>, меняя имя пользователя и пароль в конфигурации ниже:
<!-- пользователю-диспетчеру доступен только раздел диспетчера -->
<role rolename="manager-gui" />
<user username="manager" password="password@123" roles="manager-gui" />

<!-- пользователю-администратору доступны оба раздела: диспетчера и администратора -->
<role rolename="admin-gui" />
<user username="admin" password="password@123" roles="manager-gui,admin-gui" />
  • Для запуска и остановки службы в tomcat имеются скрипты bash. Но ради простоты сделаем сценарий запуска для управления Tomcat как службой systemd.
  • Командой sudo nano /etc/systemd/system/tomcat.service создаем файл tomcat.service и добавляем такое содержимое:
[Unit]
Description=Tomcat
After=network.target

[Service]
Type=forking

User=tomcat
Group=tomcat

Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64"
Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom"
Environment="CATALINA_BASE=/opt/tomcat"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

[Install]
WantedBy=multi-user.target
  • Чтобы применить изменения, перезагружаем службу-демона systemd командой sudo systemctl daemon-reload.
  • Командой sudo systemctl enable tomcat включаем сервер.
  • Командой sudo systemctl start tomcat запускаем службу Tomcat в системе.
  • Готово. Java и сервер Tomcat в ОС экземпляра EC2 установлены.
  • Протестируем установку, введя общедоступный IPv4-адрес / эластичный IP-адрес с портом 8080, ведь по умолчанию tomcat запускается в порту с номером 8080:
  • Должна была загрузиться страница Tomcat по умолчанию. Но она не загружается, хотя статус tomcat активен:
  • Задействуем группы безопасности, в них имеется два типа правил: входящего и исходящего трафика.
  • Входящий трафик контролируется правилами входящего трафика, исходящий  —  правилами исходящего.
  • Здесь нужен доступ к порту 8080 экземпляра. Поэтому, чтобы разрешить входящий трафик в экземпляре, необходимо разрешить этот порт в правилах входящего трафика.
  • Переходим к подробностям экземпляра в раздел Security («Безопасность») и выбираем свою группу безопасности:
  • Переходим во вкладку Inbound rules («Правила входящих подключений»), нажимаем кнопку Edit inbound rules («Редактировать правила входящих подключений»).
  • Нажимаем Add rule («Добавить правило»), в Type («Тип») выбираем Custom TCP («Пользовательский TCP»), в Port range («Диапазон портов»)  —  8080, в Source («Источник»)  —  Anywhere-IPv4, нажимаем Save rules («Сохранить правила»):
  • Перезагружаемся, появится страница Tomcat по умолчанию, то есть входящий трафик в порту с номером 8080 группой безопасности разрешен:
  • Доступ к страницам Manager («Диспетчер») и Host Manager («Диспетчер хостов») получаем, указав заданные при установке tomcat учетные данные:
  • Если при этом получается ошибка «403», выполняем find / -name context.xml и делаем из комментария строку с элементом значения для Manager и Host Manager, которые находятся в папке webapps.
  • Чтобы отредактировать файла контекста Manager, запускаем sudo nano /opt/tomcat/webapps/manager/META-INF/context.xml, комментируем код ниже и сохраняем:
<!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->
  • Чтобы отредактировать файла контекста Manager, запускаем sudo nano /opt/tomcat/webapps/host-manager/META-INF/context.xml, комментируем код ниже и сохраняем:
<!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> -->

Вот и все. С ошибкой «403» при доступе к страницам Manager и Host Manager покончено.

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

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


Перевод статьи Pritam Kumar: AWS Tutorial — EC2 Instance Set-up for Java Application Deployment

Предыдущая статьяRaspberry Pi + Pushover + Puppeteer = автоматизация повседневных задач
Следующая статьяПакет Lambda-слоев AWS для Python