Я столкнулся с действительно запутанной проблемой ресурсов Terraform, автоматизирующей создание и проверку DNS сертификатов SSL в ACM для списка (управляемых Terraform) размещенных зон. Код также можно найти здесь.
Я начинаю с начальной загрузки размещенных зон, ссылающихся на эту зависящую от среды переменную.
hosted_zones = [
{
domain = "site1.com"
zone_id = "MANUALLY FILL"
}
]
Блок, который я использую для построения зон, кажется, работает надежно.
resource "aws_route53_zone" "zones" {
count = "${length(var.hosted_zones)}"
name = "${lookup(var.hosted_zones[count.index], "domain")}"
}
После того, как зоны построены, я вручную копирую идентификатор зоны в переменную, потому что я не придумал умного способа автоматизировать его, учитывая комбинацию ограничений HCL и моего отсутствия опыта работы с ним.
Я могу надежно генерировать голые сертификаты и сертификаты splat для каждой размещенной зоны, используя ...
resource "aws_acm_certificate" "cert" {
count = "${length(var.hosted_zones)}"
domain_name = "${lookup(var.hosted_zones[count.index], "domain")}"
subject_alternative_names = ["*.${lookup(var.hosted_zones[count.index], "domain")}"]
validation_method = "DNS"
tags {
Project = "${var.project}"
Environment = "${var.environment}"
}
}
Все становится непросто, когда я пытаюсь автоматизировать проверку DNS для сертификатов. В документации есть хороший пример для отдельной зоны хостинга. , но мне не удалось успешно перенести его на несколько размещенных зон. Моя попытка ...
resource "aws_route53_record" "cert_validation" {
count = "${length(var.hosted_zones)}"
name = "${aws_acm_certificate.cert.*.domain_validation_options.0.resource_record_name[count.index]}"
type = "${aws_acm_certificate.cert.*.domain_validation_options.0.resource_record_type[count.index]}"
zone_id = "${var.zone_override != "" ? var.zone_override : lookup(var.hosted_zones[count.index], "zone_id")}"
records = ["${aws_acm_certificate.cert.*.domain_validation_options.0.resource_record_value[count.index]}"]
ttl = 60
}
resource "aws_acm_certificate_validation" "cert" {
count = "${length(var.hosted_zones)}"
certificate_arn = "${aws_acm_certificate.cert.*.arn[count.index]}"
validation_record_fqdns = ["${aws_route53_record.cert_validation.*.fqdn[count.index]}"]
}
Ошибка, которую я вижу при первом запуске:
* module.acm.aws_route53_record.cert_validation: 1 error(s) occurred:
* module.acm.aws_route53_record.cert_validation: Resource 'aws_acm_certificate.cert' does not have attribute 'domain_validation_options.0.resource_record_value' for variable 'aws_acm_certificate.cert.*.domain_validation_options.0.resource_record_value'
Неприятная часть состоит в том, что если я прокомментирую ресурсы validation
, apply
преуспеет, а затем раскомментирую их и перезапущу также.
Я пробовал (как кажется) каждую перестановку element()
lookup()
, list()
и map()
для целевых сертификатов по индексу в выводе из первого блока ресурсов, но я сталкиваюсь с задокументированными ограничениями «плоского списка», и это самый близкий мне вариант. добился успеха. Я хотел бы понять, почему необходимо обходное решение, чтобы я мог его устранить. Это похоже на синтаксическую проблему или я пытаюсь заставить HCL вести себя больше как объектно-ориентированный язык, чем он есть.
Спасибо за любой опыт, который может помочь!
-target
, чтобы не комментировать вещи на первом проходе, но все еще кажется, что синтаксис API странный (как вы предположили) и лишь частично задокументирован. Я опубликую здесь, где я приземлился, на случай, если кто-то еще наткнется на этот пост. - person Aaron Stone   schedule 03.05.2018