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

如何解析Terraform输出并提取Vault Transit密钥明文值?

问题

已部署运行Vault服务器,通过Terraform启用Transit密钥引擎并创建了vault_transit_secret_backend_key资源。随后使用curl_request数据源发起请求获取密钥明文,当前请求返回404错误,但此前的Terraform输出中包含plaintext字段值,需要解析该Terraform输出,提取其中的plaintext数据并存储到变量中。

相关配置及输出

Terraform核心配置

resource "vault_mount" "transit" {
  path = "transit"
  type = "transit"
}

resource "vault_transit_secret_backend_key" "transit_key" {
  backend = vault_mount.transit.path
  name    = "test-pagination-key"
  type    = "chacha20-poly1305"
}

curl请求配置

data "curl_request" "transit_curl" {
  uri         = "http://vault:8200/v1/transit/datakey/plaintext/test-pagination-key/"
  http_method = "POST"
}

output "transit_response" {
  value = {
    status_code = data.curl_request.transit_curl.response_status_code
    body        = jsondecode(data.curl_request.transit_curl.response_body)
  }
}

Terraform历史输出(diff格式)

~ transit_response = {
      ~ body        = {
          - auth           = null -> null
          - data           = {
              - ciphertext  = "vault:v1:ockH4Bzjzv4s4QM0ok1XqSNpA5fINiqZmIf8K9JND9urvfFRmmpFMsPX4zL4TZL1TpW3mM1J0YtNgmmk"
              - key_version = 1
              - plaintext   = "HTPoZv4gIcnXRIdZW9NiHds9+TGc+Y5uNfp+bR0QhMg="
            } -> null
          + errors         = [
              + <<-EOT
                    1 error occurred:
                        * unsupported path
                    
                EOT,
            ]
          - lease_duration = 0 -> null
          - lease_id       = "" -> null
          - renewable      = false -> null
          - request_id     = "a66b7136-58be-bfa1-452e-800d35451627" -> null
          - warnings       = null -> null
          - wrap_info      = null -> null
        }
      ~ status_code = 200 -> 404
    }

解决方案

方式一:从已有的Terraform历史输出中提取

在终端环境中,可通过命令行工具直接提取plaintext值:

# 提取plaintext并输出到终端
terraform output transit_response | grep -o 'plaintext   = "[^"]*"' | awk -F '"' '{print $2}'

# 提取并保存到环境变量
export PLAINTEXT=$(terraform output transit_response | grep -o 'plaintext   = "[^"]*"' | awk -F '"' '{print $2}')

# 提取并保存到本地文件
terraform output transit_response | grep -o 'plaintext   = "[^"]*"' | awk -F '"' '{print $2}' > plaintext.txt

方式二:修改Terraform配置,直接通过Vault Provider获取(推荐)

无需使用curl_request数据源,Terraform的Vault Provider原生支持生成数据密钥,直接用vault_transit_secret_backend_datakey数据源即可获取明文,同时避免API路径错误:

# 添加数据源,直接生成并获取数据密钥明文
data "vault_transit_secret_backend_datakey" "test_datakey" {
  backend = vault_mount.transit.path
  name    = vault_transit_secret_backend_key.transit_key.name
  type    = "plaintext"
}

# 定义本地变量存储plaintext
locals {
  plaintext = data.vault_transit_secret_backend_datakey.test_datakey.plaintext
}

# 输出plaintext(建议标记为敏感,避免明文泄露)
output "plaintext" {
  value = local.plaintext
  sensitive = true
}

补充:curl请求404的原因

你的curl请求路径末尾多了斜杠/,Vault的API路径不允许末尾带斜杠,修正后的正确路径为:

http://vault:8200/v1/transit/datakey/plaintext/test-pagination-key

修正路径后,curl请求即可正常返回包含plaintext的响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:07:09