Требования

  1. Создайте высокодоступную двухуровневую архитектуру AWS, содержащую следующее:
  • 3 публичные подсети
  • 3 частных подсети
  • Группа автоматического масштабирования для хоста Bastion
  • Группа автоматического масштабирования для веб-сервера
  • Балансировщик нагрузки приложений с выходом в Интернет, предназначенный для группы автоматического масштабирования веб-сервера

2. Разверните это с помощью Terraform Cloud в качестве инструмента CI / CD для проверки вашей сборки.

3. Используйте блоки модулей для простоты использования и повторного использования.

Предпосылки

Примечания

В предыдущих статьях я подробно рассказывал о своем коде Terraform и объяснял, почему я все делаю определенным образом. В этом проекте было слишком много всего, чтобы разобрать его в одной статье, и вместо этого я хотел бы сосредоточиться на аспекте Terraform CI / CD. По мере того, как у меня будет время в будущем, я планирую вернуться к этому коду и углубиться в детали. Документация Terraform и курс Дерека Моргана Больше, чем сертифицированный имели решающее значение для этого проекта.

Обязательно следите за новыми статьями в будущем и свяжитесь со мной в LinkedIn.

Наша Инфраструктура

Мы будем развертывать двухуровневую архитектуру в AWS с общедоступными и частными подсетями. Мы хотим гарантировать, что к нашим веб-серверам нельзя будет получить доступ напрямую из Интернета, поэтому мы размещаем их в наших частных подсетях. Поскольку наши веб-серверы находятся в частных подсетях, у нас нет возможности напрямую подключиться к ним по SSH, поэтому мы собираемся добавить хост бастиона в группу автоматического масштабирования с желаемой емкостью 1. Таким образом, если хост бастиона выйдет из строя, новый один будет создан. Находясь в частной подсети, наши веб-серверы также не могут получить доступ к Интернету для получения обновлений, поэтому был добавлен шлюз NAT. Обратите внимание, что в этот проект мы включили только один шлюз NAT, чтобы снизить затраты, но для обеспечения высокой доступности вы также можете добавить шлюз NAT к другим общедоступным подсетям. Последняя проблема с частными подсетями заключается в том, что Интернет должен иметь доступ к нашему веб-сайту. Чтобы решить эту проблему, мы добавили балансировщик нагрузки приложений, который подключен к Интернету, чтобы направлять трафик на наши веб-серверы, которые также входят в группу автоматического масштабирования для обеспечения высокой доступности. Прямо сейчас у нас есть желаемая емкость, равная 2, но в будущем мы можем добавить целевую политику, в соответствии с которой группа Auto Scaling будет расширяться и сокращаться в зависимости от спроса.

Давайте начнем!

Во-первых, вам нужно разветвить мой репозиторий GitHub для 20-й недели, содержащий двухуровневую архитектуру.

Этот код Terraform использует модули для удобства чтения и повторного использования. Каталоги вычислений, балансировки нагрузки и сети составляют наши модули. Корневой файл main.tf будет вызывать эти модули для создания нашей инфраструктуры. Для получения дополнительной информации о модулях Terraform ознакомьтесь с моей статьей Terraform: создание специального модуля для EC2.

Примечание. Не забудьте обновить key_name в корневом файле main.tf до имени вашей пары ключей EC2.

Terraform Cloud

  1. Войдите в Terraform Cloud.
  2. Нам нужно будет создать новую рабочую область. Нажмите кнопку Новая рабочая область.

3. Выберите Рабочий процесс контроля версий.

4. Подключитесь к своей учетной записи GitHub.

5. Выбрал разветвленный репозиторий. Это должно быть ‹ваше имя пользователя› / week-20-project.

6. Придумайте название для своей рабочей области, например Проект 20-й недели, а затем нажмите Создать рабочую область.

7. Нам нужно будет установить переменные для ключей доступа и региона. Нажмите Настроить переменные.

8. Нажмите Добавить переменную в разделе Переменные среды.

9. Сначала добавьте переменные AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY для вашего пользователя IAM с правами администратора. Убедитесь, что вы выбрали чувствительный к этим переменным. Это предотвратит отображение значения вашей переменной.

10. Вам также необходимо создать переменную для AWS_DEFAULT_REGION, установленную на «us-east-1». Вы можете изменить это значение на другой регион, но вам нужно будет обновить переменные подсети в модуле сеть, если вы решите это сделать. Также создайте переменную CONFIRM_DESTROY со значением 1. Это нужно, чтобы позже разрушить нашу инфраструктуру.

11. Вместо того, чтобы включать файл .tfvars в репозиторий GitHub, давайте добавим нашу переменную access_ip в переменные Terraform. Адрес access_ip установлен в нашем корневом main.tf и определяет блок CIDR, который может подключиться по SSH к нашему хосту Bastion. В качестве примера я использую 0.0.0.0/0, но предлагаю привязать его к вашему личному IP-адресу.

Обратите внимание, что переменные Terraform отличаются от переменных среды.

12. Теперь давайте вручную запустим наш конвейер. Нажмите План очереди вручную.

13. Введите причину постановки плана в очередь и нажмите План очереди.

14. В нашем конвейере всего два этапа: План и Применить. Когда план будет готов, нажмите Подтвердить и применить.

15. Добавьте комментарий и нажмите Подтвердить план.

16. Наша Подать заявку завершена!

17. Нажмите блок Применить готово для детализации. Вы должны найти вывод alb_dns. Это значение будет отображать DNS балансировщика нагрузки приложения. Скопируйте это в буфер обмена. Вскоре мы будем использовать его для тестирования нашей инфраструктуры.

Тест ALB

Наш интернет-трафик должен попадать в наш балансировщик нагрузки приложений и переключаться между двумя нашими веб-серверами.

  1. Возьмите скопированное DNS-имя и вставьте его в браузер в приватном режиме. Вы должны перейти к файлу «Hello World», который отображает частный IP-адрес одного из наших веб-серверов.

2. Теперь обновите страницу. Вы должны увидеть, что частный IP изменился. Если вы продолжите обновление, вы увидите, что он переключается взад и вперед.

Хозяин бастиона испытаний

Одним из наших требований было, чтобы веб-серверы находились в частной подсети. Из-за этого мы не можем напрямую подключаться к нашим экземплярам по SSH, и нам нужно будет использовать наш Bastion Host. Я работаю на компьютере с Windows и использую Putty и Pageant. Если вы используете Mac или Linux, вам нужно будет использовать другой SSH Agent. Пожалуйста, обратитесь к Документации AWS, чтобы узнать о других способах подключения к экземпляру по SSH.

  1. Перейдите в свою учетную запись AWS и найдите общедоступный IP-адрес нашего хоста Bastion. Хотя я добавил теги в шаблоны запуска, похоже, они не применяются напрямую к экземплярам (что мне еще нужно изучить). Если вы посмотрите на группу безопасности, связанную с экземпляром, вы увидите, что она связана с Bastion-SG.
  2. Используя Putty, введите общедоступный IP-адрес в поле Host Name. Убедитесь, что порт равен 22.

3. С левой стороны перейдите к Connection ›SSH› Auth.

4. Выберите Разрешить пересылку агента. Затем нажмите Обзор и выберите файл .ppk.

5. Войдите как ec2-user.

6. Теперь вы подключены к нашему Bastion Host по SSH. Не стесняйтесь запускать pwd или другие команды, чтобы убедиться, что все работает.

7. Чтобы настроить переадресацию агентов, нам нужно будет использовать Pageant. Когда вы открываете Pageant, я заметил, что он не всегда всплывает, и вам нужно будет использовать показывать стрелку скрытых значков на панели инструментов Windows (обычно внизу экрана), чтобы открыть Это.

8. Нажмите Добавить ключ. Добавьте свой ключ и закройте.

7. Теперь используйте частный IP-адрес одного из наших веб-серверов для подключения по SSH с нашего хоста Bastion.

$ ssh ec2-user@<private ip>

8. Чтобы убедиться, что вы находитесь на веб-сервере, посмотрите, изменился ли IP-адрес после ec2-user @. Теперь запустите cat /var/www/html/index.html, чтобы увидеть содержимое нашей веб-страницы.

Дополнительный кредит

Хотя это и не является основной целью проекта, мы также настроили наш GitHub, чтобы запустить наш конвейер в Terraform Cloud. Чтобы проверить это, вы можете клонировать это репо, внести изменения, а затем вернуться на свой GitHub. Затем переключитесь на рабочую область Terraform Cloud и убедитесь, что в планировании есть текущий запуск. Вам все равно нужно будет Подтвердить и применить, чтобы изменения вступили в силу.

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

Очистить

  1. Перейдите в свою рабочую область и нажмите Настройки ›Уничтожение и удаление.

2. Нажмите План уничтожения очереди.

3. Вам нужно будет ввести имя своей рабочей области и нажать План уничтожения очереди.

4. Когда план будет готов, нажмите Подтвердить и применить.

Поздравляем с созданием двухуровневой архитектуры AWS с использованием Terraform Cloud!

Больше контента на plainenglish.io