Читаем Terraform: инфраструктура на уровне кода полностью

    + 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, вместо стандартного синтаксиса для чтения атрибутов (_..) необходимо указывать, какой именно пользователь вас интересует. Для этого применяется тот же синтаксис доступа к элементам массива по его индексу:

_..

Например, если вы хотите предоставить в качестве выходной переменной ARN одного из пользователей IAM, нужно сделать следующее:

output "neo_arn" {

  value       = aws_iam_user.example[0].arn

  description = "The ARN for user Neo"

}

Если вам нужны ARN всех пользователей IAM, вы должны указать символ * вместо индекса:

output "all_arns" {

  value       = aws_iam_user.example[*].arn

  description = "The ARNs for all users"

}

Если выполнить команду apply, вывод neo_arn будет содержать только ARN пользователя Neo, тогда как all_arns выведет список всех ARN:

$ terraform apply

(...)

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

Outputs:

neo_arn = arn:aws:iam::123456789012:user/neo

all_arns = [

  "arn:aws:iam::123456789012:user/neo",

  "arn:aws:iam::123456789012:user/trinity",

  "arn:aws:iam::123456789012:user/morpheus",

]

К сожалению, у параметра count есть два ограничения, которые делают его куда менее полезным. Во-первых, с помощью count можно пройтись по всему ресурсу, но при этом нельзя перебирать его вложенные блоки. Вложенный блок — это аргумент, который устанавливается внутри ресурса в следующем формате:

resource "xxx" "yyy" {

   {

    [CONFIG...]

  }

}

NAME — это имя вложенного блока (например, tag), а CONFIG состоит из одного или нескольких аргументов, предназначенных специально для него (вроде key и value). Посмотрите, как устанавливаются теги в ресурсе aws_autoscaling_group:

resource "aws_autoscaling_group" "example" {

  launch_configuration = aws_launch_configuration.example.name

  vpc_zone_identifier  = data.aws_subnet_ids.default.ids

  target_group_arns    = [aws_lb_target_group.asg.arn]

  health_check_type    = "ELB"

  min_size = var.min_size

  max_size = var.max_size

  tag {

    key                 = "Name"

    value               = var.cluster_name

    propagate_at_launch = true

  }

}

Каждый тег требует создания нового вложенного блока со значениями для key, value и propagate_at_launch. В предыдущем листинге вручную указан единственный тег, но можно разрешить пользователям передавать собственные. У вас может появиться соблазн воспользоваться параметром count для циклического перебора этих тегов и генерации динамических вложенных блоков tag, но, к сожалению, применение count внутри вложенного блока не поддерживается.

Второе ограничение параметра count даст о себе знать, когда вы попытаетесь его изменить. Рассмотрим созданный ранее список пользователей IAM:

variable "user_names" {

  description = "Create IAM users with these names"

  type        = list(string)

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

}

Представьте, что вы убрали из этого списка "trinity". Что произойдет при выполнении terraformplan?

$ terraform plan

(...)

Terraform will perform the following actions:

  # aws_iam_user.example[1] will be updated in-place

  ~ resource "aws_iam_user" "example" {

        id            = "trinity"

      ~ name          = "trinity" -> "morpheus"

    }

  # aws_iam_user.example[2] will be destroyed

  - resource "aws_iam_user" "example" {

      - id            = "morpheus" -> null

      - name          = "morpheus" -> null

    }

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

Постойте, это не совсем то, чего мы ожидали! Вместо простого удаления пользователя IAM "trinity" вывод plan говорит о том, что Terraform собирается переименовать его в "morpheus" и затем удалить оригинального пользователя с этим именем. Что происходит?

Ресурс, в котором указан параметр count, превращается в список или массив ресурсов. К сожалению, Terraform определяет каждый элемент массива по его позиции (индексу). То есть после первого выполнения apply с именами трех пользователей внутреннее представление массива в Terraform выглядит примерно так:

aws_iam_user.example[0]: neo

aws_iam_user.example[1]: trinity

aws_iam_user.example[2]: morpheus

Если удалить элемент посреди массива, все остальные элементы, которые шли за ним, смещаются назад на позицию. Поэтому после выполнения plan с именами двух пользователей внутреннее представление будет таким:

aws_iam_user.example[0]: neo

aws_iam_user.example[1]: morpheus

Перейти на страницу:

Все книги серии Бестселлеры O'Reilly

Искусство управления IT-проектами
Искусство управления IT-проектами

В отличие от множества трудов, посвященных руководству проектами и командами, в этой книге не проповедуются никакие новые учения и не превозносятся великие теории. Скотт Беркун считает залогом успеха практику и разнообразие подходов. В книге описываются основные сложности и проблемные ситуации, возникающие в работе менеджера проекта, даны рекомендации по выходу из них.Издание предназначено не только для лидеров команд и менеджеров высшего звена, но и для программистов, тестеров и других исполнителей конкретных проектных заданий. Также оно будет полезно студентам, изучающим бизнес-менеджмент, проектирование изделий или программную инженерию.Текст нового издания значительно переработан автором с целью добиться большей ясности, кроме того, книга дополнена новым приложением и более чем 120 практическими упражнениями.

Скотт Беркун

Деловая литература
iOS. Приемы программирования
iOS. Приемы программирования

Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.

Вандад Нахавандипур

Программирование, программы, базы данных / Программирование / Книги по IT

Похожие книги