Подсчет выходных переменных с terraform 0.12+

Условно создаю ресурс со счетчиком:

resource "aws_kms_key" "this" {
  count       = var.create_kms_key == true ? 1 : 0
  ...
}

Как мне тогда условно вывести значение этого ресурса? Я пробовал поиграть, но Terraform, кажется, противоречит сам себе

Сначала он говорит мне использовать счет в выводе.

For example, to correlate with indices of a referring resource, use:
    aws_kms_key.this[count.index]

Затем, когда я пытаюсь это сделать, он говорит, что я не могу использовать счет.

The "count" object can be used only in "resource" and "data" blocks, and only
when the "count" argument is set.

Раньше мы могли сделать что-то вроде ниже, но теперь это вызывает ошибку подсчета, которую я опубликовал ранее.

output "kms_key_arn" {
    value = aws_kms_key.this.*.arn
}

Есть идеи, как это работает сейчас?

Спасибо,


person rix    schedule 02.09.2019    source источник


Ответы (1)


Когда count установлен для ресурса, ссылки на этот ресурс затем возвращают список объектов, а не один объект, и поэтому нам нужно писать наши другие выражения с учетом этого.

В вашем случае этот список может иметь либо ноль, либо один элемент, поэтому мы должны обрабатывать оба этих случая в любом выражении, которое на него ссылается.

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

output "kms_key_arn" {
    value = concat(aws_kms_key.this.*.arn, [null])[0]
}

Техника здесь состоит в том, чтобы перейти от списка с нулевым или одним элементом к списку с одним или двумя элементами, а затем взять первый элемент. Есть два варианта того, что может вернуть эта concat функция:

["arn:aws:....", null]
[null]

В обоих случаях можно использовать нулевой элемент с помощью [0]. Во втором случае в качестве результата будет выбрано null.


Если у вас есть другие ресурсы, которые также зависят от var.create_kms_key, есть вариант этого подхода:

resource "aws_kms_key" "example" {
  count = var.create_kms_key ? 1 : 0

  # ...
}

resource "anything_else" "example" {
  count = length(aws_kms_key.example) # only if KMS key is created

  any_argument = aws_kms_key.example[count.index].arn
}

Этот вариант основан на том факте, что оба этих ресурса имеют одинаковое значение для count, и поэтому мы можем использовать count.index во втором ресурсе для корреляции с экземплярами первого. count.index можно использовать только внутри ресурса, где установлено count, но в данной конкретной ситуации он установлен, и поскольку мы устанавливаем count на длину другого ресурса, мы знаем, что все значения count.index будут в диапазон для списка объектов этого ресурса.

person Martin Atkins    schedule 03.09.2019
comment
Спасибо, что нашли время, чтобы ответить на этот вопрос, и спасибо за всю вашу работу над TF. В конце концов, моя проблема заключалась в том, что в другом фрагменте кода я не использовал счетчик, поэтому ошибки TF казались противоречивыми. На самом деле все работало так, как задумано. - person rix; 04.09.2019