Сертификаты Terraform AWS ACM в США-Восток-1 для ресурсов в ЕС-Запад-1
У меня есть модуль Terraform, который обеспечивает ресурсы в основном в ЕС-запад-1. Мне нужен сертификат ACM для подключения к дистрибутиву Cloudfront. Сертификат должен быть предоставлен в us-east-1.
Таким образом, я настроил двух провайдеров:
provider "aws" {
version = "~> 1.0"
region = "eu-west-1"
}
provider "aws" {
version = "~> 1.0"
region = "us-east-1"
alias = "us-east-1"
}
В моем модуле я предоставляю сертификат следующим образом:
resource "aws_acm_certificate" "cert" {
provider = "aws.us-east-1"
domain_name = "${var.domain_name}"
validation_method = "DNS"
tags = "${var.tags}"
lifecycle {
create_before_destroy = true
}
}
Проблема № 1: Я попытался импортировать свой существующий сертификат ACM, используя:
terraform import module.mymod.aws_acm_certificate.cert arn:aws:acm:us-east-1:xyz:certificate/uuid
Это не с: "Не удалось найти сертификат с идентификатором". Terraform смотрит не в тот регион? Я подтвердил с помощью CLI aws, что сертификат действительно существует (например, нет опечаток в ARN).
Итак, я решил, что могу просто создать новый сертификат. Это работает, и теперь у меня есть два сертификата, но потом я сталкиваюсь с проблемой № 2:
resource "aws_route53_record" "cert_validation" {
name = "${aws_acm_certificate.cert.domain_validation_options.0.resource_record_name}"
type = "${aws_acm_certificate.cert.domain_validation_options.0.resource_record_type}"
zone_id = "${data.aws_route53_zone.zone.id}"
records = ["${aws_acm_certificate.cert.domain_validation_options.0.resource_record_value}"]
ttl = 60
}
Это пытается настроить проверку DNS для ACM. Размещенная зона существует в eu-west-1, поэтому я ожидаю проблем здесь. Тем не менее, это все еще не работает с "Не удалось найти сертификат...", и я предполагаю, что terraform запутался в регионах. Я пытался добавить provider = "aws.us-east-1"
на этот ресурс, но он все равно терпит неудачу так же.
Поэтому, независимо от того, что я делаю, Terraform не может найти мой сертификат, даже он сам его создал. Я делаю что-то неправильно?
2 ответа
Оказывается, моя проблема была с aws_acm_certificate_validation
, Указав поставщика в том же регионе, что и сертификат, все было решено.
resource "aws_acm_certificate_validation" "cert" {
provider = "aws.us-east-1" # <== Add this
certificate_arn = "${aws_acm_certificate.cert.arn}"
validation_record_fqdns = ["${aws_route53_record.cert_validation.fqdn}"]
}
Начиная с Terraform 0.12.14 цитируемые ссылки устарели. Итак, принятый ответ выше должен быть таким, если вы используете версию>= 0.12.14 или Terraform 1.x
resource "aws_acm_certificate_validation" "cert" {
provider = aws.us-east-1 # <== Add this without quotes
certificate_arn = "${aws_acm_certificate.cert.arn}"
validation_record_fqdns = ["${aws_route53_record.cert_validation.fqdn}"]
}
Чтобы избежать такого предупреждения:
Предупреждение: цитируемые ссылки устарели
52: provider = "aws.us-east-1"
В этом контексте ссылки предполагаются буквально, а не в кавычках. Terraform 0.11 и более ранние требовали кавычек, но цитируемые ссылки теперь устарели и будут удалены в будущей версии Terraform. Удалите кавычки вокруг этой ссылки, чтобы отключить это предупреждение.
(и еще одно подобное предупреждение в другом месте)
Для получения дополнительной информации см. Обсуждение примечаний к выпуску на сайте hashicorp: https://discuss.hashicorp.com/t/terraform-0-12-14-released/3898