Terraform 将JSON字符串解码为地形图

Terraform 将JSON字符串解码为地形图,terraform,Terraform,我正在使用从内部服务检索数据。该服务返回JSON数据 我无法插入返回的JSON数据并在其中查找数据 例如: 模块A data "http" "json_data" { url = "http://myservice/jsondata" # Optional request headers request_headers { "Accept" = "application/json" } } output "json_data_key" {

我正在使用从内部服务检索数据。该服务返回JSON数据

我无法插入返回的JSON数据并在其中查找数据

例如:

模块A

data "http" "json_data" {
    url = "http://myservice/jsondata"

    # Optional request headers
    request_headers {
       "Accept" = "application/json"
    }
}

output "json_data_key" {
    value = "${lookup(data.http.json_data.body, "mykey")}"
}
main.tf

provider "aws" {
   region = "${var.region}"
   version = "~> 0.1"
}

module "moduleA" {
   source = "../../../terraform-modules/moduleA"
}

resource "aws_instance" "example" {
    ami = "ami-2757f631"
    instance_type = "${module.moduleA.json_data_key}"
}
lookup函数将无法提取JSON数据中的密钥


有没有办法将JSON数据解码成地形图

好的,这样做的方法似乎是使用外部数据,因为它从json响应返回一个映射。


terraform版本v0.10.6

自terraform的0.12版本以来,您可以使用
jsondecode
函数将json解码为terraform地图。详情如下:

data "external" "json" {
  program = ["echo", "${var.json}"]
}

output "map" {
  value = "${data.external.json.result}"
}
以上页面中的示例:

> jsondecode("{\"hello\": \"world\"}")
{
  "hello" = "world"
}
> jsondecode("true")
true

与映射转换没有直接关系,但如果您在AWS SecretsManager中获得了多值机密(=JSON),那么这里有一个额外的示例,其中包含
jsondecode
&您希望在另一个服务中使用不同的值,因为我一直在努力解决这个问题

检索机密:

data "aws_secretsmanager_secret" "oauth_client" {
  name = "oauth-client"
}

data "aws_secretsmanager_secret_version" "oauth_client" {
  secret_id = data.aws_secretsmanager_secret.oauth_client.id
}
以Lambda为例:

resource "aws_lambda_function" "lambda" {
  [...]
  environment {
    variables = {
      OAUTH_CLIENT_ID     = jsondecode(data.aws_secretsmanager_secret_version.oauth_client.secret_string)["client_id"]
      OAUTH_CLIENT_SECRET = jsondecode(data.aws_secretsmanager_secret_version.oauth_client.secret_string)["client_secret"]
    }
  }
}

Jsondecode函数不一定返回映射。事实上,我个人从未见过它返回地图。根据我的经验,它总是返回一个对象。我相信这在很大程度上取决于JSON字符串的结构。