Пошаговое руководство по созданию инстанса EC2 на AWS с помощью Terraform

В дополнение к другой моей статье Почему вы должны использовать Terraform, я собираюсь показать вам, как начать работу с Terraform. Если вы не читали эту статью, я рекомендую сделать это, прежде чем продолжить здесь.

В этом руководстве мы собираемся запустить экземпляр EC2 (Ubuntu Server 20.04 LTS) на AWS с помощью Terraform. Кроме того, мы настроим VPC, автоматически создав пару ключей Terraform, подключимся к вашему экземпляру EC2 по SSH и установим NGINX на наш сервер. И все это мы делаем просто по коду! Звучит хорошо, правда?

Если у вас еще не установлен Terraform, следуйте официальному руководству по установке. Эта статья основана на Terraform версии 1.1.7.

Я загрузил этот проект на Github.

Создать пользователя IAM

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

Войдите в свою консоль AWS, перейдите на панель инструментов IAM и создайте нового пользователя. Вот важные настройки:

  • Тип доступа: Programmatic
  • Разрешения: AdminstratorAccess

Выбирать AdminstratorAccess вообще не рекомендуется. Вы никогда не должны делать этого. Но для простоты мы идем по этому пути. Просто имейте в виду, что в будущем вы должны предоставлять пользователю Terraform только необходимые разрешения, особенно для рабочих учетных записей AWS.

Вот мое резюме создания нового пользователя. С вашей стороны должно быть похоже.

Продолжайте, а затем сохраните/загрузите Ключ доступа и Секретный ключ доступа, они нам очень скоро понадобятся.

Проект Терраформ

Вот и все, теперь мы можем начать программировать с помощью Terraform.

Создать проект

$ mkdir terraform-ec2-nginx
$ cd terraform-ec2-nginx
$ code .

Структура проекта

Как обычно в моих руководствах, я собираюсь продолжить работу над окончательной файловой структурой.

$ mkdir network ec2
$ touch main.tf providers.tf locals.tf terraform.tfvars
$ touch vpc/data.tf vpc/main.tf vpc/outputs.tf vpc/variables.tf
$ touch ec2/main.tf ec2/outputs.tf ec2/variables.tf ec2/userdata.json

Возможно, вы понятия не имеете, что означает это имя файла, но просто оставайтесь со мной, я объясню их достаточно скоро.

Но вы должны знать, что нам не нужно импортировать/экспортировать файлы в Terraform. Terraform достаточно умен, чтобы справиться с этим за нас.

Структура вашего продукта должна выглядеть следующим образом:

Подготовка переменных, локальных переменных и поставщиков

Во-первых, мы собираемся закодировать переменные (среды), локальные переменные и настроить AWS в качестве провайдера внутри нашего корневого каталога.

Переменные среды

Здесь мы храним наш ключ доступа и секретный ключ доступа пользователя, которого мы только что создали на панели инструментов IAM. Просто вставьте их между кавычками.

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

terraform.tfvars
Этот файл обычно обрабатывает конфиденциальные значения. Всегда добавляйте этот файл в свой .gitignore, если вы используете Git.

Давайте добавим немного кода в terraform.tfvars

access_ip позже укажет, с какого IP мы можем подключиться/посетить наш сервер из Интернета (HTTP/SSH). 0.0.0.0/0 означает, что каждый может подключиться и посетить наш сервер.

Переменные

Итак, как я только что сказал, переменные среды будут обрабатываться как переменные, поэтому мы должны объявить их еще раз, но не забывать, что мы определили наиболее важные из них уже в файле terraform.tfvars.

Кроме того, мы добавляем сюда еще 1 переменную с именем aws_region.

Некоторые люди утверждают, что эта переменная также может быть чувствительной, но для демонстрации мы определяем ее внутри этого файла со значением по умолчанию eu-central-1. Замените это значение предпочитаемым регионом. Список всех регионов вы найдете здесь. Возьмите то, что вам больше всего подходит в зависимости от вашего местоположения.

Давайте добавим код в variables.tf

Провайдеры

Поскольку мы собираемся работать с AWS, нам необходимо зарегистрировать и настроить AWS в качестве провайдера. Как вы можете видеть в строках с 10 по 12, мы уже собираемся использовать наши (средовые) переменные.

Давайте добавим код в providers.tf

Местные жители

Локальные переменные похожи на переменные, но один шаблон, который мы иногда используем, заключается в использовании локальных переменных в качестве программно полученных значений на основе (возможно, отсутствующих или несвязанных) переменных.

Здесь мы собираемся указать CIDR VPC и группы безопасности для экземпляра EC2. Мы позволяем всем предоставлять доступ к нашему серверу по SSH, HTTP и HTTPS. Из соображений безопасности не рекомендуется давать кому-либо доступ к SSH. Рекомендуемый способ — предоставлять доступ только по IP-адресам, которым он необходим, например, вам и другим системным администраторам.

Но знаете, для простоты…

Давайте добавим код в locals.tf

Создать облако VPC

Теперь мы собираемся настроить первый из двух модулей, которые у нас будут.

Переменные

Модуль VPC получит переменные позже, поэтому нам нужно подготовиться к этому, определив эти заданные переменные.

Давайте добавим код в network/variables.tf

Источники данных

Источники данных позволяют Terraform использовать информацию, определенную вне Terraform, например, определенную зарегистрированными поставщиками, такими как AWS.

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

В моем конкретном случае: eu-central-1a eu-central-1b eu-central-1c

Возврат этого источника данных будет отличаться на вашей стороне, если вы определили другой регион AWS. Но не беспокойтесь об этом слишком сильно, так как он автоматически генерируется на основе вашего региона.

Давайте добавим код в network/data.tf

Ресурсы

Файл main.tf обычно является сердцем любого определяемого нами модуля. Здесь мы настраиваем VPC в данном конкретном случае как ресурсы. Но помимо настройки VPC нам нужно сделать гораздо больше. Нам нужно настроить подсети, таблицы маршрутизации, которые мы должны связать друг с другом, настроить группы безопасности и так далее. Я предполагаю, что вы знакомы с ними.

Особенностью этого файла является самый последний ресурс aws_security_group. Здесь мы используем Динамический блок. Я рекомендую прочитать документацию, чтобы понять, как работает это ключевое слово.

Давайте добавим код в network/main.tf

Выходы

После настройки нашего VPC, групп безопасности и т. д. мы собираемся вернуть некоторые данные в качестве выходов. Таким образом, мы можем использовать эти данные в других модулях. Поскольку мы собираемся настроить экземпляр EC2, нам понадобится, например, идентификатор группы безопасности.

Давайте добавим код в network/outputs.tf

Добавить VPC как модуль

Теперь нам нужно добавить всю эту конфигурацию VPC в виде модуля. Помните, я сказал, что позже нам нужно указать некоторые переменные для конфигурации VPC, сейчас мы это сделаем.

Осторожно, мы сейчас в корневом каталоге!

Давайте добавим код в main.tf

Тестирование VPC

Если вы уже хотите протестировать конфигурацию VPC, вы можете это сделать. Прокрутите вниз до раздела Команды этой статьи. Но это очень необязательно. Я объясню команды после настройки экземпляра EC2.

Экземпляр EC2

Теперь давайте продолжим настройку нашего экземпляра EC2. Мы не столкнемся здесь со слишком большим количеством новых ключевых слов, поэтому это делается быстро.

Переменные

Этот файл интересен. Поскольку мы собираемся получить выходные переменные из модуля VPC позже, мы должны определить их для модуля EC2.

Давайте добавим код в ec2/variables.tf

Данные пользователя

В этом файле мы указываем сценарий конфигурации, который запускается при первом запуске инстанса EC2. Именно там мы устанавливаем NGINX и все остальное, что мы хотим установить в экземпляре EC2.

Давайте добавим код в ec2/userdata.tpl

Ресурсы

Так что этот файл очень важен. Здесь мы настраиваем наш экземпляр EC2. Итак, что мы здесь делаем, так это создаем пару ключей, которую мы также загружаем в наш корневой каталог. Нам понадобится эта пара ключей для подключения к нашему экземпляру EC2 позже. Также мы настраиваем экземпляр EC2 и связываем с сервером эластичный IP.

Давайте добавим код в ec2/main.tf

Выходы

И снова у нас есть некоторые результаты, которые мы хотим вернуть.

Давайте добавим код в ec2/outputs.tf

Добавить EC2 в качестве модуля

Теперь нам нужно добавить конфигурацию EC2 в виде модуля. Как я уже сказал, мы собираемся добавить некоторые переменные, поскольку для этого требуются некоторые переменные.

Давайте изменим файл main.tf внутри нашего корневого каталога с

to

Общие выводы

Помните, мы определили некоторые выходные данные в модуле EC2, мы хотим, чтобы эти выходные данные отображались в нашем терминале после того, как мы зафиксировали и применили наши изменения в AWS. Таким образом, мы легко находим IP-адрес нашего экземпляра EC2 вместо того, чтобы просматривать весь файл State Terraform. Это сильно упрощает дело.

Хорошие новости! Мы закончили кодирование.

Команды

Теперь все готово к работе. Итак, есть несколько команд, которые можно использовать сейчас. Я настоятельно рекомендую, как обычно, прочитать официальную документацию каждой команды, чтобы все понять.

Когда использовать каждую команду?

После внесения изменений запустите terraform init, terraform validate, terraform plan и terraform apply, чтобы применить сделанные вами изменения.

Если вы хотите уничтожить всю свою конфигурацию, вам нужно запустить terraform destory.

Выполните приведенные ниже команды в своем терминале.

В этом

init используется для инициализации рабочего каталога, содержащего файлы конфигурации Terraform. Всякий раз, когда вы клонируете репозиторий Terraform или добавляете новый модуль, просто запускайте init.

$ terraform init

Подтвердить

Команда validate проверяет и подтверждает вашу конфигурацию. Запустите эту команду перед применением изменений.

$ terraform validate

План

Команда plan создает план выполнения, который позволяет предварительно просмотреть изменения, которые Terraform планирует внести в вашу инфраструктуру. Осторожно, вывод будет очень длинным. Запустите эту команду перед применением изменений.

$ terraform plan

Применять

Команда применить выполняет действия, предложенные в плане Terraform. Это означает, что мы собираемся зафиксировать и применить наши изменения/обновления к AWS, другими словами, эта команда создает экземпляр VPC и EC2.

$ terraform apply
or
$ terraform apply --auto-approve

Команда применить выполняет действия, предложенные в плане Terraform. Это означает, что мы собираемся зафиксировать и применить наши изменения к AWS, другими словами, эта команда создает экземпляр VPC и EC2. Эта команда требует времени для выполнения.

Уничтожить (не запускать его сейчас!)

Команда destroy уничтожает всю нашу конфигурацию. Не запускайте его сейчас.

$ terraform destory
 or
$ terraform destroy --auto-approve

Итак, снова запускаем terraform init, terraform validate, terraform plan, и если все хорошо, то запускаем terraform apply.

Пропустите terraform destroy пока!

Большой! Ваш экземпляр EC2 запущен. В нижней части этого снимка экрана вы можете увидеть результат, который мы только что определили. Подождите 1–2 минуты, чтобы дать серверу время для полного запуска, также несколько секунд требуется для установки NGINX. Затем мы можем посетить общедоступный IP-адрес EC2, который мы выводим.

В моем случае я могу посетить http://52.59.1.145 в своем веб-браузере. Эта ссылка вам не подойдет, замените ее своим IP-адресом, который вы получаете с терминала.

Вот что я получаю обратно:

Наш NGINX работает. Кроме того, давайте подключимся к нашему серверу по SSH. Дальше всего 2 шага.

Помните, Terraform создает ключевую пару, которую мы также загружаем в корневой каталог нашего проекта, но сначала нам нужно сделать ее читаемой.

$ chmod 400 key.pem

Важно! После изменения разрешений с помощью команды chmod у Terraform могут возникнуть проблемы с перезаписью этого файла, если вы уничтожите и повторно примените свою конфигурацию в Terraform. Итак, чтобы этого не произошло, удалите, переместите или переименуйте этот файл вручную, если вы запускаете terraform destory!

А теперь давайте подключимся к экземпляру EC2, просто замените YOUR_SERVER_IP на IP-адрес из вашего вывода внутри вашего терминала.

$ ssh -i "key.pem" ubuntu@YOUR_SERVER_IP

Поздравляем! Все работает, как и ожидалось. Спасибо, что прочитали мою статью о том, как создать инстанс EC2 с помощью Terraform. Надеюсь, вы смогли узнать что-то новое. Terraform — отличный инструмент в DevOps, и возможностей гораздо больше, чем вы видите.

Я загрузил этот проект на Github.

Ваше здоровье!

Надеюсь, вам понравилось это читать. Если вы хотите поддержать меня как писателя, рассмотрите возможность подписки стать участником Medium. Всего 5 долларов в месяц, и вы получаете неограниченный доступ к Medium.

Хотите поддержать меня? Купи мне кофе.

Читать дальше