Terraform: инфраструктура на уровне кода | страница 99



Terraform — это декларативный язык. Как уже обсуждалось в главе 1, по сравнению с процедурными языками декларативные обычно дают более точное представление о том, что на самом деле развернуто в IaC. Благодаря этому код остается компактным и в нем легче разобраться. Однако с некоторыми видами задач сложнее справиться в декларативном стиле.

Например, как повторить какой-то элемент бизнес-логики, в частности создание нескольких похожих ресурсов, без дублирования кода, учитывая, что у декларативных языков обычно нет цикла for? И если декларативный язык не поддерживает выражения if, как сконфигурировать ресурсы условным образом: скажем, написать модуль Terraform, который умеет создавать определенные ресурсы только для некоторых пользователей? И как в декларативном языке выразить сугубо процедурную концепцию, такую как развертывание с нулевым временем простоя?

К счастью, Terraform предоставляет несколько элементов языка, которые позволят вам выполнять определенные виды циклов, условных выражений и развертываний. Речь идет о метапараметре count, выражениях for_each и for, блоке жизненного цикла под названием create_before_destroy, тернарном операторе и большом количестве функций. Эта глава охватывает следующие темы.

• Циклы.

• Условные выражения.

• Развертывание с нулевым временем простоя;

• Подводные камни Terraform.


Примеры кода

Напоминаю: все примеры кода для этой книги можно найти по адресу github.com/brikis98/terraform-up-and-running-code.


Циклы

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

• Параметр count для циклического перебора ресурсов.

• Выражение for_each для циклического перебора ресурсов и их вложенных блоков.

• Выражение for для циклического перебора списков и ассоциативных массивов.

• Строковая директива for для циклического перебора списков и ассоциативных массивов внутри строк.

Рассмотрим их одну за другой.


Циклы с параметром count

В главе 2 с помощью консоли AWS вы создали учетную запись AWS и пользователя Access Management (IAM). Теперь с помощью этого пользователя вы можете создавать и администрировать всех будущих пользователей IAM прямо в коде Terraform. Рассмотрим следующий код, который должен находиться в файле live/global/iam/main.tf:

provider "aws" {

  region = "us-east-2"

}

resource "aws_iam_user" "example" {

  name = "neo"

}

Здесь используется ресурс aws_iam_user для создания одного нового пользователя IAM. Но если необходимо создать трех пользователей? В языке программирования общего назначения вы бы применили цикл for: