Terraform遍历map(map(object{}))时无法访问对象属性报错排查
Terraform for_each循环属性访问错误分析与修复
错误根源
报错提示each.value仅包含dev-main属性,无法找到environment_variables,核心问题是lambda_configs变量的结构不一致:
- 以
dev-main环境为例,replication的配置是直接的对象结构(包含memory、environment_variables等属性); - 但
test-generator的配置多嵌套了一层,变成{ dev-main = { ... 实际配置 ... } },导致for_each循环迭代到test-generator时,each.value指向的是这个嵌套对象,而非真正的lambda配置对象。
修复方案
方案1:统一配置结构(推荐)
将test-generator的嵌套层级移除,和replication保持一致的结构:
# vars.tf中dev-main和dev-qa下的test-generator修改为: "test-generator" = { memory = 128 timeout = 120 ephemeral_storage = 512 environment_variables = { LOG_LEVEL = "WARNING", } }
这样for_each循环迭代时,每个each.value都是直接包含environment_variables的配置对象,即可正常访问属性。
方案2:调整for_each逻辑兼容嵌套结构
如果需要保留按环境嵌套的配置方式,可修改for_each表达式,自动识别并深入嵌套层级取到配置对象:
# example.tf中的for_each修改为: for_each = { for k, v in var.lambda_configs[var.env_name] : k => (contains(keys(v), var.env_name) ? v[var.env_name] : v) }
该逻辑会判断当前值是否包含当前环境名的嵌套key,如果包含则取嵌套内的配置,否则直接使用当前值。
额外优化建议
恢复vars.tf中注释掉的类型约束,让Terraform在初始化阶段就检查配置结构是否合规,提前发现错误:
variable "lambda_configs" { type = map(map(object({ memory = optional(number), timeout = optional(number), ephemeral_storage = optional(number), environment_variables = map(string), subnets = optional(list(string)) }))) # 保留default配置... }
内容的提问来源于stack exchange,提问作者AlexLordThorsen
相关产品推荐
相关产品推荐

