You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform中遍历Groups创建og资源时报错‘该对象没有名为“groups”的属性’,请求排查resource块逻辑问题

问题分析与解决

嘿,我一眼就揪出问题所在了——你误用了Terraform的splat运算符[*]!local.instances是一个键值对结构的map,而splat运算符[*]是专门用来遍历列表、集合这类序列类型的。直接在map上用local.instances[*].groups时,Terraform会误以为你要访问map对象本身的groups属性,但map根本没有这个属性,自然就抛出了那个报错。

你的local.instances里,test1、test2是map的键,每个键对应的值才是包含groups属性的嵌套对象。要拿到所有实例里的groups列表,得先把map的所有值提取成列表,再用splat运算符遍历才行。

修正后的代码

先把for_each的表达式改对,这是核心:

resource "og" "example" {
  # 先转map的值为列表,再提取所有groups,最后扁平化+转集合去重
  for_each = toset(flatten(values(local.instances)[*].groups))
  name        = each.value
  description = "${each.value}-access"
}

另外,你原来的locals定义里,每个groups列表后面多了个逗号(比如groups = ["app1","app2"],),虽然Terraform可能不会报错,但这种冗余符号容易引发潜在问题,建议去掉:

locals {
  instances = {
    test1 = {
      baseUrl    = "url1"
      subDomain  = "sd1"
      groups     = [
        "app1",
        "app2"
      ]
    }
    test2 = {
      baseUrl    = "url2"
      subDomain  = "sd2"
      groups     = [
        "t1",
        "t2"
      ]
    }
  }
}

再给你拆解下修正后的逻辑

  • values(local.instances):把map里的所有值(也就是两个包含baseUrl、subDomain、groups的对象)转换成一个列表,这样就能用splat运算符了。
  • [*].groups:遍历这个列表里的每个对象,提取它们的groups属性,得到一个嵌套列表:[["app1","app2"], ["t1","t2"]]。
  • flatten(...):把嵌套列表展开成一维列表,变成["app1","app2","t1","t2"]。
  • toset(...):转换成集合类型,自动帮你去重——如果不同实例的groups有重复值,只会创建一个对应的og资源。

内容的提问来源于stack exchange,提问作者Guru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 21:57:45