【问题标题】:Getting unsupported attribute error in terraform when using for_each expression使用 for_each 表达式时在 terraform 中出现不支持的属性错误
【发布时间】:2019-12-17 06:27:23
【问题描述】:

在 Terraform v0.12.6 中使用 for_each 表达式动态生成 vnet 子网 (Azure) 的内联块。我定义了列表变量“子网”,两个子网“sub1”和“sub2”如下

variable "subnets" {
  default = [
    {
      name   = "sub1"
      prefix = "1.1.1.1/32"
    },
    {
      name   = "sub2"
      prefix = "2.2.2.2/32"
    },
  ]
}

然后遍历“azurerm_virtual_network”块内的列表变量以创建子网的动态块

dynamic "subnet" {
    for_each = [for s in var.subnets  : { 
        name   = s.name
        prefix = s.prefix
    }]

    content {
      name           = subnet.name
      address_prefix = subnet.prefix
    }   
  }
}

获取即第一个是错误:不支持的属性

在 main.tf 第 42 行,资源“azurerm_virtual_network”“vnet”中: 42:名称=子网名称

此对象没有名为“name”的属性。

【问题讨论】:

  • for s in var.subnets 应该可以在没有 for_each 的情况下进行迭代。

标签: terraform


【解决方案1】:

dynamic 块创建的迭代器对象有两个属性:

  • key:当前元素的映射键或列表索引
  • value: 当前元素的值

在这种情况下,用于重复的集合是一个对象列表,因此subnet.key 将是整数索引 0、1、...,subnet.value 将是与该索引关联的对象。

要获得您正在寻找的结果,您需要访问 subnet.value 上的对象属性:

dynamic "subnet" {
    for_each = [for s in var.subnets  : { 
        name   = s.name
        prefix = s.prefix
    }]

    content {
      name           = subnet.value.name
      address_prefix = subnet.value.prefix
    }   
  }
}

似乎var.subnets 已经与content 块期望的对象结构兼容,因此可以通过直接访问它来进一步简化它:

dynamic "subnet" {
    for_each = var.subnets

    content {
      name           = subnet.value.name
      address_prefix = subnet.value.prefix
    }   
  }
}

只要var.subnets 已经是一个对象列表,这应该会产生相同的结果。

【讨论】:

    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多