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

Terraform中如何用for_each遍历列表?创建EBS卷失败求助

问题分析

你的错误源于对Terraform index函数的误用:index(list, value)的作用是查找列表中等于value的元素的索引位置,而不是通过索引获取元素。你传入的length(each.value.ec2_ebs_volume_size) - 1是索引值(比如列表长度为2时是1),但列表里没有值为1的元素,所以报错"item not found"。

解决方案

如果你的需求是为每个EC2实例创建一个对应其卷大小列表最后一个值的EBS卷,有两种更简单的实现方式:

方式一:直接通过索引访问列表元素

Terraform支持通过list[index]的语法直接访问列表元素,最后一个元素的索引为length(list)-1:

resource "aws_ebs_volume" "ebs_volume" {
  for_each          = var.ec2_details
  availability_zone = each.value.availability_zone
  size              = each.value.ec2_ebs_volume_size[length(each.value.ec2_ebs_volume_size) - 1]
}

方式二:使用last内置函数(推荐)

Terraform提供了last函数,可直接返回列表的最后一个元素,代码更简洁易读:

resource "aws_ebs_volume" "ebs_volume" {
  for_each          = var.ec2_details
  availability_zone = each.value.availability_zone
  size              = last(each.value.ec2_ebs_volume_size)
}
额外补充:如果需要为每个EC2创建多个EBS卷

如果你的实际需求是每个EC2实例对应多个EBS卷(比如每个ec2的ec2_ebs_volume_size有两个值,就创建两个卷),需要调整for_each的遍历对象,生成每个卷的唯一标识:

resource "aws_ebs_volume" "ebs_volume" {
  for_each = {
    for ec2_key, ec2 in var.ec2_details :
    "${ec2_key}-${index}" => {
      az    = ec2.availability_zone
      size  = size
    }
    for index, size in ec2.ec2_ebs_volume_size
  }

  availability_zone = each.value.az
  size              = each.value.size
}

这段代码会为每个EC2的每个卷大小创建独立的EBS卷,资源键格式为ec2_1-0、ec2_1-1等,确保唯一性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:18:15