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

Terraform嵌套对象列表遍历异常:reviewers_map为空

问题分析与解决

核心问题

运行terraform plan时出现错误提示:local.reviewers_map 为空字符串映射,根源在于两个关键错误:

  1. 列表嵌套未扁平化:requestors、primary_approvers、alternative_approvers生成的是多层嵌套列表,而非一维对象列表,导致后续合并后的requestors_and_approvers仍是嵌套结构,无法正确遍历提取属性。
  2. 对象遍历方式错误:遍历对象列表时误用了键值对遍历语法,无法正确获取每个对象的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 12:59:53