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

Terraform jsondecode读取S3 JSON失败及Python兼容生成方案

问题分析与解决

问题场景

S3中存储的初始JSON文件内容如下:

{
  "data_sources": [
    {
      "name": "monzo",
      "tables": [
        "transactions"
      ],
      "format": "CSV",
      "extension": "csv"
    }
  ]
}

使用Terraform读取该文件的配置如下:

data "aws_s3_bucket_object" "data_sources" {
  bucket = "my_bucket"
  key    = "data_sources.json"
}

locals {
  data_sources = jsondecode(data.aws_s3_bucket_object.data_sources.body)
}

执行Terraform时抛出错误:

╷
│ Error: Invalid function argument
│ 
│   on variables.tf line 41, in locals:
│   41:   data_sources = jsondecode(data.aws_s3_bucket_object.data_sources.body)
│     ├────────────────
│     │ while calling jsondecode(str)
│     │ data.aws_s3_bucket_object.data_sources.body is null
│ 
│ Invalid value for "str" parameter: argument must not be null.

将该JSON文件通过VSCode自动格式化后重新上传到S3(内容如下),Terraform可正常读取:

{
  "data_sources": [
    {
      "name": "monzo",
      "tables": ["transactions"],
      "format": "CSV",
      "extension": "csv"
    }
  ]
}

问题原因

错误提示的核心是data.aws_s3_bucket_object.data_sources.body is null,这和JSON的缩进格式无关——两种JSON都是语法合法的,Terraform的jsondecode函数对合法JSON的缩进方式没有限制。

真正的问题大概率是:

  • 初始上传到S3的JSON文件内容为空、上传不完整,或者存在编码异常(比如包含UTF-8 BOM头、不可见特殊字符)
  • VSCode格式化后重新上传的文件是完整且编码正确的,因此Terraform能正常读取
  • 你误将缩进差异当成了问题根源,实际是两次上传的文件本身状态不同(比如第一次上传时本地文件未完全写入就上传,导致S3中文件内容为空)

Python生成合法JSON的方法

用Python生成Terraform可正常读取的JSON,只需确保生成的文件完整、语法合法且编码正确,具体代码如下:

import json

# 示例数据,替换为你的实际字典
converted_data = {
    "data_sources": [
        {
            "name": "monzo",
            "tables": ["transactions"],
            "format": "CSV",
            "extension": "csv"
        }
    ]
}

# 生成JSON文件,指定UTF-8编码避免BOM问题,确保内容完整
with open("data_sources.json", "w", encoding="utf-8") as f:
    json.dump(converted_data, f, indent=2, ensure_ascii=False)

额外注意事项:

  • 生成文件后,先在本地打开验证内容是否完整,无空行或异常字符
  • 上传到S3时,确认文件上传完成,可通过S3控制台查看文件内容是否与本地一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:12:12