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



Например, все нужные вам имена пользователей IAM можно перечислить во входной переменной внутри live/global/iam/variables.tf:

variable "user_names" {

  description = "Create IAM users with these names"

  type        = list(string)

  default     = ["neo", "trinity", "morpheus"]

}

В языке программирования общего назначения с циклами и массивами вы бы назначили каждому пользователю IAM отдельное имя путем поиска значений в массиве var.user_names по индексу i:

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

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

  resource "aws_iam_user" "example" {

    name = vars.user_names[i]

  }

}

В Terraform то же самое можно сделать с помощью count в сочетании:

• с синтаксисом доступа к массиву по индексу, который похож на синтаксис большинства других языков:

ARRAY[]

Например, вот как взять из массива var.user_names элемент с индексом 1:

var.user_names[1]

• с функцией length. У Terraform есть встроенная функция под названием length, которая имеет следующий синтаксис:

length()

Как вы уже догадались, функция length возвращает количество элементов в заданном массиве. Она также работает со строками и ассоциативными массивами.

Если все это объединить, получится следующее:

resource "aws_iam_user" "example" {

  count = length(var.user_names)

  name  = var.user_names[count.index]

}

Теперь, если выполнить команду plan, можно увидеть, что Terraform собирается создать трех пользователей IAM с уникальными именами:

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"

    + 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          = "trinity"

    + 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          = "morpheus"

    + path          = "/"

    + unique_id     = (known after apply)

  }

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

Обратите внимание: если в ресурсе используется параметр count, он превращается в массив ресурсов. Поскольку aws_iam_user.example теперь является массивом пользователей IAM, вместо стандартного синтаксиса для чтения атрибутов (_..) необходимо указывать, какой именно пользователь вас интересует. Для этого применяется тот же синтаксис доступа к элементам массива по его индексу: