Terraform中动态挂载for_each创建的磁盘至VM时报错求助
Terraform:解决for_each创建的磁盘挂载至count创建VM的问题
问题场景
需要将通过for_each循环创建的磁盘,动态挂载到用count批量创建的Yandex Cloud虚拟机(VM)中,当前配置出现索引错误,尝试yandex_compute_disk.volume[each.key].id仍无法解决。
原配置与错误
磁盘创建配置
resource "yandex_compute_disk" "volume" { for_each = var.volumes name = each.value["name"] size = each.value["size"] type = each.value["type"] }
虚拟机创建配置
resource "yandex_compute_instance" "vps" { count = var.server_count name = var.server_count > 1 ? "${var.server_name}${count.index}" : var.server_name platform_id = var.platform_id zone = var.zone # 省略其他实例配置... dynamic "secondary_disk" { for_each = var.volumes content { disk_id = yandex_compute_disk.volume.id # 此处报错 auto_delete = var.server_volume_auto_delete } } }
错误提示
For example, to correlate with indices of a referring resource, use:
yandex_compute_disk.volume[each.key]
解决方案
错误核心是dynamic块的迭代上下文混淆,需用dynamic块自身的迭代变量索引磁盘资源:
修正后的虚拟机配置
resource "yandex_compute_instance" "vps" { count = var.server_count name = var.server_count > 1 ? "${var.server_name}${count.index}" : var.server_name platform_id = var.platform_id zone = var.zone # 省略其他实例配置... dynamic "secondary_disk" { for_each = var.volumes content { disk_id = yandex_compute_disk.volume[secondary_disk.key].id auto_delete = var.server_volume_auto_delete } } }
关键说明
- 在
dynamic块内部,迭代变量是你给块定义的名称(这里是secondary_disk),而非全局的each。用secondary_disk.key可以获取到var.volumes的每个键值,对应磁盘资源yandex_compute_disk.volume的实例索引。 - 确保
var.volumes为映射类型(map),若为列表类型,for_each会自动转换为以字符串索引为键的映射,同样可用上述方法,但映射类型语义更清晰。示例变量定义:
variable "volumes" { type = map(object({ name = string size = number type = string })) description = "待创建的磁盘配置集合" }
内容的提问来源于stack exchange,提问作者zxcSora
相关产品推荐
相关产品推荐

