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

Terraform模块调用时变量验证失败的原因排查

Terraform变量验证失败原因分析

核心错误1:验证规则逻辑错误,误用map类型变量的属性访问

内部模块中policy_statements的类型是map(object({path = string, capabilities = set(string)})),但验证条件里直接写var.policy_statements.capabilities——这是错误的,因为var.policy_statements是map集合,不是单个object,map本身没有capabilities这个key,只有它的每个元素(即单个policy object)才有该属性。

核心错误2:内部模块变量类型与调用传入值不匹配

调用内部模块时,通过for_each = var.policies循环,给每个module.policies实例传入的policy_statements = each.value,而each.value是单个包含path和capabilities的object,但内部模块定义的policy_statements是map(object(...))类型,类型不匹配进一步加剧了验证逻辑的混乱。

额外问题:验证逻辑未覆盖集合元素检查

即使修正了类型匹配问题,原验证规则的逻辑也不成立:capabilities是set(string)类型,contains(list, set)的写法无法正确检查集合里的每个元素是否都在允许的列表中,应该遍历每个policy的capabilities集合,验证其中所有元素都属于允许的取值范围。


修正方案参考

  1. 调整内部模块变量类型(单policy场景):如果每个模块实例对应单个policy,将policy_statements改为单个object类型,并修正验证逻辑:
variable "policy_statements" {
  description = "The statement of the policy to be created"
  type = object({
    path         = string
    capabilities = set(string)
  })

  validation {
    condition     = alltrue([for c in var.policy_statements.capabilities : contains(["create", "read", "update", "patch", "delete", "list"], c)])
    error_message = "Valid values for capabilities are \"create\", \"read\", \"update\", \"patch\", \"delete\", \"list\"."
  }
}
  1. 保留map类型(多policy场景):如果内部模块需要接收多个policy的map集合,修正验证规则为遍历所有元素:
variable "policy_statements" {
  description = "The statements of the policies to be created"
  type = map(object({
    path         = string
    capabilities = set(string)
  }))

  validation {
    condition     = alltrue([
      for stmt in var.policy_statements :
      alltrue([for c in stmt.capabilities : contains(["create", "read", "update", "patch", "delete", "list"], c)])
    ])
    error_message = "Valid values for capabilities are \"create\", \"read\", \"update\", \"patch\", \"delete\", \"list\"."
  }
}
  1. 外部模块明确变量类型:将var.policies的类型从map(any)改为明确的结构,提前做类型校验:
variable "policies" {
  description = "The statements of the policies to be created"
  type = map(object({
    path         = string
    capabilities = list(string)
  }))
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 18:06:05