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

