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

Terraform遍历JSON文件键生成指定文件的实现问题

使用Terraform遍历JSON生成指定命名文件的问题解决

问题概述

需要遍历固定格式的JSON文件,生成file1a、file2a、file2b三个文件。当前通过locals处理JSON时,仅能获取子对象内容而非键名,无法生成正确命名的文件,需构建包含file名称(如file1、file2)和对应字母标识(如a、b)的结构。


相关文件与代码示例

JSON源文件(files.json)

{
  "file1": {
    "a": "content for file1a"
  },
  "file2": {
    "a": "content for file2a",
    "b": "content for file2b"
  }
}

现有Terraform代码(存在问题)

locals {
  file_data = jsondecode(file("files.json"))
  flattened_files = flatten([
    for file in local.file_data : [
      for content in file : {
        filename = "???" # 无法正确拼接file名称与字母标识
        content = content
      }
    ]
  ])
}

resource "local_file" "generated_files" {
  for_each = { for f in local.flattened_files : f.filename => f }
  filename = each.value.filename
  content  = each.value.content
}

当前错误表现

无法生成file1a这类符合预期的文件名,仅能获取子对象的内容值,无法关联file名称与字母标识。

预期输出

成功生成三个文件:

  • file1a:内容为content for file1a
  • file2a:内容为content for file2a
  • file2b:内容为content for file2b

解决方案

调整locals中的嵌套遍历逻辑,同时捕获父键名(file名称)和子键名(字母标识),具体代码如下:

locals {
  file_data = jsondecode(file("files.json"))
  flattened_files = flatten([
    # 第一层遍历:捕获file名称(如file1)及其对应的子对象
    for file_name, file_contents in local.file_data : [
      # 第二层遍历:捕获字母标识(如a)及其对应的内容
      for letter, content in file_contents : {
        filename = "${file_name}${letter}"
        content  = content
      }
    ]
  ])
}

resource "local_file" "generated_files" {
  for_each = { for f in local.flattened_files : f.filename => f }
  filename = each.value.filename
  content  = each.value.content
}

代码说明

  1. 第一层遍历通过for file_name, file_contents in local.file_data,同时获取file的键名(如file1)和对应的子对象;
  2. 第二层遍历通过for letter, content in file_contents,获取子对象的字母标识(如a)和内容;
  3. 使用"${file_name}${letter}"拼接出目标文件名;
  4. 通过flatten将嵌套列表展开为一维结构,适配for_each的使用要求。

执行上述代码后,即可生成符合预期命名和内容的三个文件。

内容的提问来源于stack exchange,提问作者Ben Dyson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:05:19