Terraform嵌套对象列表遍历异常:reviewers_map为空
问题分析与解决
核心问题
运行terraform plan时出现错误提示:local.reviewers_map 为空字符串映射,根源在于两个关键错误:
- 列表嵌套未扁平化:
requestors、primary_approvers、alternative_approvers生成的是多层嵌套列表,而非一维对象列表,导致后续合并后的requestors_and_approvers仍是嵌套结构,无法正确遍历提取属性。 - 对象遍历方式错误:遍历对象列表时误用了键值对遍历语法,无法正确获取每个对象的
object_id和subject_type属性。
修正代码
修改locals块中的变量定义,解决上述问题:
locals { group_names = distinct([for group in var.existing_groups : group.name]) # 扁平化请求者列表,将嵌套结构转为一维对象列表 requestors = flatten([ for ap in var.assignment_policies : ap.requestor_settings.requestor ]) # 扁平化主审批者列表,处理两层嵌套结构 primary_approvers = flatten([ for ap in var.assignment_policies : flatten([ for as in ap.approval_settings.approval_stage : as.primary_approver ]) ]) # 扁平化备选审批者列表,处理两层嵌套结构,保留try容错 alternative_approvers = try( flatten([ for ap in var.assignment_policies : flatten([ for as in ap.approval_settings.approval_stage : as.alternative_approver ]) ]), [] ) approvers = concat(local.primary_approvers, local.alternative_approvers) requestors_and_approvers = concat(local.requestors, local.approvers) # 修正遍历方式,从每个对象中提取属性 reviewer_groups = distinct([ for item in local.requestors_and_approvers : item.object_id if item.subject_type == "groupMembers" ]) reviewer_users = distinct([ for item in local.requestors_and_approvers : item.object_id if item.subject_type == "singleUser" ]) groups_map = zipmap(data.azuread_groups.reviewer_groups.display_names, data.azuread_groups.reviewer_groups.object_ids) users_map = zipmap(data.azuread_users.reviewer_users.user_principal_names, data.azuread_users.reviewer_users.object_ids) reviewers_map = merge(local.groups_map, local.users_map) } data "azuread_groups" "reviewer_groups" { display_names = local.reviewer_groups } data "azuread_users" "reviewer_users" { user_principal_names = local.reviewer_users }
修正说明
- 使用
flatten()函数将所有嵌套的对象列表转为一维结构,确保requestors_and_approvers中的每个元素都是独立的对象。 - 遍历对象列表时,改为
for item in ...的语法,通过item.object_id和item.subject_type正确提取属性,筛选出符合条件的组和用户ID。 - 修正后
reviewer_groups和reviewer_users将正确获取到目标ID,后续的groups_map、users_map和reviewers_map也会生成有效的映射。
内容的提问来源于stack exchange,提问作者Joseph Leiber
相关产品推荐
相关产品推荐

