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

Terraform如何正确引用for_each创建资源的导出属性?

问题解决方法

核心错误是cloudstack_disk资源块中误用了不存在的变量$name做索引,两个使用相同for_each规则的资源可以通过each.key做关联匹配,具体修正方式如下:

直接修正写法

将cloudstack_disk资源中的virtual_machine_id参数替换为以下内容即可生效:

virtual_machine_id = cloudstack_instance.worker[each.key].id

优化后完整代码(推荐)

为了避免重复编写相同的for_each过滤逻辑,可以直接复用cloudstack_instance.worker的实例集合作为disk资源的遍历源,同时Terraform会自动推导依赖关系,无需手动声明depends_on:

resource "cloudstack_instance" "worker" {
  for_each = {
    for name, machine in var.machines :
    name => machine
    if machine.node_type == "worker"
  }
  name = "${var.prefix}-${each.key}"
  service_offering = "K8S-RBD"
  network_id = var.network_id
  template = var.template_id
  zone = var.zone
  project = var.project_id
  expunge = true
  group = var.prefix
  keypair = var.keypair
  tags = {
    name = "Terraform-VM"
  }
}

resource "cloudstack_disk" "worker" {
  # 直接复用instance的for_each集合,无需重复过滤
  for_each = cloudstack_instance.worker
  name = "${var.prefix}-${each.key}"
  attach = "true"
  disk_offering = "Custom-RBD"
  size = 50
  virtual_machine_id = each.value.id
  zone = var.zone
  project = var.project_id
}

原理解释

  • 使用for_each创建的资源会以键值对的形式存在,你可以通过资源名[键名]的方式访问对应实例的导出属性
  • 两个资源的for_each规则完全一致,键名是一一对应的,所以用当前disk实例的each.key索引instance资源就能拿到对应虚拟机的ID
  • 直接复用cloudstack_instance.worker作为disk的for_each源时,each.value就直接对应了同键名的instance实例对象,可以直接取它的id属性,写法更简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:57:03