Terraform中能否结合provider别名使用for_each创建资源
结论
Terraform 不支持你尝试的这种动态绑定provider、通过for_each迭代批量创建关联不同别名provider资源的用法。
根本原因
资源块的provider是元参数,和for_each、count这类元参数一样,会在配置静态解析阶段完成校验和绑定,优先级远高于普通参数的运行时求值流程。
你写的插值拼接provider引用、用lookup从映射表取provider值的逻辑,都属于plan阶段才会执行的动态求值逻辑,静态解析阶段根本拿不到each.key、函数返回值这类动态结果,自然无法识别。
可落地的替代方案
目前没有办法完全消除重复定义,只能通过模块封装减少重复代码量:
- 如果provider别名数量很少,直接写多个独立资源块,每个块显式指定对应别名的provider即可
- 如果provider别名数量较多,可以把需要创建的资源封装到独立的通用模块中,模块内部不需要配置provider绑定,之后针对每个provider别名写一个模块调用块,在调用块的
providers元参数里静态绑定对应别名的provider即可,比重复写多份资源配置要简洁很多。
通用模块调用的示例配置如下:
# 提前定义好带不同别名的provider配置 provider "vendor" { alias = "alias1" # alias1对应的专属配置 } provider "vendor" { alias = "alias2" # alias2对应的专属配置 } # 针对每个provider单独调用封装好的资源模块 module "resource_alias1" { source = "./modules/vendor_common_resource" # 传入资源需要的业务参数 providers = { vendor = vendor.alias1 } } module "resource_alias2" { source = "./modules/vendor_common_resource" # 传入资源需要的业务参数 providers = { vendor = vendor.alias2 } }
注意:模块调用块的providers参数同样不支持动态传值,必须静态写死绑定关系,这是Terraform从设计层面就定下的规则,没有绕过的方法。
内容的提问来源于stack exchange,提问作者David Ha
相关产品推荐
相关产品推荐

