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
相关产品推荐
相关产品推荐

