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

Terraform中data azuread_users是否支持空值?传null配置PIM报错

Terraform AzureAD PIM 分配报错处理

问题描述

执行Terraform代码时触发必填参数缺失错误:

│ Error: Missing required argument │
│   with module.entragroups.azuread_privileged_access_group_eligibility_schedule.eligible-pim-assignment["group_01"],
│   on .terraform/modules/entragroups/entra/groups/main.tf line 53, in resource "azuread_privileged_access_group_eligibility_schedule" "eligible-pim-assignment":
│   53:   principal_id    = try(data.azuread_users.eligible-pim-users[each.key].object_ids[0], null)
│
│ The argument "principal_id" is required, but no definition was fou

相关代码片段如下:

资源定义

resource "azuread_privileged_access_group_eligibility_schedule" "eligible-pim-assignment" {
  for_each        = var.entra_groups
  group_id        = azuread_group.group[each.key].object_id
  principal_id    = try(data.azuread_users.eligible-pim-users[each.key].object_ids[0], null)
  assignment_type = each.value.assignment_type
  justification        = each.value.justification
  start_date           = each.value.start_date
  expiration_date      = each.value.expiration_date
  permanent_assignment = each.value.permanent_assignment_active
}

数据源定义

data "azuread_users" "eligible-pim-users" {
  for_each             = var.entra_groups
  user_principal_names = each.value.eligible_pim_assignment_users
  ignore_missing       = true
}

变量与示例配置

variable "entra_groups" {
  description = "entra groups"
  type = map(object({
    display_name                  = string
    security_enabled              = optional(bool)
    assignable_to_role            = optional(bool)
    security_group_owners         = optional(list(string), [])
    active_pim_assignment_spn     = optional(list(string), [])
    assignment_type               = optional(string)
    duration                      = optional(string)
    eligible_pim_assignment_users = optional(list(string), [])
    active_pim_assignment_users   = optional(list(string), [])
    permanent_assignment_schedule = optional(bool)
    permanent_assignment_active   = optional(bool)
    justification                 = optional(string)
    start_date                    = optional(string)
    expiration_date               = optional(string)
  }))
  default = {}
}

group_01 = {
  display_name                  = "test"
  description                   = ""
  security_enabled              = true
  assignable_to_role            = true
  active_pim_assignment_spn     = []
  assignment_type               = "member"
  duration                      = ""
  eligible_pim_assignment_users = []
  active_pim_assignment_users   = []
  permanent_assignment_schedule = false
  start_date                    = "2025-03-07T01:02:03Z"
  expiration_date               = "2026-03-01T01:02:03Z"
  permanent_assignment_active   = true
  justification                 = "as requested"
}

解答

1. data azuread_users 是否支持接收null值?

data azuread_users 的 user_principal_names 参数不支持直接传入null,但可以接收空列表。结合 ignore_missing = true 配置时,空列表会返回空的 object_ids 集合,不会触发数据源报错。

2. 报错解决方法

报错核心是 azuread_privileged_access_group_eligibility_schedule 资源的 principal_id 为必填参数,不能传入null。当 eligible_pim_assignment_users 为空列表时,object_ids[0] 会返回null,try 语句最终返回null,违反必填要求。

推荐以下解决方法:

方法一:仅在有用户时创建PIM分配

修改资源和数据源的 for_each 逻辑,只遍历包含有效用户列表的组,避免创建无目标用户的无效分配:

# 优化后的资源定义
resource "azuread_privileged_access_group_eligibility_schedule" "eligible-pim-assignment" {
  for_each = {
    for k, v in var.entra_groups : k => v
    if length(v.eligible_pim_assignment_users) > 0
  }
  group_id        = azuread_group.group[each.key].object_id
  principal_id    = data.azuread_users.eligible-pim-users[each.key].object_ids[0]
  assignment_type = each.value.assignment_type
  justification        = each.value.justification
  start_date           = each.value.start_date
  expiration_date      = each.value.expiration_date
  permanent_assignment = each.value.permanent_assignment_active
}

# 优化后的数据源定义
data "azuread_users" "eligible-pim-users" {
  for_each = {
    for k, v in var.entra_groups : k => v
    if length(v.eligible_pim_assignment_users) > 0
  }
  user_principal_names = each.value.eligible_pim_assignment_users
  ignore_missing       = true
}

方法二:特殊场景下设置默认值(不推荐)

如果业务强制要求必须创建该资源,可设置一个无效的默认Principal ID,但此方法会导致AzureAD API调用失败,仅适用于测试或特殊兼容场景:

principal_id    = try(data.azuread_users.eligible-pim-users[each.key].object_ids[0], "00000000-0000-0000-0000-000000000000")

内容的提问来源于stack exchange,提问作者SRE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:38:22