Интеграция L7-балансировщика с Cloud CDN и Object Storage с помощью Terraform
Примечание
Для реализации решения вам понадобится домен. В качестве примера будет использовано доменное имя example.com.
Чтобы создать инфраструктуру для интеграции L7-балансировщика с Yandex Cloud CDN и Yandex Object Storage с помощью Terraform:
- Подготовьте облако к работе.
- Разверните инфраструктуру для интеграции L7-балансировщика с Cloud CDN и Object Storage.
- Протестируйте работу решения.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- плата за хранение данных в Object Storage, операции с ними и исходящий трафик (см. тарифы Object Storage);
- плата за использование вычислительных ресурсов L7-балансировщика (см. тарифы Application Load Balancer);
- плата за исходящий трафик с CDN-серверов (см. тарифы Cloud CDN);
- плата за публичные DNS-запросы и DNS-зоны, если вы используете Yandex Cloud DNS (см. тарифы Cloud DNS).
Разверните инфраструктуру для интеграции L7-балансировщика с Cloud CDN и Object Storage
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Для создания инфраструктуры с помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файлы с описанием инфраструктуры:
Готовая конфигурацияВручную-
Клонируйте репозиторий с конфигурационными файлами.
git clone https://github.com/yandex-cloud-examples/cdn-storage-integration-config -
Перейдите в папку с репозиторием. В ней должны появиться следующие файлы:
cdn-storage-integration-config.tf— файл конфигурации создаваемой инфраструктуры.cdn-storage-integration.auto.tfvars— файл со значениями пользовательских переменных.index.html— тестовый файл сервиса, используемый при проверке работоспособности решения.
-
Создайте папку для конфигурационных файлов и в этой папке:
-
Создайте файл
index.htmlсо следующим содержимым:<!DOCTYPE html> <html> <head> <title>My service</title> </head> <body> <p>The service is working</p> </body> </html> -
Создайте конфигурационный файл
cdn-storage-integration-config.tf:cdn-storage-integration-config.tf
# Объявление переменных variable "folder_id" { type = string } variable "domain_name" { type = string } variable "bucket_name" { type = string } variable "index_file_path" { type = string } locals { network_name = "example-network" subneta_name = "example-subnet-ru-central1-a" subnetb_name = "example-subnet-ru-central1-b" subnetd_name = "example-subnet-ru-central1-d" sg_name = "example-sg" object_key = "index.html" domain_zone_name = "my-domain-zone" cert_name = "mymanagedcert" origin_gp_name = "example-origin-group" bg_name = "example-bg" backend_name = "example-backend" router_name = "example-router" vh_name = "example-vh" route_name = "example-route" alb_name = "example-balancer" listener_name = "example-listener" } # Настройка провайдера terraform { required_providers { yandex = { source = "yandex-cloud/yandex" } } required_version = ">= 0.13" } provider "yandex" { folder_id = var.folder_id } # Создание публичной DNS-зоны resource "yandex_dns_zone" "my-domain-zone" { name = local.domain_zone_name zone = "${var.domain_name}." public = true } # Добавление сертификата Let's Encrypt resource "yandex_cm_certificate" "le-certificate" { name = local.cert_name domains = [var.domain_name] managed { challenge_type = "DNS_CNAME" challenge_count = 1 } } # Создание CNAME-записи для валидации доменов при выпуске сертификата resource "yandex_dns_recordset" "validation-record" { count = yandex_cm_certificate.le-certificate.managed[0].challenge_count zone_id = yandex_dns_zone.my-domain-zone.id name = yandex_cm_certificate.le-certificate.challenges[count.index].dns_name type = yandex_cm_certificate.le-certificate.challenges[count.index].dns_type ttl = 600 data = [yandex_cm_certificate.le-certificate.challenges[count.index].dns_value] } # Ожидание валидации доменов и выпуска сертификата Let's Encrypt data "yandex_cm_certificate" "example-com" { depends_on = [yandex_dns_recordset.validation-record] certificate_id = yandex_cm_certificate.le-certificate.id wait_validation = true } # Создание сети resource "yandex_vpc_network" "my-network" { name = local.network_name } # Создание подсетей resource "yandex_vpc_subnet" "my-subnet-a" { name = local.subneta_name zone = "ru-central1-a" network_id = yandex_vpc_network.my-network.id v4_cidr_blocks = ["192.168.1.0/24"] } resource "yandex_vpc_subnet" "my-subnet-b" { name = local.subnetb_name zone = "ru-central1-b" network_id = yandex_vpc_network.my-network.id v4_cidr_blocks = ["192.168.2.0/24"] } resource "yandex_vpc_subnet" "my-subnet-d" { name = local.subnetd_name zone = "ru-central1-d" network_id = yandex_vpc_network.my-network.id v4_cidr_blocks = ["192.168.3.0/24"] } # Создание группы безопасности resource "yandex_vpc_security_group" "my-sg" { name = local.sg_name network_id = yandex_vpc_network.my-network.id ingress { protocol = "TCP" description = "http" v4_cidr_blocks = ["0.0.0.0/0"] port = 80 } ingress { protocol = "TCP" description = "https" v4_cidr_blocks = ["0.0.0.0/0"] port = 443 } ingress { protocol = "TCP" description = "healthchecks" predefined_target = "loadbalancer_healthchecks" port = 30080 } egress { protocol = "ANY" description = "any" v4_cidr_blocks = ["0.0.0.0/0"] from_port = 0 to_port = 65535 } } # Создание бакета resource "yandex_storage_bucket" "cdn-source-bucket" { bucket = var.bucket_name folder_id = var.folder_id anonymous_access_flags { read = true list = true } } # Загрузка в бакет главной страницы тестового сервиса resource "yandex_storage_object" "index-object" { bucket = yandex_storage_bucket.cdn-source-bucket.bucket key = local.object_key source = var.index_file_path content_type = "text/html" } # Создание группы бэкендов resource "yandex_alb_backend_group" "test-backend-group" { name = local.bg_name http_backend { name = local.backend_name weight = 100 port = 80 storage_bucket = var.bucket_name } } # Создание HTTP-роутера resource "yandex_alb_http_router" "my-router" { name = local.router_name } # Создание виртуального хоста resource "yandex_alb_virtual_host" "my-virtual-host" { name = local.vh_name http_router_id = yandex_alb_http_router.my-router.id route { name = local.route_name http_route { http_match { http_method = ["GET"] path { prefix = "/" } } http_route_action { backend_group_id = yandex_alb_backend_group.test-backend-group.id } } } authority = [var.domain_name] } # Создание L7-балансировщика resource "yandex_alb_load_balancer" "my-balancer" { name = local.alb_name network_id = yandex_vpc_network.my-network.id security_group_ids = [yandex_vpc_security_group.my-sg.id] allocation_policy { location { zone_id = "ru-central1-a" subnet_id = yandex_vpc_subnet.my-subnet-a.id } location { zone_id = "ru-central1-b" subnet_id = yandex_vpc_subnet.my-subnet-b.id } location { zone_id = "ru-central1-d" subnet_id = yandex_vpc_subnet.my-subnet-d.id } } listener { name = local.listener_name endpoint { address { external_ipv4_address { } } ports = [80] } http { handler { http_router_id = yandex_alb_http_router.my-router.id } } } } # Создание группы источников CDN resource "yandex_cdn_origin_group" "my-origin-group" { name = local.origin_gp_name origin { source = yandex_alb_load_balancer.my-balancer.listener[0].endpoint[0].address[0].external_ipv4_address[0].address } } # Создание CDN-ресурса resource "yandex_cdn_resource" "my-resource" { cname = var.domain_name active = true origin_protocol = "http" origin_group_id = yandex_cdn_origin_group.my-origin-group.id ssl_certificate { type = "certificate_manager" certificate_manager_id = data.yandex_cm_certificate.example-com.id } options { redirect_http_to_https = true forward_host_header = true } } # Создание CNAME-записи для CDN-ресурса resource "yandex_dns_recordset" "cdn-cname" { zone_id = yandex_dns_zone.my-domain-zone.id name = "${var.domain_name}." type = "CNAME" ttl = 600 data = [yandex_cdn_resource.my-resource.provider_cname] } -
Создайте файл с пользовательскими данными
cdn-storage-integration.auto.tfvars:cdn-storage-integration.auto.tfvars
folder_id = "<идентификатор_каталога>" bucket_name = "<имя_бакета>" domain_name = "<имя_домена>" index_file_path = "<локальный_путь_к_файлу_index.html>"
-
Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:
- Сеть — yandex_vpc_network.
- Подсеть — yandex_vpc_subnet.
- Группа безопасности — yandex_vpc_security_group.
- DNS-зона — yandex_dns_zone.
- Ресурсная запись DNS — yandex_dns_recordset.
- TLS-Сертификат — yandex_cm_certificate.
- Бакет — yandex_storage_bucket.
- Объект — yandex_storage_object.
- Группа источников — yandex_cdn_origin_group.
- CDN-ресурс — yandex_cdn_resource.
- Группа бэкендов — yandex_alb_backend_group.
- HTTP-роутер — yandex_alb_http_router.
- Виртуальный хост — yandex_alb_virtual_host.
- L7-балансировщик нагрузки — yandex_alb_load_balancer.
-
-
В файле
cdn-storage-integration.auto.tfvarsзадайте значения пользовательских переменных:-
folder_id— идентификатор каталога. -
bucket_name— имя бакета в соответствии с правилами именования. -
domain_name— имя домена, на котором будет размещен тестовый сервис.Чтобы получить доступ к именам из публичной зоны, вам нужно делегировать домен. Укажите адреса серверов
ns1.yandexcloud.netиns2.yandexcloud.netв личном кабинете вашего регистратора доменных имен. -
index_file_path— локальный путь к файлуindex.htmlс содержимым тестового сервиса. Например:/Users/MyUser/Repos/cdn-storage-integration/index.html.
-
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validateЕсли конфигурация является корректной, появится сообщение:
Success! The configuration is valid. -
Выполните команду:
terraform planВ терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply -
Подтвердите изменения: введите в терминале слово
yesи нажмите Enter.
-
В результате в выбранном каталоге будет создана и настроена вся необходимая инфраструктура.
Протестируйте работу решения
Чтобы проверить работу сервиса, откройте в браузере адрес https://example.com/index.html (где вместо example.com — имя вашего домена). Если все было настроено правильно, вы должны увидеть страницу с таким содержанием:
<!DOCTYPE html>
<html>
<head>
<title>My service</title>
</head>
<body>
<p>The service is working</p>
</body>
</html>
Как удалить созданные ресурсы
Важно
Прежде чем удалять инфраструктуру, удалите все объекты в созданном бакете.
Чтобы перестать платить за созданные ресурсы:
-
Откройте конфигурационный файл
cdn-storage-integration-config.tfи удалите описание создаваемой инфраструктуры из файла. -
Примените изменения:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validateЕсли конфигурация является корректной, появится сообщение:
Success! The configuration is valid. -
Выполните команду:
terraform planВ терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply -
Подтвердите изменения: введите в терминале слово
yesи нажмите Enter.
-