Как можно изменить карту на лету?

Мне нужно повторить итерацию больше раз для определенных пар ключ / значение карты HCL, которые должны быть основаны на значении определенных переменных.

Я пришел к мысли изменить текущую карту, чтобы определенные ключи / значения повторялись больше раз.

Если у нас есть такая карта - назовем ее «map_domains»:

key_1 = value_1
key_2 = value_2

И мы установили эти переменные:

variable "domains" {
  type = "list"

  default = [
    "key_1",
    "key_2",
  ]
}

variable "domain_alt_names" {
  type = "map"

  default = {
    key_1    = "value_1, value_2"
    key_2    = "value_3, value_4, value_5"
  }
}

Как мы можем изменить карту map_domains на:

key_1 = value_1
key_1 = value_1
key_1 = value_1
key_2 = value_2
key_2 = value_2
key_2 = value_2
key_2 = value_2

Я пытаюсь проверить пару сертификатов AWS ACM с помощью параметра проверки DNS - и каждый из доменов имеет пару альтернативных имен доменов, которые также нуждаются в создании записей DNS в Route53 для правильной проверки сертификатов домена.

Это код, который используется для достижения общей цели - и проблема заключается в идентификаторе зоны, который должен быть одинаковым для первой пары итераций, а затем еще одним для остальных итераций.

Эта строка:

  zone_id = "${lookup(local.hosted_zone_ids_zipmap, element(keys(local.hosted_zone_ids_zipmap), count.index))}"

Весь код:

#
# EKS Worker Nodes Resources
#  * Issuing ACM certificates
#

resource "aws_route53_zone" "zones" {
  count = "${length(var.domains)}"

  name = "${element(var.domains, count.index)}"
}

locals {
  hosted_zone_ids_zipmap = "${zipmap(var.domains, aws_route53_zone.zones.*.zone_id)}"
}

resource "aws_acm_certificate" "cert" {
  count = "${length(var.domains)}"

  domain_name = "${element(keys(local.hosted_zone_ids_zipmap), count.index)}"

  subject_alternative_names = ["${
  lookup(var.domain_alt_names,
  "${element(var.domains, count.index)}")
  }"]

  validation_method = "DNS"

  tags {
    Domain = "${element(keys(local.hosted_zone_ids_zipmap), count.index)}"
  }
}

locals {
  dvo           = "${flatten(aws_acm_certificate.cert.*.domain_validation_options)}"
}

resource "aws_route53_record" "cert_validation" {
  count = "${length(var.domain_alt_names) + length(var.domains)}"

  zone_id = "${lookup(local.hosted_zone_ids_zipmap, element(keys(local.hosted_zone_ids_zipmap), count.index))}"
  name    = "${lookup(local.dvo[count.index], "resource_record_name")}"
  type    = "${lookup(local.dvo[count.index], "resource_record_type")}"
  records = ["${lookup(local.dvo[count.index], "resource_record_value")}"]
  ttl     = 60

  depends_on = ["aws_acm_certificate.cert"]
}

resource "aws_acm_certificate_validation" "cert" {
  count = "${length(var.domains)}"

  certificate_arn         = "${aws_acm_certificate.cert.*.arn[count.index]}"
  validation_record_fqdns = ["${aws_route53_record.cert_validation.*.fqdn[count.index]}"]

  depends_on = ["aws_acm_certificate.cert", "aws_route53_record.cert_validation"]
}

person Xtigyro    schedule 19.07.2018    source источник
comment
Карта по определению отображает один ключ в одно значение. Кажется нелогичным пытаться сделать это сопоставление несколько раз. Может быть, сопоставить ключ со значением и целым числом, которое представляет кратность? Кроме того, похоже, вы пытаетесь достичь общей цели, которая не указана в вопросе. Может быть, вы можете описать желаемое поведение и обсудить различные способы его достижения?   -  person Markus    schedule 19.07.2018
comment
@Markus Я обновил описание и добавил больше кода. Спасибо за помощь, Маркус!   -  person Xtigyro    schedule 19.07.2018
comment
Это гораздо более значимый вопрос. У меня нет полного решения, но поскольку вы используете счетчики для доступа к своей карте, вы можете использовать counter // length (// должно быть целочисленным делением), чтобы обеспечить увеличение на каждом втором шаге.   -  person Markus    schedule 19.07.2018
comment
@Markus Не могли бы вы привести мне пример своей идеи?   -  person Xtigyro    schedule 19.07.2018


Ответы (1)


Я разобрался:

(1) Добавлена ​​эта переменная:

variable "domain_names_index" {
  // A flat map that will act as nested map
  //// for the subdomains and the alternative domain names
  //// so that the Hosted Zone ID can be calculated in a reverse order
  //// during the creation of the DNS Validation Route53 records

  type = "map"

  default = {
    tftestingdatorama.io  = "2"
    tftestingdatorama.org = "2"
    tftestingdlite.co     = "1"
    tftestingdlite.org    = "1"
  }
}

(2) Затем я изменил код на:

resource "aws_route53_record" "cert_validation" {
  count = "${length(var.domain_alt_names) + length(var.domains)}"

  zone_id = "${
     lookup(local.hosted_zone_ids_zipmap,
     element(keys(local.hosted_zone_ids_zipmap),
     lookup(var.domain_names_index, "${lookup(local.dvo[count.index], "domain_name")
     }")))}"

  name    = "${lookup(local.dvo[count.index], "resource_record_name")}"
  type    = "${lookup(local.dvo[count.index], "resource_record_type")}"
  records = ["${lookup(local.dvo[count.index], "resource_record_value")}"]
  ttl     = 60

  depends_on = ["aws_acm_certificate.cert"]
}
person Xtigyro    schedule 19.07.2018