Terraform报错:Unsupported attribute,无法按YAML配置添加团队用户
问题解决:Terraform Unsupported Attribute 错误修复
报错根源
你的YAML配置里,每个团队(比如TEAM1、TEAM2)对应的值是一组对象(用-开头的列表项),但你在Terraform代码里直接把team当成了带users和roles属性的单个对象来访问——这就错了,因为team实际是个列表,根本没有users这个属性,所以才会抛出"Unsupported attribute"错误。
另外还有两个坑:
- YAML里写了
${test_user_role},但templatefile调用时没传这个变量,渲染会失败。 - 两个数据源
data.squadcast_team.teams和data.squadcast_user.users的for_each会生成重复实例,同一个用户/团队会被多次创建,纯属浪费。
一步步修复
1. 修正遍历逻辑
调整membership_flat的嵌套循环,先遍历团队下的每个用户分组(就是YAML里每个-开头的块),再遍历每个分组里的用户:
locals { render_membership = templatefile("${path.module}/teammembers.yaml", { admin_role = var.admin_role_id user_role = var.user_role_id test_user_role = "你的测试角色ID" # 这里要填实际的角色ID,或者后续加变量 } ) membership_nested = yamldecode(local.render_membership) membership_flat = flatten( [ for team_key, user_groups in local.membership_nested : [ for group in user_groups : [ for user in group.users : { team_name = team_key user_name = user roles = group.roles } ] ] ] ) }
2. 修复数据源重复问题
把数据源的for_each改成基于唯一的团队名和用户名,避免重复实例:
data "squadcast_team" "teams" { for_each = toset([for m in local.membership_flat : m.team_name]) name = each.value } data "squadcast_user" "users" { for_each = toset([for m in local.membership_flat : m.user_name]) email = each.value }
3. 补全缺失的变量(可选)
如果要保留test_user_role,在variables.tf里加个变量:
variable "test_user_role_id" { description = "测试角色的ID" type = string default = "3333333333333" # 替换成实际的角色ID }
然后在templatefile里传这个变量:
test_user_role = var.test_user_role_id
验证修复
执行terraform plan之前,可以先查看渲染后的YAML结构,确认数据格式正确:
terraform output rendered_yaml
内容的提问来源于stack exchange,提问作者Dhaval Shah
相关产品推荐
相关产品推荐

