【问题标题】:Terraform - Invalid index error with multiple countTerraform - 具有多个计数的无效索引错误
【发布时间】:2020-01-16 13:54:41
【问题描述】:

我正在尝试配置 2 个公共 IP 地址和 2 个网络接口。到目前为止我写的是:

resource "azurerm_public_ip" "example" {
  name                    = "test-pip${count.index}"
  count = 2
  location                = "${azurerm_resource_group.rc.location}"
  resource_group_name     = "${azurerm_resource_group.rc.name}"
  allocation_method       = "Dynamic"
  idle_timeout_in_minutes = 30
}
output "public_ip_address" {
  value = "${azurerm_public_ip.example.*.id}"
}

resource "azurerm_network_interface" "main" {
  name                = "test${count.index}"
  count = 2
  location            = "${azurerm_resource_group.rc.location}"
  resource_group_name = "${azurerm_resource_group.rc.name}"

    ip_configuration {
    name                          = "testconfiguration1${count.index}"
    subnet_id                     = "${azurerm_subnet.internal.id}"
    private_ip_address_allocation = "Dynamic"
    public_ip_address_id          = "${azurerm_public_ip.example[count.index].id}"
  }
}

稍后我将使用这两个IP,并通过NI将它们分配给2台VM机器。

当我运行 terraform plan 时,我收到一条错误消息:

Terraform 版本是 "v0.12.3",Azure 提供者版本是 "v1.40.0"

【问题讨论】:

  • 还有更新吗?你用答案解决问题了吗?如果是,请采纳。

标签: terraform terraform-provider-azure


【解决方案1】:

实际上,我认为您在问题中提供的 Terraform 代码没有任何问题,并且在我这边一切正常。

错误还说:

The given key does not identity an element this collection value.

这可能是因为您的公共 IP 没有在网络接口之前创建。真奇怪。 Terraform 将以正确的顺序对所有资源进行排序。也许您可以尝试升级 Terraform 版本。我用的是最新版本:

Terraform v0.12.19
+ provider.azurerm v1.41.0

或者您可以尝试像这样更改代码:

public_ip_address_id    = "${element(azurerm_public_ip.example.*.id, count.index)}"

【讨论】:

  • 这个错误具有误导性,你是对的,一旦我将 terraform 版本从“v0.12.3”升级到“v0.12.19”,这是最新的稳定版本,一切都神奇地工作了。
【解决方案2】:

鉴于这是 Terraform 0.12 而不是问题语法所暗示的 Terraform 0.11,实际错误在特定的导出属性中。要访问由azurerm_public_ip.example 资源导出的IP 地址,我们需要使用ip_address 导出属性而不是id。这就是为什么针对无效键引发错误的原因,尽管错误中的具体引用确实具有误导性。

我们可以通过以下方式更新您的代码以解决此问题:

ip_configuration {
  name                          = "testconfiguration1${count.index}"
  subnet_id                     = "${azurerm_subnet.internal.id}"
  private_ip_address_allocation = "Dynamic"
  public_ip_address_id          = "${azurerm_public_ip.example[count.index].ip_address}"
}

【讨论】:

  • 感谢您的回答。但是,我已将“public_ip_address_id”值更改为您建议的值,并且我得到了完全相同的错误。我正在运行 terraform 版本“v0.12.3”,我的 azure 提供程序版本是“v1.40.0”
  • @Benjamin 好的,如果您使用的是 0.12,那么您使用的特定语法对于访问导出的属性是有效的,但您应该知道您通常使用的是 0.11 语法并且可能想要更新。跨度>
  • @Benjamin 更新答案以反映问题,因为这是 0.12 而不是 0.11。
  • 根据这个 git 问题页面,这似乎是一个已知问题。该对话中提供的解决方案提供了“Public_IP_Address”作为输入变量,但是,在我的情况下,我使用 terraform 生成 IP_Addresses。所以我不知道如何在我的问题中采用该解决方案。 github.com/terraform-providers/terraform-provider-azurerm/…
  • @Benjamin 更新到最新的 Terraform 0.12 有帮助吗?
【解决方案3】:

您可以尝试像这样更改代码,它对我有用:

public_ip_address_id = "${element(azurerm_public_ip.example.*.id, count.index)}"

【讨论】:

    猜你喜欢
    • 2019-02-13
    • 2021-10-25
    • 2019-10-03
    • 1970-01-01
    • 2020-10-15
    • 2020-12-17
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    相关资源
    最近更新 更多