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



# Это просто псевдокод. Он не будет работать в Terraform.

for (i = 0; i < 3; i++) {

  resource "aws_iam_user" "example" {

    name = "neo"

  }

}

В языке Terraform нет встроенной поддержки циклов for и другой традиционной процедурной логики, поэтому такой синтаксис работать не будет. Однако у каждого ресурса Terraform есть метапараметр под названием count. Это самая старая, простая ограниченная разновидность итератора в Terraform: она просто определяет, сколько копий ресурса нужно создать. Вот как с помощью этого параметра создать трех пользователей IAM:

resource "aws_iam_user" "example" {

  count = 3

  name  = "neo"

}

У этого кода есть одна проблема: у всех трех пользователей IAM будет одно и то же имя. Это приведет к ошибке, так как имена пользователей должны быть уникальными. Если бы у вас был доступ к стандартному циклу for, вы могли бы использовать индекс i, чтобы изменить каждое имя:

# Это просто псевдокод. Он не будет работать в Terraform.

for (i = 0; i < 3; i++) {

  resource "aws_iam_user" "example" {

    name = "neo.${i}"

  }

}

Чтобы добиться того же в Terraform и получить индекс каждой итерации в цикле, можно воспользоваться ссылкой count.index:

resource "aws_iam_user" "example" {

  count = 3

  name  = "neo.${count.index}"

}

Если выполнить команду plan для представленного выше кода, можно увидеть, что Terraform собирается создать трех пользователей IAM с разными именами ("neo.0", "neo.1", "neo.2"):

Terraform will perform the following actions:

  # aws_iam_user.example[0] will be created

  + resource "aws_iam_user" "example" {

    + arn           = (known after apply)

    + force_destroy = false

    + id            = (known after apply)

    + name          = "neo.0"

    + path          = "/"

    + unique_id     = (known after apply)

  }

  # aws_iam_user.example[1] will be created

  + resource "aws_iam_user" "example" {

    + arn           = (known after apply)

    + force_destroy = false

    + id            = (known after apply)

    + name          = "neo.1"

    + path          = "/"

    + unique_id     = (known after apply)

  }

  # aws_iam_user.example[2] will be created

  + resource "aws_iam_user" "example" {

    + arn           = (known after apply)

    + force_destroy = false

    + id            = (known after apply)

    + name          = "neo.2"

    + path          = "/"

    + unique_id     = (known after apply)

  }

Plan: 3 to add, 0 to change, 0 to destroy.

Конечно, такое имя, как "neo.0", будет не очень полезным. Но если совместить count.index с некоторыми встроенными в Terraform функциями, каждую итерацию этого цикла можно изменить еще сильнее.