Интеграция L7-балансировщика с Cloud CDN и Object Storage
- Поддерживаемые инструменты
- Подготовьте облако к работе
- Добавьте сертификат в Certificate Manager
- Создайте облачную сеть и подсети
- Создайте бакет в Object Storage
- Загрузите файл сервиса в бакет
- Создайте группу безопасности
- Создайте группу бэкендов в Application Load Balancer
- Создайте HTTP-роутер и виртуальный хост
- Создайте L7-балансировщик
- Создайте CDN-ресурс
- Настройте DNS для сервиса
- Проверьте работу сервиса
- Как удалить созданные ресурсы
Важно
Часть ресурсов, необходимых для прохождения практического руководства, доступны только в регионе Россия.
В этом руководстве в качестве бэкенда L7-балансировщика Yandex Application Load Balancer используется бакет Yandex Object Storage. Запросы пользователей передаются балансировщику через сеть распространения контента Yandex Cloud CDN, чтобы сократить время доставки контента.
В качестве примера будет использовано доменное имя cdn.yandexcloud.example.
Для выполнения шагов можно использовать различные поддерживаемые инструменты.
Чтобы построить архитектуру для интеграции L7-балансировщика с CDN и Object Storage:
- Подготовьте облако к работе.
- Добавьте сертификат в Certificate Manager
- Создайте облачную сеть и подсети.
- Создайте бакет в Object Storage.
- Загрузите файл сервиса в бакет.
- Создайте группу безопасности.
- Создайте группу бэкендов в Application Load Balancer.
- Создайте HTTP-роутер и виртуальный хост.
- Создайте L7-балансировщик.
- Создайте CDN-ресурс.
- Настройте DNS для сервиса.
- Проверьте работу сервиса.
Если созданные ресурсы вам больше не нужны, удалите их.
Поддерживаемые инструменты
Бо́льшую часть шагов можно выполнить с помощью любого из стандартных инструментов: консоли управления
Некоторые инструменты поддерживаются не для всех шагов:
- Через CLI и Terraform сейчас нельзя:
- создать группу бэкендов в Application Load Balancer с бакетами в качестве бэкендов;
- получить доменное имя CDN-балансировщика при настройке DNS для сервиса;
- Через API сейчас нельзя получить доменное имя CDN-балансировщика при настройке DNS для сервиса.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
В качестве примера будет использоваться каталог с именем example-folder.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- плата за хранение данных в Object Storage, операции с ними и исходящий трафик (см. тарифы Object Storage);
- плата за использование вычислительных ресурсов L7-балансировщика (см. тарифы Application Load Balancer);
- плата за исходящий трафик с CDN-серверов (см. тарифы Cloud CDN);
- плата за публичные DNS-запросы и DNS-зоны, если вы используете Yandex Cloud DNS (см. тарифы Cloud DNS).
Добавьте сертификат в Certificate Manager
Поддерживаются сертификаты из Yandex Certificate Manager. Вы можете выпустить новый сертификат Let's Encrypt® или загрузить собственный.
Сертификат должен находиться в том же каталоге, в котором расположен ваш CDN-ресурс.
Для сертификата Let's Encrypt® пройдите проверку прав на домен, который указан в сертификате.
Создайте облачную сеть и подсети
Все ресурсы будут относиться к одной облачной сети.
- В консоли управления
выберите каталогexample-folder. - В списке сервисов выберите Virtual Private Cloud.
- Справа сверху нажмите кнопку Создать сеть.
- В поле Имя укажите
example-network. - В поле Дополнительно выберите опцию
Создать подсети. - Нажмите кнопку Создать сеть.
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.
-
Создайте сеть
example-network:yc vpc network create example-networkРезультат:
id: enptrcle5q3d******** folder_id: b1g9hv2loamq******** created_at: "2022-04-04T05:25:03Z" name: example-network default_security_group_id: enpbsnnop4ak********Подробнее о команде
yc vpc network createсм. в справочнике CLI. -
Создайте подсети во всех зонах доступности:
-
В
kz1-a:yc vpc subnet create example-subnet-kz1-a \ --zone kz1-a \ --network-name example-network \ --range 10.1.0.0/16Результат:
id: e9bnnssj8sc8******** folder_id: b1g9hv2loamq******** created_at: "2022-04-04T09:27:00Z" name: example-subnet-kz1-a network_id: enptrcle5q3d******** zone_id: kz1-a v4_cidr_blocks: - 10.1.0.0/16 -
В
kz1-b:yc vpc subnet create example-subnet-kz1-b \ --zone kz1-b \ --network-name example-network \ --range 10.2.0.0/16Результат:
id: e2lghukd9iqo******** folder_id: b1g9hv2loamq******** created_at: "2022-04-04T09:27:39Z" name: example-subnet-kz1-b network_id: enptrcle5q3d******** zone_id: kz1-b v4_cidr_blocks: - 10.2.0.0/16 -
В
kz1-d:yc vpc subnet create example-subnet-kz1-d \ --zone kz1-d \ --network-name example-network \ --range 10.3.0.0/16Результат:
id: b0c3pte4o2kn******** folder_id: b1g9hv2loamq******** created_at: "2022-04-04T09:28:08Z" name: example-subnet-kz1-d network_id: enptrcle5q3d******** zone_id: kz1-d v4_cidr_blocks: - 10.3.0.0/16
Подробнее о команде
yc vpc subnet createсм. в справочнике CLI. -
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
Опишите в конфигурационном файле параметры сети
example-networkи ее подсетейexample-subnet-kz1-a,example-subnet-kz1-bиexample-subnet-kz1-d:resource "yandex_vpc_network" "example-network" { name = "example-network" } resource "yandex_vpc_subnet" "example-subnet-a" { name = "example-subnet-kz1-a" zone = "kz1-a" network_id = "${yandex_vpc_network.example-network.id}" v4_cidr_blocks = ["10.1.0.0/16"] } resource "yandex_vpc_subnet" "example-subnet-b" { name = "example-subnet-kz1-b" zone = "kz1-b" network_id = "${yandex_vpc_network.example-network.id}" v4_cidr_blocks = ["10.2.0.0/16"] } resource "yandex_vpc_subnet" "example-subnet-d" { name = "example-subnet-kz1-d" zone = "kz1-d" network_id = "${yandex_vpc_network.example-network.id}" v4_cidr_blocks = ["10.3.0.0/16"] }Подробнее см. в описаниях ресурсов yandex_vpc_network и yandex_vpc_subnet в документации провайдера Terraform.
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply -
Подтвердите создание ресурсов.
-
- Создайте сеть
example-networkс помощью вызова gRPC API NetworkService/Create или метода REST API create. - Создайте подсети
example-subnet-kz1-a,example-subnet-kz1-bиexample-subnet-kz1-dв трех зонах доступности с помощью вызова gRPC API SubnetService/Create или метода REST API create.
Создайте бакет в Object Storage
- В консоли управления
выберите каталогexample-folder. - В списке сервисов выберите Object Storage.
- Справа сверху нажмите кнопку Создать бакет.
- В поле Имя укажите имя бакета.
- В полях Доступ на чтение объектов и Доступ к списку объектов выберите
Публичный. - Нажмите кнопку Создать бакет.
-
Создайте бакет:
aws --endpoint-url https://storage.yandexcloud.net \ s3 mb s3://<имя_бакета>Результат:
make_bucket: s3://<имя_бакета> -
Включите публичный доступ к чтению объектов и их списка:
aws --endpoint-url https://storage.yandexcloud.net \ s3api put-bucket-acl \ --bucket <имя_бакета> \ --acl public-read
Примечание
Terraform взаимодействует с Object Storage от имени сервисного аккаунта. Назначьте сервисному аккаунту нужную роль, например storage.admin, на каталог, в котором будут создаваться ресурсы.
-
Опишите в конфигурационном файле параметры для создания сервисного аккаунта и ключа доступа:
... // Создание сервисного аккаунта resource "yandex_iam_service_account" "sa" { name = "<имя_сервисного_аккаунта>" } // Назначение роли сервисному аккаунту resource "yandex_resourcemanager_folder_iam_member" "sa-admin" { folder_id = "<идентификатор_каталога>" role = "storage.admin" member = "serviceAccount:${yandex_iam_service_account.sa.id}" } // Создание статического ключа доступа resource "yandex_iam_service_account_static_access_key" "sa-static-key" { service_account_id = yandex_iam_service_account.sa.id description = "static access key for object storage" } -
Добавьте в конфигурационный файл параметры бакета:
... resource "yandex_storage_bucket" "<имя_бакета>" { access_key = yandex_iam_service_account_static_access_key.sa-static-key.access_key secret_key = yandex_iam_service_account_static_access_key.sa-static-key.secret_key bucket = "<имя_бакета>" acl = "public-read" }Подробнее о ресурсе
yandex_storage_bucketсм. в документации провайдера Terraform. -
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply -
Подтвердите создание ресурсов.
-
Используйте метод REST API create.
Загрузите файл сервиса в бакет
-
Создайте файл
index.html.Пример файла index.html
<!DOCTYPE html> <html> <head> <title>My service</title> </head> <body> <p>The service is working</p> </body> </html> -
Загрузите файл в бакет:
Консоль управленияAWS CLITerraformAPI- В консоли управления
выберите каталогexample-folder. - В списке сервисов выберите Object Storage.
- Выберите бакет.
- Нажмите кнопку Загрузить и выберите для загрузки файл
index.html.
-
Загрузите в бакет файл
index.html:aws --endpoint-url https://storage.yandexcloud.net \ s3 cp v1/index.html s3://<имя_бакета>/index.htmlРезультат:
upload: v1/index.html to s3://<имя_бакета>/index.html
-
Добавьте в конфигурационный файл параметры файла
v1/index.html, загружаемого в бакет:... resource "yandex_storage_object" "example-bucket-index" { bucket = "<имя_бакета>" key = "index.html" source = "v1/index.html" }Подробнее о ресурсе
yandex_storage_objectсм. в документации провайдера Terraform. -
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply -
Подтвердите создание ресурсов.
-
Используйте метод REST API upload.
- В консоли управления
Создайте группу безопасности
Группы безопасности содержат правила, которые разрешают L7-балансировщику получать входящий трафик и отправлять его на бакеты-бэкенды.
Чтобы создать группы безопасности:
-
В консоли управления
выберите каталогexample-folder. -
В списке сервисов выберите Virtual Private Cloud.
-
На панели слева выберите
Группы безопасности. -
Справа сверху нажмите кнопку Создать группу безопасности.
-
В поле Имя укажите
example-sg. -
В поле Сеть выберите
example-network. -
В блоке Правила создайте следующие правила по инструкции под таблицей:
Направление
трафикаОписание Диапазон портов Протокол Источник /
назначениеCIDR блоки ИсходящийanyВесьЛюбойCIDR0.0.0.0/0Входящийext-http80TCPCIDR0.0.0.0/0Входящийext-https443TCPCIDR0.0.0.0/0Входящийhealthchecks30080TCPПроверки состояния балансировщика— -
Перейдите на вкладку Исходящий трафик или Входящий трафик.
-
Нажмите кнопку Добавить правило.
-
В открывшемся окне в поле Диапазон портов укажите один порт или диапазон портов, куда или откуда будет поступать трафик.
-
В поле Протокол укажите нужный протокол или оставьте
Любой. -
В поле Назначение или Источник выберите назначение правила:
CIDR— правило будет применено к диапазону IP-адресов. В поле CIDR блоки укажите CIDR и маски подсетей, в которые или из которых будет поступать трафик. Чтобы добавить несколько CIDR, нажимайте кнопку Добавить CIDR..Проверки состояния балансировщика— правило, которое позволяет балансировщику проверять состояние ВМ.
-
Нажмите кнопку Сохранить. Таким образом создайте все правила из таблицы.
-
-
Нажмите кнопку Сохранить.
Выполните следующую команду:
yc vpc security-group create example-sg \
--network-name example-network \
--rule direction=egress,port=any,protocol=any,v4-cidrs=[0.0.0.0/0] \
--rule direction=ingress,port=80,protocol=tcp,v4-cidrs=[0.0.0.0/0] \
--rule direction=ingress,port=443,protocol=tcp,v4-cidrs=[0.0.0.0/0] \
--rule direction=ingress,port=30080,protocol=tcp,predefined=loadbalancer_healthchecks
Результат:
id: enpd133ngcnr********
folder_id: b1g9hv2loamq********
created_at: "2022-04-04T10:26:16Z"
name: example-sg
network_id: enptrcle5q3d********
status: ACTIVE
rules:
- id: enpkgrpi2gsi********
direction: EGRESS
protocol_name: ANY
protocol_number: "-1"
cidr_blocks:
v4_cidr_blocks:
- 0.0.0.0/0
- id: enpgssij0i16********
direction: INGRESS
ports:
from_port: "80"
to_port: "80"
protocol_name: TCP
protocol_number: "6"
cidr_blocks:
v4_cidr_blocks:
- 0.0.0.0/0
- id: enp0bft67j9l********
direction: INGRESS
ports:
from_port: "443"
to_port: "443"
protocol_name: TCP
protocol_number: "6"
cidr_blocks:
v4_cidr_blocks:
- 0.0.0.0/0
- id: enpmorcimu65********
direction: INGRESS
ports:
from_port: "30080"
to_port: "30080"
protocol_name: TCP
protocol_number: "6"
predefined_target: loadbalancer_healthchecks
Подробнее о команде yc vpc security-group create см. в справочнике CLI.
-
Добавьте в конфигурационный файл параметры группы безопасности
example-sg:resource "yandex_vpc_security_group" "example-sg" { name = "example-sg" network_id = "yandex_vpc_network.example-network.id" egress { protocol = "ANY" from_port = 0 to_port = 65535 v4_cidr_blocks = ["0.0.0.0/0"] } ingress { protocol = "TCP" port = 80 v4_cidr_blocks = ["0.0.0.0/0"] } ingress { protocol = "TCP" port = 443 v4_cidr_blocks = ["0.0.0.0/0"] } ingress { protocol = "TCP" port = 30080 predefined_target = "loadbalancer_healthchecks" } }Более подробную информацию о параметрах ресурсов в Terraform см. в документации провайдера.
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply -
Подтвердите создание ресурсов.
-
Используйте вызов gRPC API SecurityGroupService/Create или метод REST API create.
Чтобы добавить правило для проверок состояния балансировщика, используйте параметр loadbalancer_healthchecks в поле SecurityGroupRuleSpec.target.predefined_target для gRPC API или в поле predefinedTarget для REST API.
Создайте группу бэкендов в Application Load Balancer
- В консоли управления
выберите каталогexample-folder. - В списке сервисов выберите Application Load Balancer.
- На панели слева выберите
Группы бэкендов. - Справа сверху нажмите кнопку Создать группу бэкендов.
- В поле Имя укажите
example-bg. - В поле Тип выберите тип группы бэкендов
HTTP. - В блоке Бэкенды нажмите кнопку Добавить и задайте настройки бэкенда:
- В поле Имя укажите
example-backend. - В поле Вес укажите
100. - В поле Тип выберите тип бэкенда
Бакет. - В поле Бакет выберите бакет, созданный ранее.
- В поле Имя укажите
- Нажмите кнопку Создать.
Если вы будете выполнять следующие шаги с помощью Terraform, скопируйте идентификатор группы бэкендов example-bg со вкладки
Используйте вызов gRPC API BackendGroupService/Create или метод REST API create.
Создайте HTTP-роутер и виртуальный хост
-
В консоли управления
выберите каталогexample-folder. -
В списке сервисов выберите Application Load Balancer.
-
На панели слева выберите
HTTP-роутеры. -
Справа сверху нажмите кнопку Создать HTTP-роутер.
-
В поле Имя укажите
example-router. -
Создайте виртуальный хост
example-vh:- В блоке Виртуальные хосты нажмите кнопку Добавить виртуальный хост.
- В поле Имя укажите
example-vh. - В поле Authority укажите
cdn.yandexcloud.example. - Нажмите кнопку Добавить маршрут.
- В поле Имя укажите
example-route. - В поле Путь выберите
Начинается си укажите путь/. - В списке Методы HTTP выберите
GET. - В поле Действие оставьте
Маршрутизация. - В списке Группа бэкендов выберите
example-bg.
-
Остальные настройки оставьте без изменений и нажмите кнопку Создать.
-
Создайте HTTP-роутер
example-router:yc alb http-router create example-routerРезультат:
id: ds7qd0vj01dj******** name: example-router folder_id: b1g9hv2loamq******** created_at: "2022-04-04T10:31:41.027649223Z"Подробнее о команде
yc alb http-router createсм. в справочнике CLI. -
Создайте виртуальный хост
example-vh:yc alb virtual-host create example-vh \ --http-router-name example-router \ --authority cdn.yandexcloud.exampleРезультат:
done (1s) name: example-vh authority: - cdn.yandexcloud.exampleПодробнее о команде
yc alb virtual-host createсм. в справочнике CLI. -
Создайте маршрут
example-routeв виртуальном хостеexample-vh:yc alb virtual-host append-http-route example-route \ --http-router-name example-router \ --virtual-host-name example-vh \ --prefix-path-match "/" \ --backend-group-name example-bgРезультат:
done (1s) name: example-vh authority: - cdn.yandexcloud.example routes: - name: example-route http: match: path: prefix_match: / route: backend_group_id: ds7pbm5fj2v0********Подробнее о команде
yc alb virtual-host append-http-routeсм. в справочнике CLI.
-
Добавьте в конфигурационный файл параметры HTTP-роутера
example-router, его виртуальных хостов и маршрутов:... resource "yandex_alb_http_router" "example-router" { name = "example-router" } resource "yandex_alb_virtual_host" "example-vh" { name = "example-vh" http_router_id = ${yandex_alb_http_router.example-router.id} authority = "cdn.yandexcloud.example" route { name = "example-route" http_route { http_route_action { backend_group_id = "<идентификатор_группы_бэкендов_example-bg>" } } } }Подробнее см. в описаниях ресурсов yandex_alb_http_router и yandex_alb_virtual_host в документации провайдера Terraform.
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply -
Подтвердите создание ресурсов.
-
- Создайте HTTP-роутер
example-routerс помощью вызова gRPC API HttpRouterService/Create или метода REST API create. - Создайте виртуальный хост
example-vh, привязанный к роутеру, и его маршрут с помощью вызова gRPC API VirtualHostService/Create или метода REST API create.
Создайте L7-балансировщик
-
В консоли управления
выберите каталогexample-folder. -
В списке сервисов выберите Application Load Balancer.
-
Справа сверху нажмите кнопку Создать L7-балансировщик.
-
В поле Имя укажите
example-balancer. -
В блоке Сетевые настройки:
- В поле Сеть выберите
example-network. - В поле Группы безопасности выберите
example-sg. Если этого поля нет, для балансировщика будет разрешен любой входящий и исходящий трафик.
- В поле Сеть выберите
-
В блоке Размещение выберите три подсети для узлов балансировщика —
example-subnet-kz1-a,example-subnet-kz1-bиexample-subnet-kz1-d— и включите передачу трафика в эти подсети. -
В блоке Обработчики нажмите кнопку Добавить обработчик и задайте настройки обработчика:
- В поле Имя укажите
example-listener. - В блоке Публичный IP-адрес:
- В поле Порт укажите
80. - В поле Тип выберите
Автоматически.
- В поле Порт укажите
- В поле Имя укажите
-
В поле HTTP-роутер выберите
example-router. -
Нажмите кнопку Создать.
-
Получите идентификаторы подсетей сети
example-network:yc vpc network list-subnets example-networkРезультат:
+----------------------+----------------------------------+----------------------+----------------------+----------------+-------------------+---------------+ | ID | NAME | FOLDER ID | NETWORK ID | ROUTE TABLE ID | ZONE | RANGE | +----------------------+----------------------------------+----------------------+----------------------+----------------+-------------------+---------------+ | e9bnnssj8sc8******** | example-subnet-kz1-d | b1g9hv2loamq******** | enptrcle5q3d******** | | kz1-d | [10.1.0.0/16] | | e2lghukd9iqo******** | example-subnet-kz1-b | b1g9hv2loamq******** | enptrcle5q3d******** | | kz1-b | [10.2.0.0/16] | | b0c3pte4o2kn******** | example-subnet-kz1-a | b1g9hv2loamq******** | enptrcle5q3d******** | | kz1-a | [10.3.0.0/16] | +----------------------+----------------------------------+----------------------+----------------------+----------------+-------------------+---------------+Подробнее о команде
yc vpc network list-subnetsсм. в справочнике CLI. -
Получите идентификатор группы безопасности
example-sg:yc vpc security-group get example-sg | grep "^id"Результат:
id: enpd133ngcnr********Подробнее о команде
yc vpc security-group getсм. в справочнике CLI. -
Создайте балансировщик
example-balancer:yc alb load-balancer create example-balancer \ --network-name example-network \ --security-group-id <идентификатор_группы_безопасности_example-sg> \ --location zone=kz1-a,subnet-id=<идентификатор_подсети_example-subnet-kz1-a> \ --location zone=kz1-b,subnet-id=<идентификатор_подсети_example-subnet-kz1-b> \ --location zone=kz1-d,subnet-id=<идентификатор_подсети_example-subnet-kz1-d>Результат:
done (3m0s) id: ds77q7v39b4u******** name: example-balancer folder_id: b1g9hv2loamq******** status: ACTIVE region_id: kz1 network_id: enptrcle5q3d******** allocation_policy: locations: - zone_id: kz1-d subnet_id: b0c3pte4o2kn******** - zone_id: kz1-b subnet_id: e2lghukd9iqo******** - zone_id: kz1-a subnet_id: e9bnnssj8sc8******** log_group_id: ckg23vr4dlks******** security_group_ids: - enpd133ngcnr******** created_at: "2022-04-04T10:55:49.134935148Z"Подробнее о команде
yc alb load-balancer createсм. в справочнике CLI. -
Добавьте к балансировщику обработчик:
yc alb load-balancer add-listener \ --name example-balancer \ --listener-name example-listener \ --external-ipv4-endpoint port=80 \ --http-router-name example-routerРезультат:
done (43s) id: ds77q7v39b4u******** name: example-balancer folder_id: b1g9hv2loamq******** status: ACTIVE region_id: kz1 network_id: enptrcle5q3d******** listeners: - name: example-listener endpoints: - addresses: - external_ipv4_address: address: 84.252.133.149 ports: - "80" http: handler: http_router_id: ds7qd0vj01dj******** allocation_policy: locations: - zone_id: kz1-d subnet_id: b0c3pte4o2kn******** - zone_id: kz1-b subnet_id: e2lghukd9iqo******** - zone_id: kz1-a subnet_id: e9bnnssj8sc8******** log_group_id: ckg23vr4dlks******** security_group_ids: - enpd133ngcnr******** created_at: "2022-04-04T10:55:49.134935148Z"Подробнее о команде
yc alb load-balancer add-listenerсм. в справочнике CLI.
-
Добавьте в конфигурационный файл параметры L7-балансировщика
example-balancer:... resource "yandex_alb_load_balancer" "example-balancer" { name = "example-balancer" network_id = ${yandex_vpc_network.example-network.id} security_group_ids = [ ${yandex_vpc_security_group.example-sg.id} ] allocation_policy { location { zone_id = "kz1-a" subnet_id = ${yandex_vpc_subnet.example-subnet-kz1-a.id} } location { zone_id = "kz1-b" subnet_id = ${yandex_vpc_subnet.example-subnet-kz1-b.id} } location { zone_id = "kz1-d" subnet_id = ${yandex_vpc_subnet.example-subnet-kz1-d.id} } } listener { name = "example-listener" endpoint { address { external_ipv4_address { } } ports = [80] } http { handler { http_router_id = ${yandex_alb_http_router.example-router.id} } } } }Подробнее о ресурсе
yandex_alb_load_balancerсм. в документации провайдера Terraform. -
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply -
Подтвердите создание ресурсов.
-
Используйте вызов gRPC API LoadBalancerService/Create или метод REST API create.
Создайте CDN-ресурс
- В консоли управления
выберите каталогexample-folder. - В списке сервисов выберите Cloud CDN.
- Нажмите кнопку Создать ресурс.
- Задайте основные настройки CDN-ресурса:
-
В блоке Контент:
-
Включите Доступ к контенту.
-
В поле Запрос контента выберите
Из одного источника. -
В поле Тип источника выберите
L7-балансировщик. -
В поле L7-балансировщик выберите
example-balancer. -
В поле IP-адрес выберите IP-адрес, назначенный балансировщику (будет единственным в списке).
-
В поле Протокол для источников выберите
HTTP. -
В поле Доменное имя укажите
cdn.yandexcloud.example.Внимание
Доменное имя
cdn.yandexcloud.exampleстанет основным и его будет невозможно изменить после создания CDN-ресурса.
-
-
В блоке Дополнительно:
- В поле Переадресация клиентов выберите
С HTTP на HTTPS. - В поле Тип сертификата укажите
Сертификат из Certificate Managerи выберите сертификат для доменного имениcdn.yandexcloud.example. - В поле Заголовок Host выберите
Как у клиента.
- В поле Переадресация клиентов выберите
-
- Нажмите Продолжить.
- В разделах Кеширование, HTTP-заголовки и методы и Дополнительно оставьте настройки по умолчанию и нажмите Продолжить.
-
Создайте группу источников
example-origin-group, указав IP-адрес балансировщика:yc cdn origin-group create --name "example-origin-group" \ --origin source=<IP-адрес_балансировщика>:80,enabled=trueРезультат:
id: "90748" folder_id: b1geoelk7fld******** name: example-origin-group use_next: true origins: - id: "562449" origin_group_id: "90748" source: 51.250.10.216:80 enabled: trueПодробнее о команде
yc cdn origin-group createсм. в справочнике CLI. -
Скопируйте идентификатор группы источников
origin_group_idиз предыдущего шага и создайте CDN-ресурс, выполнив команду:yc cdn resource create \ --cname cdn.yandexcloud.example \ --origin-group-id <идентификатор_группы_источников> \ --origin-protocol http \ --cert-manager-ssl-cert-id <идентификатор_сертификата> \ --forward-host-headerРезультат:
id: bc843k2yinvq******** folder_id: b1ge1elk72ld******** cname: cdn.yandexcloud.example ... active: true ... ... ...Подробнее о команде
yc cdn resource createсм. в справочнике CLI. -
Включите переадресацию клиентов для ресурса:
yc cdn resource update <идентификатор_ресурса> --redirect-http-to-https
-
Добавьте в конфигурационный файл параметры CDN-ресурсов:
... resource "yandex_cdn_origin_group" "my_group" { name = "example-origin-group" use_next = true origin { source = "<IP-адрес_балансировщика>:80" backup = false } } resource "yandex_cdn_resource" "my_resource" { cname = "cdn.yandexcloud.example" active = true origin_protocol = "http" origin_group_id = yandex_cdn_origin_group.my_group.id ssl_certificate { type = "certificate_manager" certificate_manager_id = "<идентификатор_сертификата>" } options { edge_cache_settings = "345600" browser_cache_settings = "1800" ignore_cookie = true ignore_query_params = false } }Подробнее см. в описаниях ресурсов yandex_cdn_origin_group и yandex_cdn_resource в документации провайдера Terraform.
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply -
Подтвердите создание ресурсов: введите в терминал слово
yesи нажмите Enter.
После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
-
Включите переадресацию клиентов для ресурса. Добавьте в начало блока
optionsдля CDN-ресурса следующее поле:... options { redirect_https_to_http = true ... -
Выполните проверку с помощью команды:
terraform planЕсли конфигурация описана верно, в терминале отобразится список обновляемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Если ошибок нет, выполните команду:
terraform apply -
Подтвердите обновление ресурса: введите в терминал слово
yesи нажмите Enter.
После этого для у ресурса будет включена переадресация.
Используйте вызов gRPC API ResourceService/Create или метод REST API create.
Настройте DNS для сервиса
Доменное имя cdn.yandexcloud.example должно быть связано с CDN-ресурсом с помощью записей DNS.
Чтобы настроить DNS:
-
Получите доменное имя CDN-балансировщика:
Консоль управления- В консоли управления
выберите каталогexample-folder. - В списке сервисов выберите Cloud CDN.
- В списке CDN-ресурсов выберите ресурс с основным доменным именем
cdn.yandexcloud.example. - Из блока Настройки DNS внизу страницы скопируйте доменное имя вида
328938ed********.a.yccdn.cloud.yandex.netилиcl-msa87*****.edgecdn.ruв зависимости от используемого провайдера CDN.
- В консоли управления
-
На сайте компании, которая предоставляет вам услуги DNS-хостинга, перейдите в настройки DNS.
-
Создайте или измените CNAME-запись для
cdn.yandexcloud.exampleтак, чтобы она указывала на скопированное доменное имя:cdn CNAME 328938ed********.a.yccdn.cloud.yandex.netПримечание
Не используйте ресурсную запись ANAME с доменными именами для раздачи контента, поскольку в таком случае конечный пользователь получит ответ от CDN-сервера, не связанного с геолокацией пользователя. Ответ всегда будет одинаков для всех пользователей.
Если вы пользуетесь Cloud DNS, настройте запись по следующей инструкции:
Инструкция по настройке DNS-записей для Cloud DNS
Консоль управленияYandex Cloud CLITerraformAPI-
В консоли управления
выберите сервис Cloud DNS. -
Если у вас нет публичной зоны DNS, создайте ее:
- Нажмите кнопку Создать зону.
- В поле Зона укажите доменное имя сайта с точкой в конце:
yandexcloud.example. - В поле Тип выберите
Публичная. - В поле Имя укажите
example-dns-zone. - Нажмите кнопку Создать.
-
Создайте в зоне CNAME-запись для
cdn.yandexcloud.example:- Выберите зону
example-dns-zone. - Нажмите кнопку Создать запись.
- В поле Имя укажите
cdn. - В поле Тип укажите
CNAME. - В поле Значение вставьте скопированное значение вида
328938ed********.a.yccdn.cloud.yandex.net. - Нажмите кнопку Создать.
- Выберите зону
-
Если у вас нет публичной зоны DNS, создайте ее:
yc dns zone create \ --name example-dns-zone \ --zone yandexcloud.example. \ --public-visibilityРезультат:
id: dns4rq4taddd******** folder_id: b1g9hv2loamq******** created_at: "2022-04-04T11:03:28.847Z" name: example-dns-zone zone: yandexcloud.example. public_visibility: {}Подробнее о команде
yc dns zone createсм. в справочнике CLI. -
Создайте в зоне CNAME-запись для
cdn.yandexcloud.exampleсо скопированным значением вида328938ed********.a.yccdn.cloud.yandex.net:yc dns zone add-records \ --name example-dns-zone \ --record "cdn CNAME 328938ed********.a.yccdn.cloud.yandex.net" \Подробнее о команде
yc dns zone add-recordsсм. в справочнике CLI.
-
Добавьте в конфигурационный файл параметры DNS-зоны
example-dns-zoneи CNAME-записей в ней:... resource "yandex_dns_zone" "example-dns-zone" { zone = "yandexcloud.example." name = "example-dns-zone" public = true } resource "yandex_dns_recordset" "example-recordset" { zone_id = ${yandex_dns_zone.example-dns-zone.id} name = "cdn" type = "CNAME" data = ["<скопированное_значение_вида_328938ed********.a.yccdn.cloud.yandex.net>"] }Подробнее см. в описаниях ресурсов yandex_dns_zone и yandex_dns_recordset в документации провайдера Terraform.
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply -
Подтвердите создание ресурсов.
-
- Создайте DNS-зону
example-dns-zoneс помощью вызова gRPC API DnsZoneService/Create или метода REST API create. - Добавьте в зону CNAME-запись
cdnсо скопированным значением вида328938ed********.a.yccdn.cloud.yandex.netс помощью вызова gRPC API DnsZoneService/UpdateRecordSets или метода REST API updateRecordSets.
-
На обновление записей на DNS-серверах может потребоваться несколько часов. После этого вы сможете проверить работу сервиса.
Проверьте работу сервиса
Чтобы проверить работу сервиса, откройте в браузере адрес https://cdn.yandexcloud.example/index.html. Вы должны увидеть страницу с таким содержанием:
<!DOCTYPE html>
<html>
<head>
<title>My service</title>
</head>
<body>
<p>The service is working</p>
</body>
</html>
Как удалить созданные ресурсы
Чтобы остановить работу инфраструктуры и перестать платить за созданные ресурсы:
- Если вы настраивали CNAME-записи в Cloud DNS, удалите зону DNS
example-dns-zone. - Удалите CDN-ресурс с основным доменным именем
cdn.yandexcloud.example. - Удалите L7-балансировщик
example-balancer. - Удалите все объекты из бакета.
- Удалите бакет.
- Удалите подсети
example-subnet-kz1-a,example-subnet-kz1-bиexample-subnet-kz1-d. - Удалите сеть
example-network.