Продолжаем рассказывать про Terraform. Предыдущая статья тут. В данной статье мы разберем динамичные блоки кода в Terraform, которые можно использовать в своей работе. Данный функционал значительно облегчает написание кода Terraform с помощью которого мы управляем сервисами Amazon. В статье будет описан сценарий с генерацией кода Terraform.
Данный функционал был добавлен в terraform 0.12
версии. Для работы создадим новую директорию, можно путем копирования из предыдущего урока. Директорию назовем lesson-5
. Для написания кода мы по-прежнему используем текстовый редактор Atom.
Мы можем создать файлик с именем DynamicSecurityGroup.tf
или переименуем существующий webserver.tf
если вы добавили папку путем копирования. Если вы создавали путем копирования отредактируем файл, убрав строчки, которые создают веб-сервер.
Удаляем. Теперь мы начнем писать код Terraform, чтобы у нас появилась динамическая группа безопасности.
В прошлой статье мы прописывали 2 правила. Данные правила открывали нам порты 80 и 22, аналогично можно прописать, чтобы открывался порт 443 ну или любой другой, который нам необходим для корректного инстанса и работоспособности сервиса.
А теперь представим, что нам необходимо открыть еще 20 разных портов. Можно сделать это с помощью copy-paste, т.е. копированием и вставкой уже существующих блоков кода с редактированием протокола и номеров портов. В terraform версии 0.12 добавили функционал и назвали его DynamicBlocks
, что позволит генерировать кусочки кода в Terraform.
Добавим следующую часть кода:
dynamic "ingress" { for_each = ["80", "443", "8080", "1541", "9092"] content { from_port = ingress.value to_port = ingress.value protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } }
Разберем для лучшего понимания. Функция Dynamic, далее кавычки двойные и внутри мы пишем, что-будет динамическим, в нашем случае это функция Ingress
. Открываем фигурные скобки и пишем цикл с помощью for_each = ["номерпорта1", "номерпорта2"]
указывая номера портов. Следовательно, цикл for_each
пройдется по каждому из параметров и будет применена конструкция content
. Значения внутри конструкции content
, будут заменены, а именно с какого порта на какой порт открывается доступ.
Далее в конструкции content
описываем используемый протокол сетевого уровня и cider_blocks
– с каких IP или диапазонов IP разрешено использовать данной правило. Конструкция 0.0.0.0/0
позволяет указать, что данное правило с данным портом разрешено использовать всему интернету вне зависимости от IP адреса. В целях информационной безопасности рекомендую использовать конкретные подсети или конкретные IP адреса, конечно, если это не публичный сервис.
Если посмотреть на пример, то написанное таким образом правило, сгенерирует нам 5 отдельных правил, т.е. получается достаточно удобно и сокращает нам количество строчек в коде, а также потенциально количество ошибок. Код становится более читаемым и легким.
После использования в коде функции dynamic
, мы можем удалить все ставшие ненужными функции ingress
. Не забывайте изменить имя ресурса. Это делается путем редактирования переменной name
в разделе функции resource
, для читаемости кода и удобства управления ресурсами в облаке AWS.
После того, как у нас готов наш код, мы можем его запустить. Так как, была создана новая папка, нам необходимо инициализировать ее использования. Переходим в необходимую директорию, в которой находится файл. И запускаем инициализацию стандартной командой terraform init
. После ввода команды ожидаем пару минут, пока Terraform скачает все необходимые модули для подключения и работы. Следующей командой terraform apply
мы запускаем код на исполнение. И получаем запрос на подтверждение операции. Среди вывода мы можем видеть:
Это значит что все порты, которые были указаны в аргументах будут созданы. Осталось подтвердить и дождаться успешного выполнения операции.