Ошибка создания набора изменений Terraform: InvalidChangeBatch при циклическом просмотре нескольких записей Route53 - PullRequest
1 голос
/ 04 августа 2020

У меня есть записи Route 53, которые я создаю с помощью команды for_each. Одна из моих записей имеет более одного значения, связанного с ее записью. Вот как объявляются записи:

variables.tf

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

variables.tfvars

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

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 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
  ]
}

При выполнении все работает хорошо, пока Terraform не поймет, что у меня есть дополнительное значение для моей записи. Затем он генерирует следующую ошибку:

Error building changeset: InvalidChangeBatch: [Tried to create resource record set 

[name='mywebsite.org.', type='MX'] but it already exists]

Мой вопрос: есть ли способ заставить Terraform не создавать вторую запись для этого значения? Для Route53 все имена записей должны быть уникальными. Есть ли способ для Terraform просто добавить это значение к этой записи, поскольку она была создана при первоначальном запуске выполнения? Любая помощь будет принята с благодарностью, поскольку это становится сложной задачей.

ОБНОВЛЕНИЕ После удаления сглаживания и обновления до 'records = [each.value.records]' это ошибка:

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: Unsupported attribute

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

This value does not have any attributes.

1 Ответ

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

Я думаю, вы могли бы просто использовать mx напрямую , вместо того, чтобы преобразовывать его в mx_records.

Вы можете попробовать следующее:

resource "aws_route53_record" "mx_records" {

  for_each = var.mx
  
  zone_id  = aws_route53_zone.zone.zone_id
  name     = each.key
  type     = "MX"
  ttl      = each.value.ttl

  records = each.value.records

}

Приведенный выше for_each должен выполняться только дважды . Первый для mywebsite.org. и второй для myotherwebsite.org..

...