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集合,验证其中所有元素都属于允许的取值范围。
修正方案参考
- 调整内部模块变量类型(单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\"." } }
- 保留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\"." } }
- 外部模块明确变量类型:将
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
相关产品推荐
相关产品推荐

