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

Terraform中each.key与each.value的使用场景及问题解析

Terraform中each.key与each.value的用法解析及问题排查

核心概念:for_each遍历map时的each对象

当你在Terraform资源中使用for_each = local.propagation_rt_ids时,Terraform会遍历这个map的每一组键值对:

  • each.key:代表当前遍历项的键(比如你的map里的tgw-rt-001、tgw-rt-002)
  • each.value:代表当前遍历项的值(比如你的map里的tgw-rtb-xxx、tgw-rtb-yyy)

你的代码错误原因

你原本想获取路由表ID(也就是map里的value),但错误地写了local.propagation_rt_ids[each.value]——这行代码的逻辑是:用当前项的value(比如tgw-rtb-xxx)作为键,去map里查找对应的值。但你的map中根本没有以tgw-rtb-xxx为键的条目,所以Terraform会抛出The given key does not identify an element in this collection value的错误。

你需要的其实就是each.value本身,它直接就是你要的路由表ID,不需要再通过map索引去获取。

正确的代码写法

有两种等价的正确写法:

写法1:直接使用each.value(推荐,更简洁)

locals {
  propagation_rt_ids = {
    tgw-rt-001 = "tgw-rtb-xxx"
    tgw-rt-002 = "tgw-rtb-yyy"
    tgw-rt-003 = "tgw-rtb-zzz"
  }
}

resource "aws_ec2_transit_gateway_route_table_propagation" "propagate_attachment" {
  for_each                      = local.propagation_rt_ids
  transit_gateway_attachment_id = data.aws_ec2_transit_gateway_vpc_attachment.tenant_id.id
  transit_gateway_route_table_id = each.value # 直接用value,就是路由表ID
}

写法2:用each.key索引map获取value

locals {
  propagation_rt_ids = {
    tgw-rt-001 = "tgw-rtb-xxx"
    tgw-rt-002 = "tgw-rtb-yyy"
    tgw-rt-003 = "tgw-rtb-zzz"
  }
}

resource "aws_ec2_transit_gateway_route_table_propagation" "propagate_attachment" {
  for_each                      = local.propagation_rt_ids
  transit_gateway_attachment_id = data.aws_ec2_transit_gateway_vpc_attachment.tenant_id.id
  transit_gateway_route_table_id = local.propagation_rt_ids[each.key] # 用key索引map拿到value
}

你之前改用each.key成功,就是因为第二种写法是正确的——用存在的键去索引map,能拿到对应的值。

什么时候用each.key vs each.value

  • 用each.key的场景:
    • 需要用map的键作为资源的唯一标识(比如资源名称、标签里的标识)
    • 需要基于键做逻辑判断或其他参数传递
  • 用each.value的场景:
    • 直接需要map里存储的值作为参数(比如你的路由表ID、ARN等)
  • 额外说明:如果for_each遍历的是set(而不是map),那么each.key和each.value是完全相同的,因为set只有值没有键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:31:08