json - 如何使用数据外部块将来自 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"
}
解决方案
我实际上回答了我自己的问题。我正在使用数据外部块来运行我的 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"]}"]
谢谢你的好建议。
推荐阅读
- mysql - SQL 使用 COUNT(*) AS CountOf 插入选择
- node.js - 构建一次性密码认证服务器
- javascript - 有没有办法从表单中获取值数组
- python - 从连续元素之间的差异小于特定数字的列表创建嵌套列表
- python - 我想将数据框转换为特定格式的数据框或列表列表
- shutdown - 为什么从 wildfly-maven-plugin 启动的 wildfly 服务器没有关闭?
- android - 如何禁用模式锁定屏幕的通知和导航栏
- c# - 如何升级 azure CI 以使用 c# 8.0
- angular - 组件后读取的类
- python - 使用 js 创建独立的散景文档