在资源创建中使用地图列表的地图
Use a map of lists of maps in resource creation
我希望能够创建多个 R53 记录,使用 TF Vars 中定义的以下格式:
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)
}))))
}
我试过使用 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
的用法就更简单了,可以是(以下我没有验证过,就当作pseudo-code):
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
}
我希望能够创建多个 R53 记录,使用 TF Vars 中定义的以下格式:
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)
}))))
}
我试过使用 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
的用法就更简单了,可以是(以下我没有验证过,就当作pseudo-code):
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
}