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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:10:10