Terraform如何遍历手动指定的已创建资源列表创建依赖资源
Terraform 手动指定资源遍历创建关联资源的实现方案
你写的伪代码无法运行的核心原因是:Terraform 不支持声明resource类型的输入变量,也不允许在变量的default字段中直接引用当前配置内定义的托管资源对象。要实现你「手动指定部分资源、遍历创建对应关联资源」的需求,不需要绕变量的限制,用本地值(local)即可实现,具体写法如下:
可直接复用的实现代码
首先保留你原有的基础资源定义:
resource "resource_type" "X" { name = "X" } resource "resource_type" "Y" { name = "Y" }
用本地值存储你手动指定的待关联资源列表,不会自动拉取全量同类型资源,增删目标资源直接改这个列表即可:
locals { # 仅把你需要关联的资源放进这个列表,其他同类型资源不会被纳入遍历范围 selected_origin_resources = [ resource_type.X, resource_type.Y ] }
最后遍历本地值里的资源集合创建关联资源,注意要把列表转成带唯一稳定键的map,避免列表顺序变动触发不必要的资源重建:
resource "type_Dependent" "d" { # 以资源的全局唯一地址为键,转成for_each要求的map结构 for_each = { for res in local.selected_origin_resources : res.address => res } some_attribute = each.value.name # 不需要额外写depends_on,引用each.value的属性时Terraform会自动识别依赖关系,按正确顺序创建资源 }
关键说明
- 不要用输入变量存配置内的资源集合:输入变量的定位是接收外部传入的参数,类型系统没有通用的
resource类型,也不支持在默认值里引用同配置的资源,这类配置内固定的资源集合用本地值是官方推荐的标准写法。 - 必须给
for_each传稳定键的集合:如果直接给for_each传列表,一旦你调整列表内资源的顺序,Terraform会误判资源需要重建替换;用资源自身的唯一地址当键,只要资源本身还在列表里,就不会触发无意义的变更。 - 不需要显式声明
depends_on:只要资源块内引用了目标资源的属性,Terraform会自动推导依赖关系,手动加依赖属于冗余配置。
内容的提问来源于stack exchange,提问作者Maile Cupo
相关产品推荐
相关产品推荐

