Terraform调用JQ遇参数过长报错,求大JSON数据处理方案
优化JQ脚本处理大JSON数据集(解决参数过长问题)
问题根源
原脚本通过中间变量OUTPUT存储所有快照ID,再通过--arg传给jq,当快照数量达42500条时,变量内容过长,超出系统命令行参数长度限制,触发"Argument list too long"报错。
优化方案
核心思路是流式处理JSON数据,避免中间变量存储大量内容,用单条jq命令完成所有转换,彻底规避参数长度限制问题。
修改后的templatefile脚本(cli.tftpl)
#!/bin/bash set -e ${input_string} | jq -c '{output: [.${top}[].${next}]}'
对应调整Terraform配置
将原配置中的next参数值从| .SnapshotId改为.SnapshotId,确保jq语法正确:
data "external" "volsnapshot_ids" { program = [ "bash", "-c", templatefile("cli.tftpl", { input_string = "aws ec2 describe-snapshots --region=eu-west-1", top = "Snapshots", next = ".SnapshotId" }) ] }
优化说明
- 流式处理:直接将AWS命令输出通过管道传给jq,全程流式处理,不会将大量快照ID存储到变量或命令行参数中
- 单条jq完成转换:用jq内置数组语法
[.${top}[].${next}]直接提取所有快照ID并组成数组,最后直接输出符合Terraform external数据源要求的JSON结构 - 效率提升:减少多次jq调用和字符串拆分合并操作,处理大数据集时性能更优
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

