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

如何用jsondecode解码Vault返回的AWS SSH公钥字符串(Terraform)

如何用Terraform的jsondecode解析Vault返回的JSON字符串

你当前从Vault获取的data_json是JSON格式的字符串,需要用jsondecode函数将其转换为Terraform可操作的对象,再从中提取SSH公钥。以下是修改后的代码和关键说明:

修改后的完整代码

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
    vault = {
      source  = "hashicorp/vault"
      version = "~> 3.0" # 建议指定Vault Provider版本,提升稳定性
    }
  }
}

# 配置AWS Provider
provider "aws" {
  region = "us-west-1"
}

provider "vault" {
  # 根据你的Vault实例补充配置,比如地址、认证token等
  # address = "https://your-vault-address:8200"
  # token = var.vault_token
}

resource "aws_instance" "web" {
  ami                    = "ami-1123456789p9"
  instance_type          = "t3.micro"
  vpc_security_group_ids = ["sg-55552f1"]
  subnet_id              = "subnet-dee55a55"
  key_name               = aws_key_pair.tf-key.key_name
}

resource "aws_key_pair" "tf-key" {
  key_name   = "linuxkey"
  # 解码JSON字符串并提取ssh_keys数组的第一个公钥元素
  public_key = jsondecode(data.vault_kv_secret_v2.linux_key.data_json).ssh_keys[0]
}

data "vault_kv_secret_v2" "linux_key" {
  mount = "test/test/test/secret"
  name  = "chef/linux_users/user"
}

# 输出解码后的完整数据结构,用于调试验证
output "decoded_vault_data" {
  value     = jsondecode(data.vault_kv_secret_v2.linux_key.data_json)
  sensitive = true
}

# 输出提取到的SSH公钥
output "extracted_ssh_key" {
  value     = jsondecode(data.vault_kv_secret_v2.linux_key.data_json).ssh_keys[0]
  sensitive = true
}

关键修改说明

  • 解码JSON字符串:通过jsondecode()函数将data_json的字符串内容转换为Terraform可识别的map/array对象,之后就能直接通过字段路径访问内部数据。
  • 提取SSH公钥:Vault返回的ssh_keys是数组类型,而AWS密钥对仅支持单个公钥字符串,因此用ssh_keys[0]提取数组的第一个元素。如果你的场景存在多个公钥,可根据需求调整(比如拼接、选择特定元素)。
  • 调试输出:新增decoded_vault_data输出可以直观查看解码后的完整数据结构,快速确认字段路径是否正确。

内容的提问来源于stack exchange,提问作者Carolina D Vallecillo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 01:57:44