首页 > 解决方案 > 如何使用数据外部块将来自 Terraform null_resource 的 JSON 解析为地图

问题描述

我正在尝试将 JSON 键/值对解析为我可以在查找期间在 Terraform 中使用的映射。

我使用 local-exec 配置程序创建了一个 null_resource 来运行我的 aws cli 命令,然后使用 jq 对其进行解析以清理它。JSON 看起来不错,从 CLI 运行时会显示正确的键/值对。我创建了一个外部数据块来将 JSON 转换为 TF 映射,但是我从 TF 收到了一个 Inccorect 属性错误。

resource "null_resource" "windows_vars" {
  provisioner "local-exec" {
    command = "aws ssm --region ${var.region} --profile ${var.profile}  get-parameters-by-path --recursive --path ${var.path} --with-decryption | jq '.Parameters | map({'key': .Name, 'value': .Value}) | from_entries'"
  }
}

data "external" "json" {
  depends_on  = [null_resource.windows_vars]
  program     = ["echo", "${null_resource.windows_vars}"]
}

output "map" {
  value = ["${values(data.external.json.result)}"]
}

我希望将键/值对添加到我可以在其他地方使用的 TF 映射中。我收到以下错误:

Error: Incorrect attribute value type

  on instances/variables.tf line 33, in data "external" "json":
  33:   program     = ["echo", "${null_resource.windows_vars}"]

Inappropriate value for attribute "program": element 1: string required.

JSON 输出如下所示:

{
  "/vars/windows/KEY_1": "VALUE_1",
  "/vars/windows/KEY_2": "VALUE_2",
  "/vars/windows/KEY_3": "VALUE_3",
  "/vars/windows/KEY_4": "VALUE_4"
}

标签: jsonterraform

解决方案


我实际上回答了我自己的问题。我正在使用数据外部块来运行我的 aws cli 命令并在我的模块中引用该块。

data "external" "json" {
  program = ["sh", "-c", "aws ssm --region ${var.region} --profile ${var.profile} get-parameters-by-path --recursive --path ${var.path} --with-decryption | jq '.Parameters | map({'key': .Name, 'value': .Value}) | from_entries'"]
}

${var.amis["win2k19_base"]} 将在我使用的 ami id 的地图上进行查找,我将其用作参数存储中我正在寻找的值的键。

在我的模块中,我正在使用这个:

instance_var = data.external.json.result["${var.path}${var.amis["win2k19_base"]}"]

谢谢你的好建议。


推荐阅读