Поддержка нескольких доменных имен с помощью Terraform
Чтобы создать инфраструктуру для поддержки нескольких доменных имен сайта с помощью Terraform:
Делегируйте доменное имя
Вы можете воспользоваться сервисом Yandex Cloud DNS для управления доменом.
Чтобы делегировать домен сервису Cloud DNS, в личном кабинете вашего регистратора домена укажите в настройках домена адреса DNS-серверов:
ns1.yandexcloud.kzns2.yandexcloud.kz
Делегирование происходит не сразу. Серверы интернет-провайдеров обычно обновляют записи в течение 24 часов (86400 секунд). Это обусловлено значением TTL, в течение которого кешируются записи для доменов.
Проверить делегирование домена можно с помощью сервиса Whoisdig:
dig +short NS example.com
Результат:
ns2.yandexcloud.kz.
ns1.yandexcloud.kz.
Создайте инфраструктуру
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Для создания инфраструктуры с помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файлы с описанием инфраструктуры:
Готовая конфигурацияВручную-
Клонируйте репозиторий с конфигурационными файлами.
git clone https://github.com/yandex-cloud-examples/yc-s3-static-website-multiple-domain.git -
Перейдите в директорию с репозиторием. В ней должны появиться файлы:
index.html— файл главной страницы сайта.website-multiple-domain.tf— конфигурация создаваемой инфраструктуры.website-multiple-domain.auto.tfvars— файл с пользовательскими данными.
-
Создайте папку для конфигурационных файлов.
-
Создайте в папке:
-
Конфигурационный файл
website-multiple-domain.tf:website-multiple-domain.tf
# Объявление переменных для конфиденциальных параметров variable "main_domain" { type = string } variable "extra_domain" { type = string } variable "folder_id" { type = string } locals { test = [ yandex_dns_zone.zone1.id, yandex_dns_zone.zone2.id] } # Настройка провайдера terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } } required_version = ">=0.136.0" } # Создание бакетов resource "yandex_storage_bucket" "main-bucket" { bucket = var.main_domain folder_id = var.folder_id anonymous_access_flags { read = true list = true config_read = false } website { index_document = "index.html" error_document = "error.html" } https { certificate_id = data.yandex_cm_certificate.example_by_id.id } depends_on = [data.yandex_cm_certificate.example_by_id] } resource "yandex_storage_bucket" "extra-bucket" { bucket = var.extra_domain folder_id = var.folder_id anonymous_access_flags { read = true list = true config_read = false } website { redirect_all_requests_to = "https://${var.main_domain}" } https { certificate_id = data.yandex_cm_certificate.example_by_id.id } depends_on = [data.yandex_cm_certificate.example_by_id] } # Загрузка главной страницы в бакет resource "yandex_storage_object" "index-page" { bucket = yandex_storage_bucket.main-bucket.id key = "index.html" source = "index.html" } # Создание DNS зон и ресурсных записей resource "yandex_dns_zone" "zone1" { name = "main-domain-zone" zone = "${var.main_domain}." public = true } resource "yandex_dns_recordset" "rs1" { zone_id = yandex_dns_zone.zone1.id name = "@" type = "CNAME" ttl = 600 data = ["${var.main_domain}.website.yandexcloud.kz"] } resource "yandex_dns_zone" "zone2" { name = "extra-domain-zone" zone = "${var.extra_domain}." public = true } resource "yandex_dns_recordset" "rs2" { zone_id = yandex_dns_zone.zone2.id name = "@" type = "CNAME" ttl = 600 data = ["${var.extra_domain}.website.yandexcloud.kz"] } # Создание TLS-сертификата Let's Encrypt resource "yandex_cm_certificate" "example" { name = "multidomains-cert" domains = ["${var.main_domain}", "${var.extra_domain}"] managed { challenge_type = "DNS_CNAME" challenge_count = 2 # for each domain } } resource "yandex_dns_recordset" "example" { count = yandex_cm_certificate.example.managed[0].challenge_count zone_id = element(local.test, count.index - 1) name = yandex_cm_certificate.example.challenges[count.index].dns_name type = yandex_cm_certificate.example.challenges[count.index].dns_type data = [yandex_cm_certificate.example.challenges[count.index].dns_value] ttl = 600 } data "yandex_cm_certificate" "example_by_id" { depends_on = [yandex_dns_recordset.example] certificate_id = yandex_cm_certificate.example.id } -
Файл с пользовательскими данными
website-multiple-domain.auto.tfvars:website-multiple-domain.auto.tfvars
folder_id = "<идентификатор_каталога>" main_domain = "<основной_домен>" extra_domain = "<дополнительный_домен>" -
Файл главной страницы сайта
index.html:index.html
<!DOCTYPE html> <html> <head> <title>My site</title> </head> <body> <h1>This is my site!</h1> </body> </html>
-
Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:
-
-
В файле
website-multiple-domain.auto.tfvarsзадайте пользовательские параметры:folder_id— идентификатор каталога.main_domain— основной домен, напримерexample.com.extra_domain— дополнительный домен, напримерexample2.com.
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validateЕсли конфигурация является корректной, появится сообщение:
Success! The configuration is valid. -
Выполните команду:
terraform planВ терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply -
Подтвердите изменения: введите в терминале слово
yesи нажмите Enter.
-
Проверьте работу нескольких доменов
Дождитесь выпуска TLS-сертификата и его перехода в статус Issued. После этого убедитесь, что переадресация работает: откройте сайт https://example2.com, и вы будете переадресованы на https://example.com.