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

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}"
    ]
  }
}

代码解释:

  1. local.paths保留了你原来的逻辑,把每个OU名称转成小写后拼接成策略文件夹的路径,输出还是你之前看到的对象结构。
  2. local.policies直接遍历var.core_ous中的每个OU:
    • 用local.paths[ou]拿到当前OU对应的策略文件夹路径
    • 通过fileset获取该路径下所有.json格式的文件
    • 把每个文件名和文件夹路径拼接成完整的文件路径,最终形成一个数组
  3. 最终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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 22:52:29