Организация сине-зеленого и канареечного развертывания версий веб-сервиса
- Поддерживаемые инструменты
- Подготовьте облако к работе
- Добавьте сертификат в Certificate Manager
- Создайте облачную сеть и подсети
- Создайте бакеты в Object Storage
- Загрузите файлы сервиса в бакеты
- Создайте группу безопасности
- Создайте группы бэкендов в Application Load Balancer
- Создайте HTTP-роутер и виртуальные хосты
- Создайте L7-балансировщик
- Создайте CDN-ресурс
- Настройте DNS для сервиса
- Проверьте работу сервиса и переключение между версиями
- Как удалить созданные ресурсы
Настройте архитектуру веб-сервиса, которая позволит переключаться между версиями по распространенным схемам развертывания: с помощью сине-зеленого развертывания
Обе схемы используют пару бэкендов: «синий» и «зеленый». Сначала на одном из бэкендов (например, на «синем») размещается стабильная версия, доступная пользователям, а другой («зеленый») используется для тестирования следующей версии. Когда тестирование окончено, бэкенды меняются ролями:
- При сине-зеленом развертывании весь пользовательский трафик одномоментно перераспределяется с одного бэкенда на другой.
- При канареечном развертывании переключение происходит постепенно, начиная с части пользователей.
После этого основным становится «зеленый» бэкенд, а на «синем» бэкенде можно тестировать следующую версию сервиса. Также, пока на «синем» бэкенде остается предыдущая версия, на нее можно откатить сервис, снова поменяв бэкенды ролями.
В данном руководстве в качестве бэкендов используются бакеты Yandex Object Storage, а за переключение между ними отвечает L7-балансировщик Yandex Application Load Balancer. Запросы пользователей передаются балансировщику через сеть распространения контента Yandex Cloud CDN, чтобы сократить время доставки контента.
В качестве примеров будут использованы доменные имена cdn.yandexcloud.example
и cdn-staging.yandexcloud.example
.
Для выполнения шагов можно использовать различные поддерживаемые инструменты.
Чтобы построить архитектуру для сине-зеленого и канареечного развертывания:
- Подготовьте облако к работе.
- Добавьте сертификат в Certificate Manager
- Создайте облачную сеть и подсети.
- Создайте бакеты в Object Storage.
- Загрузите файлы сервиса в бакеты.
- Создайте группы бэкендов в Application Load Balancer.
- Создайте HTTP-роутер и виртуальные хосты.
- Создайте L7-балансировщик.
- Создайте CDN-ресурс.
- Настройте DNS для сервиса.
- Проверьте работу сервиса и переключение между версиями.
Если созданные ресурсы вам больше не нужны, удалите их.
Поддерживаемые инструменты
Бо́льшую часть шагов можно выполнить с помощью любого из стандартных инструментов: консоли управления
Некоторые инструменты поддерживаются не для всех шагов:
- Через CLI и Terraform сейчас нельзя:
- создать группу бэкендов в Application Load Balancer с бакетами в качестве бэкендов;
- получить доменное имя CDN-балансировщика при настройке DNS для сервиса;
- отключать и включать кеширование CDN-ресурса при проверке работы сервиса и переключения между версиями.
- Через 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.
- Справа сверху нажмите кнопку Создать сеть.
- В поле Имя укажите
canary-network
. - В поле Дополнительно выберите опцию Создать подсети.
- Нажмите кнопку Создать сеть.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Создайте сеть
canary-network
:yc vpc network create canary-network
Результат:
id: enptrcle5q3d******** folder_id: b1g9hv2loamq******** created_at: "2021-11-03T09:25:03Z" name: canary-network default_security_group_id: enpbsnnop4ak********
Подробнее о команде
yc vpc network create
см. в справочнике CLI. -
Создайте подсети во всех зонах доступности:
-
В
ru-central1-a
:yc vpc subnet create canary-subnet-ru-central1-a \ --zone ru-central1-a \ --network-name canary-network \ --range 10.1.0.0/16
Результат:
id: e9bnnssj8sc8******** folder_id: b1g9hv2loamq******** created_at: "2021-11-03T09:27:00Z" name: canary-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 canary-subnet-ru-central1-b \ --zone ru-central1-b \ --network-name canary-network \ --range 10.2.0.0/16
Результат:
id: e2lghukd9iqo******** folder_id: b1g9hv2loamq******** created_at: "2021-11-03T09:27:39Z" name: canary-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 canary-subnet-ru-central1-d \ --zone ru-central1-d \ --network-name canary-network \ --range 10.3.0.0/16
Результат:
id: b0c3pte4o2kn******** folder_id: b1g9hv2loamq******** created_at: "2021-11-03T09:28:08Z" name: canary-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.
-
Опишите в конфигурационном файле параметры сети
canary-network
и ее подсетейcanary-subnet-ru-central1-a
,canary-subnet-ru-central1-b
иcanary-subnet-ru-central1-d
:resource "yandex_vpc_network" "canary-network" { name = "canary-network" } resource "yandex_vpc_subnet" "canary-subnet-a" { name = "canary-subnet-ru-central1-a" zone = "ru-central1-a" network_id = "${yandex_vpc_network.canary-network.id}" v4_cidr_blocks = ["10.1.0.0/16"] } resource "yandex_vpc_subnet" "canary-subnet-b" { name = "canary-subnet-ru-central1-b" zone = "ru-central1-b" network_id = "${yandex_vpc_network.canary-network.id}" v4_cidr_blocks = ["10.2.0.0/16"] } resource "yandex_vpc_subnet" "canary-subnet-d" { name = "canary-subnet-ru-central1-d" zone = "ru-central1-d" network_id = "${yandex_vpc_network.canary-network.id}" v4_cidr_blocks = ["10.3.0.0/16"] }
Подробнее см. в описаниях ресурсов yandex_vpc_network
и yandex_vpc_subnet в документации провайдера Terraform. -
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание ресурсов.
-
- Создайте сеть
canary-network
с помощью вызова gRPC API NetworkService/Create или метода REST API create. - Создайте подсети
canary-subnet-ru-central1-a
,canary-subnet-ru-central1-b
иcanary-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" "canary-bucket-blue" { 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" } resource "yandex_storage_bucket" "canary-bucket-green" { 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
. Они будут представлять разные версии сервиса: один — версию 1, другой — версию 2.Пример файла index.html версии 1
<!DOCTYPE html> <html> <head> <title>Version 1</title> </head> <body> <p>Version 1 is working</p> </body> </html>
Пример файла index.html версии 2
<!DOCTYPE html> <html> <head> <title>Version 2</title> </head> <body> <p>Version 2 is working</p> </body> </html>
-
Загрузите файлы в бакеты:
Консоль управленияAWS CLITerraformAPI- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Object Storage.
- Выберите «синий» бакет.
- Нажмите кнопку Загрузить и выберите для загрузки файл
index.html
версии 1. - Таким же образом загрузите в «зеленый» бакет файл
index.html
версии 2.
-
Загрузите в «синий» бакет файл
index.html
версии 1:aws --endpoint-url https://storage.yandexcloud.net \ s3 cp v1/index.html s3://<имя_синего_бакета>/index.html
Результат:
upload: v1/index.html to s3://<имя_синего_бакета>/index.html
-
Загрузите в «зеленый» бакет файл
index.html
версии 2:aws --endpoint-url https://storage.yandexcloud.net \ s3 cp v2/index.html s3://<имя_зеленого_бакета>/index.html
Результат:
upload: v2/index.html to s3://<имя_зеленого_бакета>/index.html
-
Добавьте в конфигурационный файл параметры файлов
v1/index.html
иv2/index.html
, загружаемых в бакеты «синий» и «зеленый» соответственно:... resource "yandex_storage_object" "canary-bucket-blue-index" { bucket = "<имя_синего_бакета>" key = "index.html" source = "v1/index.html" } resource "yandex_storage_bucket" "canary-bucket-green-index" { bucket = "<имя_зеленого_бакета>" key = "index.html" source = "v2/index.html" }
Подробнее о ресурсе
yandex_storage_object
см. в документации провайдера Terraform. -
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание ресурсов.
-
Используйте метод REST API upload.
- В консоли управления
Создайте группу безопасности
Группы безопасности содержат правила, которые разрешают L7-балансировщику получать входящий трафик и отправлять его на бакеты-бэкенды.
Чтобы создать группы безопасности:
-
В консоли управления
выберите сервис Virtual Private Cloud. -
На панели слева выберите
Группы безопасности. -
Справа сверху нажмите кнопку Создать группу безопасности.
-
В поле Имя укажите
canary-sg
. -
В поле Сеть выберите
canary-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 canary-sg \
--network-name canary-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: "2021-11-03T10:26:16Z"
name: canary-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.
-
Добавьте в конфигурационный файл параметры группы безопасности
canary-sg
:resource "yandex_vpc_security_group" "canary-sg" { name = "canary-sg" network_id = yandex_vpc_network.canary-network.id egress { protocol = "ANY" port = "ANY" 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
-
Создайте группу бэкендов
canary-bg-production
с бэкендамиcanary-backend-blue
иcanary-backend-green
:- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Application Load Balancer.
- На панели слева выберите
Группы бэкендов. - Справа сверху нажмите кнопку Создать группу бэкендов.
- В поле Имя укажите
canary-bg-production
. - Создайте бэкенд
canary-backend-blue
:- В блоке Бэкенды нажмите Добавить.
- В поле Имя укажите
canary-backend-blue
. - В поле Вес укажите
100
. - В поле Тип выберите
Бакет
. - В поле Бакет выберите «синий» бакет.
- Создайте бэкенд
canary-backend-green
:- В блоке Бэкенды нажмите Добавить.
- В поле Имя укажите
canary-backend-green
. - В поле Вес укажите
0
. - В поле Тип выберите
Бакет
. - В поле Бакет выберите «зеленый» бакет.
- Нажмите кнопку Создать.
- В консоли управления
-
Аналогично создайте группу бэкендов
canary-bg-staging
. Для бэкендаcanary-backend-blue
установите вес0
, дляcanary-backend-green
—100
.
Если вы будете выполнять следующие шаги с помощью Terraform, скопируйте идентификаторы групп бэкендов canary-bg-production
и canary-bg-staging
со вкладки
Используйте вызов gRPC API BackendGroupService/Create или метод REST API create.
Создайте HTTP-роутер и виртуальные хосты
-
В консоли управления
выберите каталогexample-folder
. -
В списке сервисов выберите Application Load Balancer.
-
На панели слева выберите
HTTP-роутеры. -
Справа сверху нажмите кнопку Создать HTTP-роутер.
-
В поле Имя укажите
canary-router
. -
Создайте виртуальный хост
canary-vh-production
:- В блоке Виртуальные хосты нажмите кнопку Добавить виртуальный хост.
- В поле Имя укажите
canary-vh-production
. - В поле Authority укажите
cdn.yandexcloud.example
. - Нажмите кнопку Добавить маршрут.
- В поле Имя укажите
canary-route-production
. - В поле Путь выберите
Начинается с
и укажите путь/
. - В списке Методы HTTP выберите
GET
. - В поле Действие оставьте
Маршрутизация
. - В списке Группа бэкендов выберите
canary-bg-production
.
-
Создайте виртуальный хост
canary-vh-staging
:- Имя —
canary-vh-production
. - Authority —
cdn-staging.yandexcloud.example
. - Имя маршрута —
canary-route-staging
. - Группа бэкендов —
canary-bg-staging
. - Остальные параметры — как у
canary-vh-production
.
- Имя —
-
Нажмите кнопку Создать.
-
Создайте HTTP-роутер
canary-router
:yc alb http-router create canary-router
Результат:
id: ds7qd0vj01dj******** name: canary-router folder_id: b1g9hv2loamq******** created_at: "2021-11-03T10:31:41.027649223Z"
Подробнее о команде
yc alb http-router create
см. в справочнике CLI. -
Создайте виртуальный хост
canary-vh-production
:yc alb virtual-host create canary-vh-production \ --http-router-name canary-router \ --authority cdn.yandexcloud.example
Результат:
done (1s) name: canary-vh-production authority: - cdn.yandexcloud.example
Подробнее о команде
yc alb virtual-host create
см. в справочнике CLI. -
Создайте маршрут
canary-route-production
в виртуальном хостеcanary-vh-production
:yc alb virtual-host append-http-route canary-route-production \ --http-router-name canary-router \ --virtual-host-name canary-vh-production \ --prefix-path-match "/" \ --backend-group-name canary-bg-production
Результат:
done (1s) name: canary-vh-production authority: - cdn.yandexcloud.example routes: - name: canary-route-production http: match: path: prefix_match: / route: backend_group_id: ds7pbm5fj2v0********
Подробнее о команде
yc alb virtual-host append-http-route
см. в справочнике CLI. -
Создайте виртуальный хост
canary-vh-staging
:yc alb virtual-host create canary-vh-staging \ --http-router-name canary-router \ --authority cdn-staging.yandexcloud.example
Результат:
done (1s) name: canary-vh-staging authority: - cdn-staging.yandexcloud.example
-
Создайте маршрут
canary-route-staging
в виртуальном хостеcanary-vh-staging
:yc alb virtual-host append-http-route canary-route-staging \ --http-router-name canary-router \ --virtual-host-name canary-vh-staging \ --prefix-path-match "/" \ --backend-group-name canary-bg-staging
Результат:
done (1s) name: canary-vh-staging authority: - cdn-staging.yandexcloud.example routes: - name: canary-route-staging http: match: path: prefix_match: / route: backend_group_id: ds765atleota********
-
Добавьте в конфигурационный файл параметры HTTP-роутера
canary-router
, его виртуальных хостов и маршрутов:... resource "yandex_alb_http_router" "canary-router" { name = "canary-router" } resource "yandex_alb_virtual_host" "canary-vh-production" { name = "canary-vh-production" http_router_id = ${yandex_alb_http_router.canary-router.id} authority = "cdn.yandexcloud.example" route { name = "canary-route-production" http_route { http_route_action { backend_group_id = "<идентификатор_группы_бэкендов_canary-bg-production>" } } } } resource "yandex_alb_virtual_host" "canary-vh-staging" { name = "canary-vh-staging" http_router_id = ${yandex_alb_http_router.canary-router.id} authority = "cdn-staging.yandexcloud.example" route { name = "canary-route-staging" http_route { http_route_action { backend_group_id = "<идентификатор_группы_бэкендов_canary-bg-staging>" } } } }
Подробнее см. в описаниях ресурсов yandex_alb_http_router
и yandex_alb_virtual_host в документации провайдера Terraform. -
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание ресурсов.
-
- Создайте HTTP-роутер
canary-router
с помощью вызова gRPC API HttpRouterService/Create или метода REST API create. - Создайте виртуальные хосты
canary-vh-production
иcanary-vh-staging
, привязанные к роутеру, и их маршруты с помощью вызова gRPC API VirtualHostService/Create или метода REST API create.
Создайте L7-балансировщик
-
В консоли управления
выберите каталогexample-folder
. -
В списке сервисов выберите Application Load Balancer.
-
Справа сверху нажмите кнопку Создать L7-балансировщик.
-
В поле Имя укажите
canary-balancer
. -
В блоке Сетевые настройки:
- В поле Сеть выберите
canary-network
. - В поле Группы безопасности выберите
canary-sg
. Если этого поля нет, для балансировщика будет разрешен любой входящий и исходящий трафик.
- В поле Сеть выберите
-
В блоке Размещение выберите три подсети для узлов балансировщика —
canary-subnet-ru-central1-a
,canary-subnet-ru-central1-b
иcanary-subnet-ru-central1-d
— и включите передачу трафика в эти подсети. -
В блоке Обработчики нажмите Добавить обработчик и задайте настройки обработчика:
-
В поле Имя укажите
canary-listener
. -
В блоке Публичный IP-адрес:
- В поле Порт укажите
80
. - В поле Тип выберите
Автоматически
.
- В поле Порт укажите
-
В поле HTTP-роутер выберите
canary-router
.
-
-
Нажмите кнопку Создать.
-
Получите идентификаторы подсетей сети
canary-network
:yc vpc network list-subnets canary-network
Результат:
+----------------------+-----------------------------+----------------------+----------------------+----------------+---------------+---------------+ | ID | NAME | FOLDER ID | NETWORK ID | ROUTE TABLE ID | ZONE | RANGE | +----------------------+-----------------------------+----------------------+----------------------+----------------+---------------+---------------+ | e9bnnssj8sc8******** | canary-subnet-ru-central1-d | b1g9hv2loamq******** | enptrcle5q3d******** | | ru-central1-d | [10.1.0.0/16] | | e2lghukd9iqo******** | canary-subnet-ru-central1-b | b1g9hv2loamq******** | enptrcle5q3d******** | | ru-central1-b | [10.2.0.0/16] | | b0c3pte4o2kn******** | canary-subnet-ru-central1-a | b1g9hv2loamq******** | enptrcle5q3d******** | | ru-central1-a | [10.3.0.0/16] | +----------------------+-----------------------------+----------------------+----------------------+----------------+---------------+---------------+
Подробнее о команде
yc vpc network list-subnets
см. в справочнике CLI. -
Получите идентификатор группы безопасности
canary-sg
:yc vpc security-group get canary-sg | grep "^id"
Результат:
id: enpd133ngcnr********
Подробнее о команде
yc vpc security-group get
см. в справочнике CLI. -
Создайте балансировщик
canary-balancer
:yc alb load-balancer create canary-balancer \ --network-name canary-network \ --security-group-id <идентификатор_группы_безопасности_canary-sg> \ --location zone=ru-central1-a,subnet-id=<идентификатор_подсети_canary-subnet-ru-central1-a> \ --location zone=ru-central1-b,subnet-id=<идентификатор_подсети_canary-subnet-ru-central1-b> \ --location zone=ru-central1-d,subnet-id=<идентификатор_подсети_canary-subnet-ru-central1-d>
Результат:
done (3m0s) id: ds77q7v39b4u******** name: canary-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: "2021-11-03T10:55:49.134935148Z"
Подробнее о команде
yc alb load-balancer create
см. в справочнике CLI. -
Добавьте к балансировщику обработчик:
yc alb load-balancer add-listener \ --name canary-balancer \ --listener-name canary-listener \ --external-ipv4-endpoint port=80 \ --http-router-name canary-router
Результат:
done (43s) id: ds77q7v39b4u******** name: canary-balancer folder_id: b1g9hv2loamq******** status: ACTIVE region_id: ru-central1 network_id: enptrcle5q3d******** listeners: - name: canary-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: "2021-11-03T10:55:49.134935148Z"
Подробнее о команде
yc alb load-balancer add-listener
см. в справочнике CLI.
-
Добавьте в конфигурационный файл параметры L7-балансировщика
canary-balancer
:... resource "yandex_alb_load_balancer" "canary-balancer" { name = "canary-balancer" network_id = ${yandex_vpc_network.canary-network.id} security_group_ids = [ ${yandex_vpc_security_group.canary-sg.id} ] allocation_policy { location { zone_id = "ru-central1-a" subnet_id = ${yandex_vpc_subnet.canary-subnet-ru-central1-a.id} } location { zone_id = "ru-central1-b" subnet_id = ${yandex_vpc_subnet.canary-subnet-ru-central1-b.id} } location { zone_id = "ru-central1-d" subnet_id = ${yandex_vpc_subnet.canary-subnet-ru-central1-d.id} } } listener { name = "canary-listener" endpoint { address { external_ipv4_address { } } ports = [80] } http { handler { http_router_id = ${yandex_alb_http_router.canary-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-балансировщик —
canary-balancer
. -
IP-адрес — IP-адрес, назначенный балансировщику (будет единственным в списке).
-
В блоке Доменные имена для раздачи контента:
- В поле Доменное имя укажите
cdn.yandexcloud.example
. - Нажмите кнопку Добавить доменное имя и укажите
cdn-staging.yandexcloud.example
.
Внимание
Первое доменное имя,
cdn.yandexcloud.example
, станет основным, и его будет невозможно изменить после создания CDN-ресурса. - В поле Доменное имя укажите
-
В блоке Дополнительно:
- В поле Протокол для источников выберите
HTTP
. - В поле Переадресация клиентов выберите
Не использовать
. - Выберите опцию Доступ конечных пользователей к контенту.
- В поле Тип сертификата укажите
Сертификат из Certificate Manager
и выберите сертификат для доменных именcdn.yandexcloud.example
иcdn-staging.yandexcloud.example
. - В поле Заголовок Host выберите
Как у клиента
.
- В поле Протокол для источников выберите
-
-
Нажмите кнопку Создать.
-
-
Включите переадресацию клиентов с HTTP на HTTPS:
- Выберите ресурс, созданный ранее.
- Убедитесь, что в блоке Дополнительно статус сертификата изменился на
Выпущен
. - Справа сверху нажмите кнопку
Редактировать. - В блоке Дополнительно в поле Переадресация клиентов выберите
С HTTP на HTTPS
. - Нажмите кнопку Сохранить.
-
Включите для ресурса кеширование на CDN-серверах:
- Выберите ресурс, созданный ранее.
- Перейдите в раздел Кеширование.
- Справа сверху нажмите кнопку
Редактировать. - Включите опцию Кеширование в CDN.
- Нажмите кнопку Сохранить.
-
Если CDN-провайдер еще не активирован, выполните команду:
yc cdn provider activate --folder-id <идентификатор_каталога> --type gcore
-
Создайте группу источников
canary-origin-group
, указав IP-адрес балансировщика:yc cdn origin-group create --name "canary-origin-group" \ --origin source=<IP-адрес_балансировщика>:80,enabled=true
Результат:
id: "90748" folder_id: b1geoelk7fld******** name: canary-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 <идентификатор_группы_источников> \ --secondary-hostnames cdn-staging.yandexcloud.example \ --origin-protocol http \ --cert-manager-ssl-cert-id <идентификатор_сертификата> \ --forward-host-header
Результат:
id: bc843k2yinvq******** folder_id: b1ge1elk72ld******** cname: cdn.yandexcloud.example ... active: true ... ... secondary_hostnames: - cdn-staging.yandexcloud.example ...
Подробнее о команде
yc cdn resource create
см. в справочнике CLI. -
Включите переадресацию клиентов для ресурса:
yc cdn resource update <идентификатор_ресурса> --redirect-http-to-https
-
Добавьте в конфигурационный файл параметры CDN-ресурсов:
... resource "yandex_cdn_origin_group" "my_group" { name = "canary-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" secondary_hostnames = ["cdn-staging.yandexcloud.example"] 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-staging.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-staging.yandexcloud.example
таким образом, чтобы они указывали на скопированное доменное имя:cdn CNAME cl-********.edgecdn.ru cdn-staging CNAME cl-********.edgecdn.ru
Примечание
Не используйте ресурсную запись ANAME с доменными именами для раздачи контента, поскольку в таком случае конечный пользователь получит ответ от CDN-сервера, не связанного с геолокацией пользователя. Ответ всегда будет одинаков для всех пользователей.
Если вы пользуетесь Cloud DNS, настройте запись по следующей инструкции:
Инструкция по настройке DNS-записей для Cloud DNS
Консоль управленияYandex Cloud CLITerraformAPI-
В консоли управления
выберите сервис Cloud DNS. -
Если у вас нет публичной зоны DNS, создайте ее:
- Нажмите кнопку Создать зону.
- В поле Зона укажите доменное имя сайта с точкой в конце:
yandexcloud.example.
- В поле Тип выберите
Публичная
. - В поле Имя укажите
canary-dns-zone
. - Нажмите кнопку Создать.
-
Создайте в зоне CNAME-запись для
cdn.yandexcloud.example
:- Выберите зону
canary-dns-zone
. - Нажмите кнопку Создать запись.
- В поле Имя укажите
cdn
. - В поле Тип укажите
CNAME
. - В поле Значение вставьте скопированное значение вида
cl-********.edgecdn.ru
. - Нажмите кнопку Создать.
- Выберите зону
-
Аналогично создайте в той же зоне CNAME-запись для
cdn-staging.yandexcloud.example
. В поле Имя укажитеcdn-staging
.
-
Если у вас нет публичной зоны DNS, создайте ее:
yc dns zone create \ --name canary-dns-zone \ --zone yandexcloud.example. \ --public-visibility
Результат:
id: dns4rq4taddd******** folder_id: b1g9hv2loamq******** created_at: "2021-11-03T11:03:28.847Z" name: canary-dns-zone zone: yandexcloud.example. public_visibility: {}
Подробнее о команде
yc dns zone create
см. в справочнике CLI. -
Создайте в зоне CNAME-записи для
cdn.yandexcloud.example
иcdn-staging.yandexcloud.example
со скопированным значением видаcl-********.edgecdn.ru
:yc dns zone add-records \ --name canary-dns-zone \ --record "cdn CNAME cl-********.edgecdn.ru" \ --record "cdn-staging CNAME cl-********.edgecdn.ru"
Подробнее о команде
yc dns zone add-records
см. в справочнике CLI.
-
Добавьте в конфигурационный файл параметры DNS-зоны
canary-dns-zone
и CNAME-записей в ней:... resource "yandex_dns_zone" "canary-dns-zone" { zone = "yandexcloud.example." name = "canary-dns-zone" public = true } resource "yandex_dns_recordset" "canary-recordset-production" { zone_id = ${yandex_dns_zone.canary-dns-zone.id} name = "cdn" type = "CNAME" data = ["<скопированное_значение_вида_cl-********.edgecdn.ru>"] } resource "yandex_dns_recordset" "canary-recordset-staging" { zone_id = ${yandex_dns_zone.canary-dns-zone.id} name = "cdn-staging" type = "CNAME" data = ["<скопированное_значение_вида_cl-********.edgecdn.ru>"] }
Подробнее см. в описаниях ресурсов yandex_dns_zone
и yandex_dns_recordset в документации провайдера Terraform. -
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание ресурсов.
-
- Создайте DNS-зону
canary-dns-zone
с помощью вызова gRPC API DnsZoneService/Create или метода REST API create. - Добавьте в зону CNAME-записи
cdn
иcdn-staging
со скопированным значением видаcl-********.edgecdn.ru
с помощью вызова gRPC API DnsZoneService/UpdateRecordSets или метода REST API updateRecordSets.
-
На обновление записей на DNS-серверах может потребоваться несколько часов. После этого вы сможете проверить работу сервиса.
Проверьте работу сервиса и переключение между версиями
Первая проверка
Проверьте, что доменному имени cdn.yandexcloud.example
соответствует версия 1, а cdn-staging.yandexcloud.example
— версия 2:
-
Откройте в браузере адрес
https://cdn.yandexcloud.example/index.html
. Вы должны увидеть страницу с указанием на версию 1. -
Удалите из кеша CDN-ресурса файл
index.html
:Консоль управленияYandex Cloud CLIAPI- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Cloud CDN.
- Выберите созданный CDN-ресурс (в списке ресурсов будет указано его основное доменное имя —
cdn.yandexcloud.example
). - Перейдите на вкладку Контент.
- Нажмите кнопку Очистить кеш.
- В поле Тип очистки выберите
Выборочная
. - Укажите путь к загруженному файлу:
/index.html
. - Нажмите кнопку Очистить кеш.
-
Получите идентификатор созданного CDN-ресурса:
yc cdn resource list
Результат:
+----------------------+--------------------------+--------------------------------+--------------------------------+--------+-------------------------------------------+ | ID | CNAME | CREATED AT | UPDATED AT | ACTIVE | OPTIONS | +----------------------+--------------------------+--------------------------------+--------------------------------+--------+-------------------------------------------+ | bc837xptmpkh******** | cdn.yandexcloud.example | seconds:1637235693 | seconds:1637235693 | true | edge_cache_settings:{enabled:true | | | | nanos:434085000 | nanos:434115000 | | default_value:345600} | | | | | | | cache_http_headers:{value:"accept-ranges" | | | | | | | value:"cache-control" value:"connection" | | | | | | | value:"content-encoding" | | | | | | | value:"content-length" | | | | | | | value:"content-type" | | | | | | | value:"date" value:"etag" | | | | | | | value:"expires" value:"keep-alive" | | | | | | | value:"last-modified" value:"server" | | | | | | | value:"vary"} stale:{enabled:true | | | | | | | value:"error" value:"updating"} | | | | | | | allowed_http_methods:{value:"GET" | | | | | | | value:"POST" value:"HEAD" | | | | | | | value:"OPTIONS"} | +----------------------+--------------------------+--------------------------------+--------------------------------+--------+-------------------------------------------+
Подробнее о команде
yc cdn resource list
см. в справочнике CLI. -
Удалите файл из кеша:
yc cdn cache purge \ --resource-id <идентификатор_CDN-ресурса> \ --path "/index.html"
Подробнее о команде
yc cdn cache purge
см. в справочнике CLI.
- Получите идентификатор созданного CDN-ресурса с помощью вызова gRPC API ResourceService/List или метода REST API list.
- Удалите файл
index.html
из кеша с помощью вызова gRPC API CacheService/Purge или метода purge.
- В консоли управления
-
Откройте в браузере адрес
https://cdn-staging.yandexcloud.example/index.html
. Вы должны увидеть страницу с указанием на версию 2.
Канареечное развертывание версии 2
-
Отключите кеширование CDN-ресурса и удалите из кеша файл
index.html
:Консоль управленияAPI- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Cloud CDN.
- Выберите созданный CDN-ресурс (в списке ресурсов будет указано его основное доменное имя —
cdn.yandexcloud.example
). - Перейдите на вкладку Кеширование.
- Нажмите кнопку Редактировать.
- Отключите опцию Кеширование в CDN.
- Нажмите кнопку Сохранить.
- Получите идентификатор созданного CDN-ресурса с помощью вызова gRPC API ResourceService/List или метода REST API list.
- Отключите кеширование с помощью вызова gRPC API ResourceService/Update или метода REST API list.
- В консоли управления
-
Удалите из кеша файл
index.html
:Консоль управленияYandex Cloud CLIAPI- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Cloud CDN.
- Выберите созданный CDN-ресурс (в списке ресурсов будет указано его основное доменное имя —
cdn.yandexcloud.example
). - Перейдите на вкладку Контент.
- Нажмите кнопку Очистить кеш.
- В поле Тип очистки выберите
Выборочная
. - Укажите путь к загруженному файлу:
/index.html
. - Нажмите кнопку Очистить кеш.
-
Получите идентификатор созданного CDN-ресурса:
yc cdn resource list
Результат:
+----------------------+--------------------------+--------------------------------+--------------------------------+--------+-------------------------------------------+ | ID | CNAME | CREATED AT | UPDATED AT | ACTIVE | OPTIONS | +----------------------+--------------------------+--------------------------------+--------------------------------+--------+-------------------------------------------+ | bc837xptmpkh******** | cdn.yandexcloud.example | seconds:1637235693 | seconds:1637235693 | true | edge_cache_settings:{enabled:true | | | | nanos:434085000 | nanos:434115000 | | default_value:345600} | | | | | | | cache_http_headers:{value:"accept-ranges" | | | | | | | value:"cache-control" value:"connection" | | | | | | | value:"content-encoding" | | | | | | | value:"content-length" | | | | | | | value:"content-type" | | | | | | | value:"date" value:"etag" | | | | | | | value:"expires" value:"keep-alive" | | | | | | | value:"last-modified" value:"server" | | | | | | | value:"vary"} stale:{enabled:true | | | | | | | value:"error" value:"updating"} | | | | | | | allowed_http_methods:{value:"GET" | | | | | | | value:"POST" value:"HEAD" | | | | | | | value:"OPTIONS"} | +----------------------+--------------------------+--------------------------------+--------------------------------+--------+-------------------------------------------+
-
Удалите файл из кеша:
yc cdn cache purge \ --resource-id <идентификатор_CDN-ресурса> \ --path "/index.html"
- Получите идентификатор созданного CDN-ресурса с помощью вызова gRPC API ResourceService/List или метода REST API list.
- Удалите файл
index.html
из кеша с помощью вызова gRPC API CacheService/Purge или метода purge.
- В консоли управления
-
Настройте группу бэкендов
canary-bg-production
так, чтобы 20% трафика доменного имениcdn.yandexcloud.example
приходилось на бэкендcanary-backend-green
с версией 2:Консоль управленияYandex Cloud CLIAPI-
В консоли управления
выберите каталогexample-folder
. -
В списке сервисов выберите Application Load Balancer.
-
На панели слева выберите
Группы бэкендов. -
Выберите
canary-bg-production
. -
Для бэкенда
canary-backend-blue
установите вес 80 вместо 100:- В блоке Бэкенды найдите бэкенд
canary-backend-blue
, нажмите и выберите Редактировать. - В поле Вес укажите
80
. - Нажмите Сохранить.
- В блоке Бэкенды найдите бэкенд
-
Аналогично для бэкенда
canary-backend-green
установите вес 20 вместо 0. -
Нажмите кнопку Сохранить.
-
Для бэкенда
canary-backend-blue
установите вес 80 вместо 100:yc alb backend-group update-http-backend \ --backend-group-name canary-bg-production \ --name canary-backend-blue \ --weight 80
Результат:
done (1s) id: ds7l9puc18c9******** name: canary-bg-production folder_id: b1g9hv2loamq******** http: backends: - name: canary-backend-blue backend_weight: "80" storage_bucket: bucket: <имя_синего_бакета> created_at: "2021-11-03T10:28:47.680825561Z"
Подробнее о команде
yc alb backend-group update-http-backend
см. в справочнике CLI. -
Для бэкенда
canary-backend-green
установите вес 20 вместо 0:yc alb backend-group update-http-backend \ --backend-group-name canary-bg-production \ --name canary-backend-green \ --weight 20
Результат:
done (1s) id: ds7l9puc18c9******** name: canary-bg-production folder_id: b1g9hv2loamq******** http: backends: - name: canary-backend-green backend_weight: "20" storage_bucket: bucket: <имя_зеленого_бакета> created_at: "2021-11-03T10:28:47.680825561Z"
Используйте вызов gRPC API BackendGroupService/UpdateBackend или метод REST API updateBackend.
-
-
Несколько раз откройте в браузере адрес
https://cdn.yandexcloud.example/index.html
. Примерно в 20% случаев вы должны увидеть страницу с указанием на версию 2, в остальных случаях — на версию 1. -
Аналогично шагам 1–2 настройте и проверьте следующие распределения трафика между бэкендами:
- В группе бэкендов
canary-bg-production
— по 50% трафика на оба бэкенда. - В группе бэкендов
canary-bg-production
— весь трафик на бэкендcanary-backend-green
. - В группе бэкендов
canary-bg-staging
(доменное имяcdn-staging.yandexcloud.example
) — весь трафик на бэкендcanary-backend-blue
.
- В группе бэкендов
-
Снова включите кеширование:
Консоль управленияAPI- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Cloud CDN.
- Выберите созданный CDN-ресурс (в списке ресурсов будет указано его основное доменное имя —
cdn.yandexcloud.example
). - Перейдите на вкладку Кеширование.
- Нажмите кнопку Редактировать.
- Включите опцию Кеширование в CDN.
- Нажмите кнопку Сохранить.
- Получите идентификатор созданного CDN-ресурса с помощью вызова gRPC API ResourceService/List или метода REST API list.
- Включите кеширование с помощью вызова gRPC API ResourceService/Update или метода REST API list.
- В консоли управления
Сине-зеленое развертывание для отката к версии 1
-
Отключите кеширование CDN-ресурса и удалите из кеша файл
index.html
:Консоль управленияAPI- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Cloud CDN.
- Выберите созданный CDN-ресурс (в списке ресурсов будет указано его основное доменное имя —
cdn.yandexcloud.example
). - Перейдите на вкладку Кеширование.
- Нажмите кнопку Редактировать.
- Отключите опцию Кеширование в CDN.
- Нажмите кнопку Сохранить.
- Получите идентификатор созданного CDN-ресурса с помощью вызова gRPC API ResourceService/List или метода REST API list.
- Отключите кеширование с помощью вызова gRPC API ResourceService/Update или метода REST API list.
- В консоли управления
-
Удалите из кеша файл
index.html
:Консоль управленияYandex Cloud CLIAPI- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Cloud CDN.
- Выберите созданный CDN-ресурс (в списке ресурсов будет указано его основное доменное имя —
cdn.yandexcloud.example
). - Перейдите на вкладку Контент.
- Нажмите кнопку Очистить кеш.
- В поле Тип очистки выберите
Выборочная
. - Укажите путь к загруженному файлу:
/index.html
. - Нажмите кнопку Очистить кеш.
-
Получите идентификатор созданного CDN-ресурса:
yc cdn resource list
Результат:
+----------------------+--------------------------+--------------------------------+--------------------------------+--------+-------------------------------------------+ | ID | CNAME | CREATED AT | UPDATED AT | ACTIVE | OPTIONS | +----------------------+--------------------------+--------------------------------+--------------------------------+--------+-------------------------------------------+ | bc837xptmpkh******** | cdn.yandexcloud.example | seconds:1637235693 | seconds:1637235693 | true | edge_cache_settings:{enabled:true | | | | nanos:434085000 | nanos:434115000 | | default_value:345600} | | | | | | | cache_http_headers:{value:"accept-ranges" | | | | | | | value:"cache-control" value:"connection" | | | | | | | value:"content-encoding" | | | | | | | value:"content-length" | | | | | | | value:"content-type" | | | | | | | value:"date" value:"etag" | | | | | | | value:"expires" value:"keep-alive" | | | | | | | value:"last-modified" value:"server" | | | | | | | value:"vary"} stale:{enabled:true | | | | | | | value:"error" value:"updating"} | | | | | | | allowed_http_methods:{value:"GET" | | | | | | | value:"POST" value:"HEAD" | | | | | | | value:"OPTIONS"} | +----------------------+--------------------------+--------------------------------+--------------------------------+--------+-------------------------------------------+
-
Удалите файл из кеша:
yc cdn cache purge \ --resource-id <идентификатор_CDN-ресурса> \ --path "/index.html"
- Получите идентификатор созданного CDN-ресурса с помощью вызова gRPC API ResourceService/List или метода REST API list.
- Удалите файл
index.html
из кеша с помощью вызова gRPC API CacheService/Purge или метода purge.
- В консоли управления
-
Перенаправьте весь трафик доменного имени
cdn.yandexcloud.example
обратно на бэкендcanary-backend-blue
с версией 1:Консоль управленияYandex Cloud CLIAPI-
В консоли управления
выберите каталогexample-folder
. -
В списке сервисов выберите Application Load Balancer.
-
На панели слева выберите
Группы бэкендов. -
Выберите
canary-bg-production
. -
Для бэкенда
canary-backend-blue
установите вес 100 вместо 0:- В блоке Бэкенды найдите бэкенд
canary-backend-blue
, нажмите и выберите Редактировать. - В поле Вес укажите
100
. - Нажмите кнопку Сохранить.
- В блоке Бэкенды найдите бэкенд
-
Аналогично для бэкенда
canary-backend-green
установите вес 0 вместо 100. -
Нажмите кнопку Сохранить.
-
Для бэкенда
canary-backend-blue
установите вес 100 вместо 0:yc alb backend-group update-http-backend \ --backend-group-name canary-bg-production \ --name canary-backend-blue \ --weight 100
Результат:
done (1s) id: ds7l9puc18c9******** name: canary-bg-production folder_id: b1g9hv2loamq******** http: backends: - name: canary-backend-blue backend_weight: "100" storage_bucket: bucket: <имя_синего_бакета> created_at: "2021-11-03T10:28:47.680825561Z"
-
Для бэкенда
canary-backend-green
установите вес 0 вместо 100:yc alb backend-group update-http-backend \ --backend-group-name canary-bg-production \ --name canary-backend-green \ --weight 0
Результат:
done (1s) id: ds7l9puc18c9******** name: canary-bg-production folder_id: b1g9hv2loamq******** http: backends: - name: canary-backend-green backend_weight: "0" storage_bucket: bucket: <имя_зеленого_бакета> created_at: "2021-11-03T10:28:47.680825561Z"
Используйте вызов gRPC API BackendGroupService/UpdateBackend или метод REST API updateBackend.
-
-
Несколько раз откройте в браузере адрес
https://cdn.yandexcloud.example/index.html
. Во всех случаях вы должны увидеть страницу с указанием на версию 1. -
Аналогично шагам 1–2 переключите весь трафик доменного имени
cdn-staging.yandexcloud.example
на бэкендcanary-backend-green
с версией 2 и проверьте переключение в браузере. -
Снова включите кеширование:
Консоль управленияAPI- В консоли управления
выберите каталогexample-folder
. - В списке сервисов выберите Cloud CDN.
- Выберите созданный CDN-ресурс (в списке ресурсов будет указано его основное доменное имя —
cdn.yandexcloud.example
). - Перейдите на вкладку Кеширование.
- Нажмите кнопку Редактировать.
- Включите опцию Кеширование в CDN.
- Нажмите кнопку Сохранить.
- Получите идентификатор созданного CDN-ресурса с помощью вызова gRPC API ResourceService/List или метода REST API list.
- Включите кеширование с помощью вызова gRPC API ResourceService/Update или метода REST API list.
- В консоли управления
Как удалить созданные ресурсы
Чтобы остановить работу инфраструктуры и перестать платить за созданные ресурсы:
- Если вы настраивали CNAME-записи в Cloud DNS, удалите зону DNS
canary-dns-zone
. - Удалите CDN-ресурс с основным доменным именем
cdn.yandexcloud.example
. - Удалите L7-балансировщик
canary-balancer
. - Удалите все объекты из «синего» и «зеленого» бакетов.
- Удалите «синий» и «зеленый» бакеты.
- Удалите подсети
canary-subnet-ru-central1-a
,canary-subnet-ru-central1-b
иcanary-subnet-ru-central1-d
. - Удалите сеть
canary-network
.