代码之家  ›  专栏  ›  技术社区  ›  aRTURIUS

Terraform for_每个问题的数据类型

  •  0
  • aRTURIUS  · 技术社区  · 2 年前

    我有下一个代码将快照策略附加到特定实例的现有磁盘:

    data "alicloud_ecs_disks" "db_disks" {
      instance_id = alicloud_instance.db.id
    }
    
    resource "alicloud_ecs_auto_snapshot_policy" "common" {
    ...
    }
    
    resource "alicloud_ecs_auto_snapshot_policy_attachment" "db" {
      for_each                = { for disk in data.alicloud_ecs_disks.db_disks.disks : disk.disk_id => disk }
      auto_snapshot_policy_id = alicloud_ecs_auto_snapshot_policy.common.id
      disk_id                 = each.key
    }
    

    当我运行计划时,它运行得很好,但在应用下一个计划后,由于错误而失败:

    data.alicloud_ecs_disks.db_disks.disks is a list of object, known only after apply
    │ 
    │ The "for_each" value depends on resource attributes that cannot be
    │ determined until apply, so Terraform cannot predict how many instances will
    │ be created. To work around this, use the -target argument to first apply
    │ only the resources that the for_each depends on.
    

    解决这个问题的最佳选择是什么?它在某些机器上使用plan工作,有时不工作。谢谢

    0 回复  |  直到 2 年前
        1
  •  0
  •   Marcin    2 年前

    你犯错误的原因是 alicloud_ecs_disks.db_disks 推荐人 alicloud_instance.db 这可能是在 相同的配置 .正如错误消息所说,您不能在中使用动态数据 for_each .

    解决办法是使用 -target option 首先部署 比如阿里云。分贝 首先,部署完之后,您可以继续处理基础设施的其余部分。

    如果不想拆分部署,那么必须 重新设计 你的TF,这样就不会依赖任何动态内容。

        2
  •  0
  •   aRTURIUS    2 年前

    问题是,在首次应用快照期间,策略已附加到系统磁盘。它强制在下一个计划和实例上重新创建整个实例。申请前不知道身份证。