使用Terraform External数据源解析SOPS JSON文件时遇报错求助
问题:Terraform External Provider解析SOPS加密JSON报错
报错信息
37b40d-39c3-ca0a-5a76-d8a5f44456d8 @module=external output="{ \"AzureAD\": { \"Application ID\": \"REDACTED\", \"Description\": \"REDACTED\", \"Secret Id\": \"REDACTED\", \"Value\": \"REDACTED\" } }"
对应Terraform代码
data "external" "sops_to_yaml" { program = ["bash", "scripts/sops_decode.sh"] query = { file = "${path.module}/secrets/account_secrets_testing.json" } } output "secret_output" { value = [for k, v in nonsensitive(data.external.sops_to_yaml.result) : "key=${k} | value=${v} "] }
所用bash脚本
#!/bin/bash # 解密SOPS加密文件并读取JSON # 步骤1:解析输入参数 eval "$(jq -r '@sh "file=\(.file)"')" sops -d --kms $(terraform output -raw kms_sops_key_arn) $file
问题原因与解决办法
Terraform的external数据源要求脚本输出必须是扁平键值对结构的JSON,当前脚本输出的是嵌套JSON(AzureAD下包含子字段),不符合数据源的解析规则,因此触发报错。
方案1:保留嵌套结构输出
修改bash脚本,将整个嵌套JSON作为单个值封装进扁平JSON结构:
#!/bin/bash eval "$(jq -r '@sh "file=\(.file)"')" # 将解密后的嵌套JSON转为字符串,作为单个键值对输出 sops -d --kms $(terraform output -raw kms_sops_key_arn) $file | jq -c '{secret_data: .}'
对应调整Terraform输出代码,直接提取嵌套内容:
output "secret_output" { value = nonsensitive(data.external.sops_to_yaml.result.secret_data) }
方案2:直接生成YAML用于存入Vault
若最终目标是将内容转为YAML存入Vault,可在脚本中完成JSON转YAML的操作,再将YAML字符串封装为符合要求的JSON输出:
#!/bin/bash eval "$(jq -r '@sh "file=\(.file)"')" # 解密后转YAML,再将YAML字符串作为JSON值输出 sops -d --kms $(terraform output -raw kms_sops_key_arn) $file | yq -o json -c '{yaml_content: .}'
后续在Terraform中即可提取yaml_content字段,直接用于写入Vault的配置。
内容的提问来源于stack exchange,提问作者PsySkeletor
相关产品推荐
相关产品推荐

