Terraform多层嵌套count实现Azure RBAC资源级角色分配报错处理
问题修复方案
1 修复角色分配scope字段报错
报错的核心原因是:你通过count声明了data.azurerm_resources.role_scope_resource,所以它本身是长度等于length(var.resource_roles)的实例列表,访问属性前必须先指定对应索引的实例,再取该实例下resources列表的第0项ID。
直接替换azurerm_role_assignment的scope字段即可:
scope = data.azurerm_resources.role_scope_resource[count.index].resources[0].id
另外需要同步修正principal_id字段的错误写法:每个模块实例对应一个AAD组,该组的所有角色分配共用同一个principal_id,不需要按count.index取。首先确认aad-group-generic-roles模块内的AAD组查询逻辑正确:
data "azuread_group" "security_group" { display_name = var.group_display_name }
然后将principal_id修改为:
principal_id = data.azuread_group.security_group.id
2 修复output报错
报错原因是你调用模块时使用了for_each,所以module.aad_permissions_assignments_generic是一个以组名为key的map结构,不能直接访问.test属性,需要遍历获取所有实例的输出。
保留aad-group-generic-roles内的test输出不变,修改aad_permissions_assignments文件夹下的output配置:
# 输出为列表格式 output "testparent" { value = [for group in module.aad_permissions_assignments_generic : group.test] } # 若需要按组名分组输出可以用以下写法 # output "testparent" { # value = { for k, group in module.aad_permissions_assignments_generic : k => group.test } # }
额外优化建议
可以在取resources[0]前增加校验逻辑,避免查询不到资源时直接报错:
scope = length(data.azurerm_resources.role_scope_resource[count.index].resources) > 0 ? data.azurerm_resources.role_scope_resource[count.index].resources[0].id : null
内容的提问来源于stack exchange,提问作者Jayendran
相关产品推荐
相关产品推荐

