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

如何用Terraform的Map创建不同大小的多个EBS卷?

解决方案

你的核心问题是没有将device_names和volume_size数组中的元素按索引一一配对,导致每个设备都拿到了整个卷大小数组。以下是两种可行的实现方式,无需使用flatten:

方式一:通过索引遍历配对

直接在for循环中同时获取设备名的索引,用索引匹配对应位置的卷大小:

resource "aws_instance" "node" {
  count = length(var.name_map)

  # 补充实例基础配置(根据你的实际环境填写)
  ami           = "ami-xxxxxx"
  subnet_id     = "subnet-xxxxxx"
  instance_type = var.name_map[count.index].instance_type
  tags = {
    Name = var.name_map[count.index].name
  }

  dynamic "ebs_block_device" {
    for_each = [
      for idx, device in var.name_map[count.index].device_names : {
        device_name = device
        volume_size = var.name_map[count.index].volume_size[idx]
      }
    ]

    content {
      device_name           = ebs_block_device.value.device_name
      volume_type           = "gp2"
      volume_size           = ebs_block_device.value.volume_size
      delete_on_termination = true
    }
  }
}

方式二:用zip函数打包数组

利用Terraform的zip函数将两个数组按索引打包成元组,再转换为对象,写法更简洁:

resource "aws_instance" "node" {
  count = length(var.name_map)

  # 补充实例基础配置(根据你的实际环境填写)
  ami           = "ami-xxxxxx"
  subnet_id     = "subnet-xxxxxx"
  instance_type = var.name_map[count.index].instance_type
  tags = {
    Name = var.name_map[count.index].name
  }

  dynamic "ebs_block_device" {
    for_each = [
      for pair in zip(var.name_map[count.index].device_names, var.name_map[count.index].volume_size) : {
        device_name = pair[0]
        volume_size = pair[1]
      }
    ]

    content {
      device_name           = ebs_block_device.value.device_name
      volume_type           = "gp2"
      volume_size           = ebs_block_device.value.volume_size
      delete_on_termination = true
    }
  }
}

效果验证

以devbox实例为例:

  • 第一个ebs_block_device块:设备名/dev/xvdg,卷大小900
  • 第二个ebs_block_device块:设备名/dev/xvdh,卷大小200
    完全匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:25:49