如何解析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
相关产品推荐
相关产品推荐

