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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:33:32