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
相关产品推荐
相关产品推荐

