Terraform中基于文件夹路径及内部JSON文件创建策略:映射构建报错解决与实现方案
解决Terraform中基于文件夹结构构建策略映射的问题
你的问题出在setproduct函数的使用上——它要求传入的参数是集合或列表类型,但你传入的local.paths是一个对象(键值对结构),这就导致了参数类型不匹配的错误。
根据你的需求,我们完全可以直接基于var.core_ous来循环构建映射,不需要绕到setproduct。这里给你调整后的代码:
locals { # 保持原逻辑:为每个OU生成对应的策略文件夹路径(OU名称转小写) paths = { for ou in var.core_ous : ou => "${path.module}/policies/${lower(ou)}" } # 构建预期的策略映射:OU名称对应其下所有策略文件的完整路径 policies = { for ou in var.core_ous : ou => [ for file in fileset(local.paths[ou], "*.json") : "${local.paths[ou]}/${file}" ] } }
代码解释:
local.paths保留了你原来的逻辑,把每个OU名称转成小写后拼接成策略文件夹的路径,输出还是你之前看到的对象结构。local.policies直接遍历var.core_ous中的每个OU:- 用
local.paths[ou]拿到当前OU对应的策略文件夹路径 - 通过
fileset获取该路径下所有.json格式的文件 - 把每个文件名和文件夹路径拼接成完整的文件路径,最终形成一个数组
- 用
- 最终
local.policies的结构完全符合你的预期:{ "Security" = [ "modules/organizations/policies/security/file1.json", "modules/organizations/policies/security/file2.json" ], "Infrastructure" = [ "modules/organizations/policies/infrastructure/file3.json", "modules/organizations/policies/infrastructure/file4.json" ] }
如果你只需要文件名(不需要完整路径),可以把拼接路径的部分去掉,直接返回file即可:
policies = { for ou in var.core_ous : ou => fileset(local.paths[ou], "*.json") }
这样后续你就可以直接遍历local.policies来实现策略配置的循环了。
内容的提问来源于stack exchange,提问作者Joy
相关产品推荐
相关产品推荐

