Terraform 在资源创建中使用地图列表的地图

Terraform 在资源创建中使用地图列表的地图,terraform,terraform0.12+,Terraform,Terraform0.12+,我希望能够使用TF Vars中定义的以下格式创建多个R53记录: custom_zone_records = { "demo.a.com" = [ {"*.b" = {type: "CNAME", records: ["d.com"]}}, {"*.c" = {type: "CNAME", records: ["d.com"]}} ]

我希望能够使用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)
  }))))
}
我尝试在资源创建中使用
for_each
对数组进行变异,并尝试使用局部文件进行格式化,但没有成功

除了让数组更显式外,还有更好的格式化或处理方法吗

谢谢

编辑:

如果我不使用该变量,我将不得不编写以下代码(作为我试图实现的示例)

一种方法是(假设我正确理解了这个问题),创建一个helper局部变量,将
custom\u zone\u记录
展开到更多的
for\u-each
友好列表中

在下面的示例中,它被称为
helper\u 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\u列表
的格式如下:

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"
  },
]
这样,每个的
用法会更简单,并且可能是(我还没有验证以下内容,所以将其视为伪代码):


到目前为止还不错,您在将变量传递到aws_route53_记录方面做了哪些尝试?你到底被卡在哪里了?甚至为每个_添加了
(循环通过顶级区域,例如
demo.a.com
),然后尝试添加查找,以循环通过值。在这一点上有点卡住了-我们如何(如果可能的话)循环资源中的循环,问题是现实的。如果您在没有变量的情况下手动创建它们,N个资源会是什么样子?对于给定的示例,会有多少个?如果需要循环两次(一次用于不同的域,一次用于不同的记录),则可以创建一个在数据上循环的本地,创建多个嵌套数组,然后在
展平
调用中包装所有内容,这样您就可以在展开的本地上对每个数组进行处理。我编辑了问题,以显示手动创建要创建的记录的过程。我想你不能给我一点代码作为例子,好吗?我想我走错方向了。谢谢。不得不将
toset
更改为
for_each={for record in local.helper_list:record.name=>record}
,因为它在抱怨错误的记录类型,但感谢您为我节省了更多的时间!
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"
  },
]
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
}