Итерация по карте объектов в терраформе с записями маршрута 53 - PullRequest
1 голос
/ 03 августа 2020

Я пытаюсь понять, как читать из дополнительных значений в Terraform, используя for / for_each, используя Terraform 0.12.26

dns.tfvars

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

variables.tf

variable "mx" {
  type = map(object({
    ttl     = string
    records = set(string)
  }))
}

mx.tf

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, и код работает отлично. Я не могу понять, как настроить мой для l oop и для каждого оператора, чтобы получить его на «l oop» через второе значение. Первая полученная мной ошибка указана ниже:

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

Он пытается создать запись, но она уже создана из-за первой записи в списке.

1 Ответ

0 голосов
/ 03 августа 2020

Я думаю, вы могли бы просто построить карту своих объектов с ключом, являющимся индексом списка mx_records (обратите внимание, что idx является индексом):

resource "aws_route53_record" "mx_records" {

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

  zone_id  = aws_route53_zone.zone.zone_id

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

  records = [
    each.value.record
  ]
}

Приведенные выше выражения for_each изменяют ваш local.mx_records из списка (объекты) в карту (объекты), где ключ карты - idx, а значение - исходный объект.

Обновление:

Я проверил в Route53 и вы не можете дублировать коды. Таким образом, можно попробовать использовать оригинальную 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
}
...