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
相关产品推荐
相关产品推荐

