Ошибка совместимости Terraform - count.index не используется

Я использую 0.12 Terraform, а сценарий написан на 0.11 Terraform.

Блок кода:

resource "azurerm_virtual_machine" "name_av_set" {
  count               = "${var.node_count}"
  #count               = "$length(var.node_count)"
  name                = "${var.resource_name_prefix}-pool-${var.name}-${format("%03d", count.index + 1)}-vm"

  availability_set_id = "${azurerm_availability_set.name_av_set.id}"

При попытке запустить скрипт Terraform выдает ошибку

Ошибка:

Error: Missing resource instance key

  on main.tf, in resource "azurerm_virtual_machine" 
  58:   availability_set_id = "${azurerm_availability_set.name_av_set.id}"

Because azurerm_availability_set.name_av_set has "count" set, its
attributes must be accessed on specific instances.

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

Как изменить, чтобы избавиться от этой ошибки?


person Ravi Challa    schedule 14.09.2019    source источник
comment
Эта ошибка также была бы выдана на 0.11 Terraform.   -  person Matt Schuchard    schedule 15.09.2019


Ответы (2)


Как предлагается в сообщении об ошибке, вы можете добавить часть [count.index] к своей ссылке, если оба этих ресурса имеют count = var.node_count:

  availability_set_id = azurerm_availability_set.name_av_set[count.index].id

Если вы будете следовать документированному процессу обновления, инструмент terraform 0.12upgrade справится с этим. вроде переписывает автоматически. В этом случае инструмент обновления выберет другое решение, потому что это более консервативный выбор:

  availability_set_id = azurerm_availability_set.name_av_set[0].id

Индекс жесткого кодирования 0 лучше соответствует поведению вашего выражения Terraform 0.11, потому что в Terraform 0.11 azurerm_availability_set.name_av_set.id означает получение id первого экземпляра azurerm_availability_set.name_av_set.

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

person Martin Atkins    schedule 17.09.2019
comment
Этот ответ заслуживает большей наглядности, вы решили проблему, над которой я боролся несколько дней, спасибо! - person Ced; 08.12.2020

Поскольку вы определили ресурс azurerm_availability_set.name_av_set со счетчиком, теперь он обрабатывается как список объектов. Таким образом, вы не можете установить azurerm_availability_set.name_av_set.id в azurerm_virtual_machine.name_av_set, он должен быть azurerm_availability_set.name_av_set.0.id или проиндексирован.

person James Woolfenden    schedule 14.09.2019