terraform - 在资源创建中使用地图列表的地图
问题描述
我希望能够使用 TF Vars 中定义的以下格式创建多个 R53 记录:
custom_zone_records = {
"demo.a.com" = [
{"*.b" = {type: "CNAME", records: ["d.com"]}},
{"*.c" = {type: "CNAME", records: ["d.com"]}}
]
}
以记录为例,它应该创建 R53 记录:
Name: *.b.demo.a.com
Type: CNAME
Records: ["d.com"]
输入变量定义为:
variable "custom_zone_records" {
description = "A map of maps for custom zone records"
type = map(list(map(object({
type = string
records: list(string)
}))))
}
我尝试使用 a 在资源创建中改变数组,for_each
并尝试使用本地文件进行格式化,但没有成功。
除了让数组更明确之外,还有更好的方法来格式化或处理这个问题吗?
谢谢。
编辑:
如果我不使用该变量,我将不得不编写以下代码(作为我想要实现的示例)
resource "aws_route53_record" "demo_a" {
zone_id = "ZONE_ID"
name = "*.b.demo.a.com"
type = "CNAME"
records = ["d.com"]
ttl = 60
}
resource "aws_route53_record" "demo_a" {
zone_id = "ZONE_ID"
name = "*.c.demo.a.com"
type = "CNAME"
records = ["d.com"]
ttl = 60
}
解决方案
做到这一点的一种方法(假设我正确理解了这个问题)是创建一个辅助局部变量,它将“展开”custom_zone_records
到更for_each
友好的列表中。
在以下示例中,它被称为helper_list
:
locals {
custom_zone_records = {
"demo.a.com" = [
{"*.b" = {type: "CNAME", records: ["d.com"]}},
{"*.c" = {type: "CNAME", records: ["d.com"]}}
],
"demo1.a.com" = [
{"*.b1" = {type: "CNAME", records: ["d1.com"]}},
{"*.c1" = {type: "CNAME", records: ["d1.com"]}}
]
}
helper_list = flatten([for k, v in local.custom_zone_records:
[for v1 in v:
merge({name = join("", [keys(v1)[0], ".", k])}, values(v1)[0])
]
])
}
将helper_list
具有以下形式:
helper_list = [
{
"name" = "*.b.demo.a.com"
"records" = [
"d.com",
]
"type" = "CNAME"
},
{
"name" = "*.c.demo.a.com"
"records" = [
"d.com",
]
"type" = "CNAME"
},
{
"name" = "*.b1.demo1.a.com"
"records" = [
"d1.com",
]
"type" = "CNAME"
},
{
"name" = "*.c1.demo1.a.com"
"records" = [
"d1.com",
]
"type" = "CNAME"
},
]
这样,for_each
用法会更简单,可能是(以下我没有验证,所以将其视为伪代码):
resource "aws_route53_record" "demo" {
for_each = toset(local.helper_list)
zone_id = "ZONE_ID"
name = each.value.name
type = each.value.type
records = each.value.records
ttl = 60
}
推荐阅读
- javascript - 如何使用 Rails 中的返回 json 图像链接将用户图像添加到他们的名称中?
- ffmpeg - 你能用ffmpeg改变解码格式吗?
- c# - WPF 通过文件对话框选择图像并将其插入到特定大小
- ios - Firebase 读取/保存数据以将其用作列表 | 斯威夫特/火力基地
- windows - 如果 BkGd 进程准备好接收密钥,客户端进程将密钥发送到 BkGd 进程,后者将它们放入 KeyBoard 缓冲区
- r - 使用 log10 trans 带误差线的条形图
- c - 执行不带 ./ 的编译后的可执行 C 文件
- swift - Xcode 9.2 - 标签值已更新但未在模拟器中显示
- c++ - 你如何确定 MySQLCPPConn 库文件在哪里?
- android - Android Studio - MainActivity.java 看不到 id 属性