For loop 使用route 53记录在地形图中迭代对象

For loop 使用route 53记录在地形图中迭代对象,for-loop,foreach,terraform,amazon-route53,For Loop,Foreach,Terraform,Amazon Route53,我试图弄清楚如何在Terraform 0.12.26中使用for/for_读取Terraform中的附加值 dns.tfvars mx = { "mywebsite.org." = { ttl = "3600" records = [ "home.mywebsite.org.", "faq.mywebsite.org." ] } "myotherw

我试图弄清楚如何在Terraform 0.12.26中使用for/for_读取Terraform中的附加值

dns.tfvars

mx = {
  "mywebsite.org." = {
    ttl = "3600"
    records = [
      "home.mywebsite.org.",
      "faq.mywebsite.org."
    ]
  }
  "myotherwebsite.org." = {
    ttl = "3600"
    records = [
      "home.myotherwebsite.org."
    ]
  }
}
变量。tf

variable "mx" {
  type = map(object({
    ttl     = string
    records = set(string)
  }))
}
locals {
  mx_records = flatten([
    for mx_key, mx in var.mx : [
      for record in mx.records : {
        mx_key = mx_key
        record = record
        ttl    = mx.ttl
    }]
  ])
}

resource "aws_route53_record" "mx_records" {
  for_each = { for mx in local.mx_records : mx.mx_key => mx... }
  zone_id  = aws_route53_zone.zone.zone_id
  name     = each.key
  type     = "MX"
  ttl      = each.value.ttl

  records = [
    each.value.record
  ]
}
mx.tf

variable "mx" {
  type = map(object({
    ttl     = string
    records = set(string)
  }))
}
locals {
  mx_records = flatten([
    for mx_key, mx in var.mx : [
      for record in mx.records : {
        mx_key = mx_key
        record = record
        ttl    = mx.ttl
    }]
  ])
}

resource "aws_route53_record" "mx_records" {
  for_each = { for mx in local.mx_records : mx.mx_key => mx... }
  zone_id  = aws_route53_zone.zone.zone_id
  name     = each.key
  type     = "MX"
  ttl      = each.value.ttl

  records = [
    each.value.record
  ]
}
在mx.tf中,我可以注释掉第二个值faq.mywebsite.org,代码运行得非常好。我不知道如何设置for循环和for-each语句,使其通过第二个值“循环”。我收到的第一个错误如下:

Error: Duplicate object key

  on mx.tf line 13, in resource "aws_route53_record" "mx_records":
  13:   for_each = { for mx in local.mx_records : mx.mx_key => mx }
    |----------------
    | mx.mx_key is "mywebsite.org."

Two different items produced the key "mywebsite.org." in this 'for'
expression. If duplicates are expected, use the ellipsis (...) after the value
expression to enable grouping by key.
据我所知,我没有两个重复的值来帮助形成键,因此我不必使用省略号,但我还是尝试使用省略号来查看它是否正确应用。在值表达式后添加省略号后,我出现以下错误:

Error: Unsupported attribute

  on mx.tf line 20, in resource "aws_route53_record" "mx_records":
  20:     each.value.record
    |----------------
    | each.value is tuple with 2 elements

This value does not have any attributes.
如能就此问题提供任何建议,将不胜感激

更新

Error: [ERR]: Error building changeset: InvalidChangeBatch: [Tried to create resource record set [name='mywebsiteorg.', type='MX'] but it already exists]
    status code: 400, request id: dadd6490-efac-47ac-be5d-ab8dad0f4a6c

它正在尝试创建记录,但由于列表中的第一条记录,它已经创建了。

我认为您可以用key作为
mx\u records
列表的索引来构建对象的映射(注意
idx
作为索引):

上面的for_每个表达式将您的
local.mx_记录从列表(对象)更改为映射(对象),其中映射键为
idx
,值为原始对象

更新:

我在53号线路上进行了验证,你不能复制代码。因此,可以尝试使用原始
mx
变量:

resource "aws_route53_record" "mx_records" {

  for_each = { for idx, mx in var.mx : idx => mx }

  zone_id  = aws_route53_zone.zone.zone_id

  name     = each.key
  type     = "MX"
  ttl      = each.value.ttl

  records = each.value.records
}

你好这是旁注。我注意到你有很多问题和答案,但你没有接受任何一个。如果所有这些都没有帮助(那么评论是有理由的),那也没关系,但是如果它们是正确的,那么应该被接受。这不仅向其他人表明问题已经得到了回答,而且人们可能会停止回答你的问题。不被接受的答案也会出现,这会增加混乱。如果答案确实正确,解决问题,但不被接受。嘿,谢谢你的建议。我会重温老问题。嗨,马辛。谢谢你的建议。这很有帮助,但我还有最后一件事。对于我尝试循环的记录,我收到一个错误:错误:[ERR]:错误生成变更集:InvalidChangeBatch:[试图创建资源记录集[name='mywebsite.org',type='MX'],但它已经存在]状态代码:400,请求id:dadd6490-efac-47ac-be5d-ab8dad0f4a6c@DaveMichaels没问题。您是否已经在Route53中创建了此类记录?也许是人工创建的,在地形之外?遗憾的是,我无法验证这一行为,因为我目前没有route53记录可供测试。我认为正在发生的是Terraform用第一个值创建第一个记录,然后当应用第二个值时,它意识到该记录已经创建,然后生成错误。@DaveMichaels yes
mywebsite.org.
将出现两次,您不能重复更新答案中的代码。那么最好还是坚持原来的mx记录,而不是在
locals
@DaveMichaels中将其更改为三条记录。我添加了其他示例,但我认为您需要一些地方。因此,您将有两个区域,一个用于
mywebsite.org.
,另一个用于
myotherwebsite.org.
,然后您可以在它们的区域中创建记录。基本上,你需要根据我能说的重新思考你的设计。