Интеграция 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. Вы можете указать другой каталог с помощью параметра --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. -
Создайте подсети во всех зонах доступности:
-
В
ru-central1-a
:yc vpc subnet create example-subnet-ru-central1-a \ --zone ru-central1-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-ru-central1-a network_id: enptrcle5q3d******** zone_id: ru-central1-a v4_cidr_blocks: - 10.1.0.0/16
-
В
ru-central1-b
:yc vpc subnet create example-subnet-ru-central1-b \ --zone ru-central1-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-ru-central1-b network_id: enptrcle5q3d******** zone_id: ru-central1-b v4_cidr_blocks: - 10.2.0.0/16
-
В
ru-central1-d
:yc vpc subnet create example-subnet-ru-central1-d \ --zone ru-central1-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-ru-central1-d network_id: enptrcle5q3d******** zone_id: ru-central1-d v4_cidr_blocks: - 10.3.0.0/16
Подробнее о команде
yc vpc subnet create
см. в справочнике CLI. -
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
Опишите в конфигурационном файле параметры сети
example-network
и ее подсетейexample-subnet-ru-central1-a
,example-subnet-ru-central1-b
иexample-subnet-ru-central1-d
:resource "yandex_vpc_network" "example-network" { name = "example-network" } resource "yandex_vpc_subnet" "example-subnet-a" { name = "example-subnet-ru-central1-a" zone = "ru-central1-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-ru-central1-b" zone = "ru-central1-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-ru-central1-d" zone = "ru-central1-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-ru-central1-a
,example-subnet-ru-central1-b
иexample-subnet-ru-central1-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
Весь
Любой
CIDR
0.0.0.0/0
Входящий
ext-http
80
TCP
CIDR
0.0.0.0/0
Входящий
ext-https
443
TCP
CIDR
0.0.0.0/0
Входящий
healthchecks
30080
TCP
Проверки состояния балансировщика
— -
Перейдите на вкладку Исходящий трафик или Входящий трафик.
-
Нажмите кнопку Добавить правило.
-
В открывшемся окне в поле Диапазон портов укажите один порт или диапазон портов, куда или откуда будет поступать трафик.
-
В поле Протокол укажите нужный протокол или оставьте
Любой
. -
В поле Назначение или Источник выберите назначение правила:
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-ru-central1-a
,example-subnet-ru-central1-b
иexample-subnet-ru-central1-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-ru-central1-d | b1g9hv2loamq******** | enptrcle5q3d******** | | ru-central1-d | [10.1.0.0/16] | | e2lghukd9iqo******** | example-subnet-ru-central1-b | b1g9hv2loamq******** | enptrcle5q3d******** | | ru-central1-b | [10.2.0.0/16] | | b0c3pte4o2kn******** | example-subnet-ru-central1-a | b1g9hv2loamq******** | enptrcle5q3d******** | | ru-central1-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=ru-central1-a,subnet-id=<идентификатор_подсети_example-subnet-ru-central1-a> \ --location zone=ru-central1-b,subnet-id=<идентификатор_подсети_example-subnet-ru-central1-b> \ --location zone=ru-central1-d,subnet-id=<идентификатор_подсети_example-subnet-ru-central1-d>
Результат:
done (3m0s) id: ds77q7v39b4u******** name: example-balancer folder_id: b1g9hv2loamq******** status: ACTIVE region_id: ru-central1 network_id: enptrcle5q3d******** allocation_policy: locations: - zone_id: ru-central1-d subnet_id: b0c3pte4o2kn******** - zone_id: ru-central1-b subnet_id: e2lghukd9iqo******** - zone_id: ru-central1-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: ru-central1 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: ru-central1-d subnet_id: b0c3pte4o2kn******** - zone_id: ru-central1-b subnet_id: e2lghukd9iqo******** - zone_id: ru-central1-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 = "ru-central1-a" subnet_id = ${yandex_vpc_subnet.example-subnet-ru-central1-a.id} } location { zone_id = "ru-central1-b" subnet_id = ${yandex_vpc_subnet.example-subnet-ru-central1-b.id} } location { zone_id = "ru-central1-d" subnet_id = ${yandex_vpc_subnet.example-subnet-ru-central1-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-провайдер еще не активирован, нажмите кнопку Подключиться к провайдеру. Подключение произойдет автоматически.
Если кнопки Подключиться к провайдеру нет, и вам доступно создание ресурсов и групп источников, значит, провайдер уже активирован. Переходите к следующему шагу.
-
Создайте CDN-ресурс:
-
Справа сверху нажмите кнопку Создать ресурс.
-
Задайте основные параметры CDN-ресурса:
-
Запрос контента —
Из одного источника
. -
Тип источника —
L7-балансировщик
. -
L7-балансировщик —
example-balancer
. -
IP-адрес — IP-адрес, назначенный балансировщику (будет единственным в списке).
-
Доменное имя —
cdn.yandexcloud.example
.Внимание
Доменное имя
cdn.yandexcloud.example
станет основным и его будет невозможно изменить после создания CDN-ресурса. -
В блоке Дополнительно:
- В поле Протокол для источников выберите
HTTP
. - В поле Переадресация клиентов выберите
Не использовать
. - Выберите опцию Доступ конечных пользователей к контенту.
- В поле Тип сертификата укажите
Сертификат из Certificate Manager
и выберите сертификат для доменного имениcdn.yandexcloud.example
. - В поле Заголовок Host выберите
Как у клиента
.
- В поле Протокол для источников выберите
-
-
Нажмите кнопку Создать.
-
-
Включите переадресацию клиентов с HTTP на HTTPS:
- Выберите ресурс, созданный ранее.
- Убедитесь, что в блоке Дополнительно статус сертификата изменился на
Выпущен
. - Справа сверху нажмите кнопку
Редактировать. - В блоке Дополнительно в поле Переадресация клиентов выберите
С HTTP на HTTPS
. - Нажмите кнопку Сохранить.
-
Если CDN-провайдер еще не активирован, выполните команду:
yc cdn provider activate --folder-id <идентификатор_каталога> --type gcore
-
Создайте группу источников
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 внизу страницы скопируйте доменное имя вида
cl-********.edgecdn.ru
.
- В консоли управления
-
На сайте компании, которая предоставляет вам услуги DNS-хостинга, перейдите в настройки DNS.
-
Создайте или измените CNAME-запись для
cdn.yandexcloud.example
так, чтобы она указывала на скопированное доменное имя:cdn CNAME cl-********.edgecdn.ru
Примечание
Не используйте ресурсную запись 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
. - В поле Значение вставьте скопированное значение вида
cl-********.edgecdn.ru
. - Нажмите кнопку Создать.
- Выберите зону
-
Если у вас нет публичной зоны 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
со скопированным значением видаcl-********.edgecdn.ru
:yc dns zone add-records \ --name example-dns-zone \ --record "cdn CNAME cl-********.edgecdn.ru" \
Подробнее о команде
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 = ["<скопированное_значение_вида_cl-********.edgecdn.ru>"] }
Подробнее см. в описаниях ресурсов 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
со скопированным значением видаcl-********.edgecdn.ru
с помощью вызова 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-ru-central1-a
,example-subnet-ru-central1-b
иexample-subnet-ru-central1-d
. - Удалите сеть
example-network
.