Публикация обновлений для игр с помощью Yandex Cloud CDN
- Перед началом работы
- Добавьте сертификат в Certificate Manager
- Создайте бакеты в Object Storage
- Включите логирование бакета с файлами
- Загрузите файл в бакет
- Создайте CDN-ресурс и включите кеширование
- Настройте DNS для своего домена
- Предзагрузите контент в кеш CDN-серверов
- Проверьте работу CDN
- Как удалить созданные ресурсы
Создайте и настройте CDN-ресурс Cloud CDN для размещения в нем контента, к которому ожидается большое количество запросов в малый промежуток времени, например файлов для обновления игры (патчей, DLC
Предполагается, что патч состоит из одного файла с именем ycgame-update-v1.1.exe
. Он будет загружен в бакет Yandex Object Storage.
Примечание
Не рекомендуется предзагружать файлы размером меньше 200 МБ или больше 5 ГБ.
Чтобы создать CDN-инфраструктуру:
- Подготовьтесь к работе.
- Добавьте сертификат в Certificate Manager
- Создайте бакеты в Object Storage.
- Включите логирование бакета с файлами.
- Загрузите файл в бакет.
- Создайте CDN-ресурс и включите кеширование.
- Настройте DNS для своего домена.
- Предзагрузите контент в кеш CDN-серверов.
- Проверьте работу CDN.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Убедитесь, что у вас есть доменное имя и доступ к настройкам DNS на сайте компании, которая предоставляет вам услуги DNS-хостинга. Обычно это компания-регистратор вашего домена.
Необходимые платные ресурсы
В стоимость поддержки CDN-инфраструктуры входят:
- Плата за исходящий трафик с CDN-серверов (см. тарифы Cloud CDN).
- Плата за хранение данных в Object Storage, операции с ними и исходящий трафик (см. тарифы Object Storage).
- Плата за публичные DNS-запросы и DNS-зоны, если вы используете Yandex Cloud DNS (см. тарифы Cloud DNS).
Добавьте сертификат в Certificate Manager
Поддерживаются сертификаты из Yandex Certificate Manager. Вы можете выпустить новый сертификат Let's Encrypt® или загрузить собственный.
Сертификат должен находиться в том же каталоге, в котором расположен ваш CDN-ресурс.
Для сертификата Let's Encrypt® пройдите проверку прав на домен, который указан в сертификате.
Создайте бакеты в Object Storage
Необходимо создать два бакета: в первом будут храниться файлы, а во втором — логи запросов к первому.
- В консоли управления
выберите сервис Object Storage. - Создайте бакет для файлов:
- Нажмите кнопку Создать бакет.
- Укажите Имя бакета.
- В полях Доступ на чтение объектов и Доступ к списку объектов выберите
Публичный
. - Нажмите кнопку Создать бакет.
- Создайте бакет для логов:
- Нажмите кнопку Создать бакет.
- Укажите Имя бакета.
- Нажмите кнопку Создать бакет.
-
Создайте бакет для файлов:
aws --endpoint-url=https://storage.yandexcloud.net \ s3api create-bucket \ --bucket <имя_бакета_с_файлами> \ --acl public-read
Результат:
{ "Location": "/<имя_бакета_с_файлами>" }
-
Создайте бакет для логов:
aws --endpoint-url=https://storage.yandexcloud.net \ s3api create-bucket \ --bucket <имя_бакета_с_логами>
Результат:
{ "Location": "/<имя_бакета_с_логами>" }
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
Перед началом работы получите статические ключи доступа — секретный ключ и идентификатор ключа, используемые для аутентификации в Object Storage.
-
Опишите в конфигурационном файле параметры бакета:
access_key
— идентификатор статического ключа доступа.secret_key
— значение секретного ключа доступа.bucket
— имя создаваемого бакета.
Пример структуры конфигурационного файла:
provider "yandex" { token = "<OAuth-токен>" cloud_id = "<идентификатор_облака>" folder_id = "<идентификатор_каталога>" zone = "ru-central1-a" } resource "yandex_storage_bucket" "storage" { access_key = "<идентификатор_статического_ключа>" secret_key = "<секретный_ключ>" bucket = "<имя_бакета_с_файлами>" acl = "public-read" } resource "yandex_storage_bucket" "logs" { access_key = "<идентификатор_статического_ключа>" secret_key = "<секретный_ключ>" bucket = "<имя_бакета_с_логами>" }
-
Проверьте корректность конфигурационных файлов:
-
В командной строке перейдите в папку, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразятся параметры создаваемого бакета. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните бакет:
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание бакета.
-
Используйте метод API create.
Включите логирование бакета с файлами
Чтобы проверить, что при пользовательском запросе файл скачивается не напрямую из бакета, а из кеша CDN-сервера, нужно включить логирование бакета.
-
Создайте файл с настройками логирования в формате JSON. Например:
{ "LoggingEnabled": { "TargetBucket": "<имя_бакета_с_логами>", "TargetPrefix": "<префикс_ключа>" } }
Где:
TargetBucket
— имя целевого бакета, в который будут записываться логи.TargetPrefix
— префикс ключа для объектов с логами, напримерlogs/
.
-
Включите логирование в бакете:
aws s3api put-bucket-logging \ --bucket <имя_бакета_с_файлами> \ --endpoint-url https://storage.yandexcloud.net \ --bucket-logging-status file://<путь_к_файлу_настроек>
Где:
--bucket
— имя исходного бакета, для которого нужно включить логирование действий.--bucket-logging-status
— путь к файлу с настройками логирования.
Используйте метод API putBucketLogging для бакета с файлами. Тело HTTP-запроса:
<BucketLoggingStatus xmlns="http://doc.s3.amazonaws.com/2006-03-01">
<LoggingEnabled>
<TargetBucket>имя бакета с логами</TargetBucket>
<TargetPrefix>префикс ключа</TargetPrefix>
</LoggingEnabled>
</BucketLoggingStatus>
Где:
TargetBucket
— имя бакета, в который будут записываться логи.TargetPrefix
– префикс ключа для объектов с логами, напримерlogs/
.
Загрузите файл в бакет
- В консоли управления
выберите сервис Object Storage. - Выберите бакет с файлами.
- Нажмите кнопку Загрузить.
- В появившемся окне выберите файл с патчем
ycgame-update-v1.1.exe
и нажмите кнопку Открыть. - Нажмите кнопку Загрузить.
Выполните команду:
aws --endpoint-url=https://storage.yandexcloud.net \
s3 cp \
<путь_к_файлу_ycgame-update-v1.1.exe> \
s3://<имя_бакета_с_файлами>/ycgame-update-v1.1.exe
Результат:
upload: <путь_к_файлу_ycgame-update-v1.1.exe> to s3://<имя_бакета_с_файлами>/ycgame-update-v1.1.exe
-
Добавьте к конфигурационному файлу из шага с созданием бакетов параметры объекта, который необходимо загрузить:
bucket
— имя бакета для добавления объекта.key
— имя объекта в бакете:ycgame-update-v1.1.exe
. Обязательный параметр.source
— относительный или абсолютный путь к файлу, загружаемому как объект.
Пример структуры конфигурационного файла:
... resource "yandex_storage_object" "patch-v1-1" { access_key = "<идентификатор_статического_ключа>" secret_key = "<секретный_ключ>" bucket = "<имя_бакета_с_файлами>" key = "ycgame-update-v1.1.exe" source = "<путь_к_файлу>/ycgame-update-v1.1.exe" }
-
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в папку с конфигурационным файлом.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание объекта.
-
Используйте метод API upload.
Создайте CDN-ресурс и включите кеширование
-
В консоли управления
выберите сервис Cloud CDN. -
Если CDN-провайдер еще не активирован, нажмите кнопку Подключиться к провайдеру. Подключение произойдет автоматически.
Если кнопки Подключиться к провайдеру нет, и вам доступно создание ресурсов и групп источников, значит, провайдер уже активирован. Переходите к следующему шагу.
-
Создайте CDN-ресурс:
- На вкладке
CDN-ресурсы нажмите кнопку Создать ресурс. - Задайте основные параметры CDN-ресурса следующим образом:
-
Запрос контента —
Из одного источника
. -
Тип источника —
Бакет
. -
Бакет —
<имя_бакета_с_файлами>
. -
Доменные имена для раздачи контента — основное доменное имя, которое вы будете использовать для публикации патчей, например
cdn.ycprojectblue.example
.Внимание
Основное доменное имя для раздачи контента невозможно изменить после создания CDN-ресурса.
-
В блоке Дополнительно:
- В поле Протокол для источников выберите
HTTPS
. - В поле Переадресация клиентов выберите
Не использовать
. - Выберите опцию Доступ конечных пользователей к контенту.
- В поле Тип сертификата укажите
Сертификат из Certificate Manager
и выберите сертификат для доменного имениcdn.ycprojectblue.example
. - В поле Заголовок Host выберите
Свое значение
. В поле Значение заголовка укажите доменное имя источника,<имя_бакета_с_файлами>.storage.yandexcloud.net
, чтобы бакет-источник корректно отвечал на запросы CDN-серверов.
- В поле Протокол для источников выберите
-
- Нажмите кнопку Создать.
- На вкладке
-
Включите переадресацию клиентов с HTTP на HTTPS:
- На вкладке
CDN-ресурсы выберите ресурс, созданный ранее. - Убедитесь, что в блоке Дополнительно статус сертификата изменился на
Выпущен
. - Справа сверху нажмите кнопку
Редактировать. - В блоке Дополнительно в поле Переадресация клиентов выберите
С HTTP на HTTPS
. - Нажмите кнопку Сохранить.
- На вкладке
-
Включите для ресурса кеширование на CDN-серверах:
- На вкладке
CDN-ресурсы выберите ресурс, созданный ранее. - Перейдите в раздел Кеширование.
- Справа сверху нажмите кнопку
Редактировать. - Включите опцию Кеширование в CDN.
- Нажмите кнопку Сохранить.
- На вкладке
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Если CDN-провайдер еще не активирован, выполните команду:
yc cdn provider activate --folder-id <идентификатор_каталога> --type gcore
-
Создайте CDN-ресурс:
yc cdn resource create \ --cname cdn.ycprojectblue.example \ --origin-bucket-source <имя_бакета_с_файлами>.storage.yandexcloud.net \ --origin-bucket-name <имя_бакета_с_файлами> \ --origin-protocol https \ --cert-manager-ssl-cert-id <идентификатор_сертификата> \ --host-header <имя_бакета_с_файлами>.storage.yandexcloud.net
Результат:
id: bc8e3l7s4dha******** folder_id: b1g86q4m5vej******** cname: cdn.ycprojectblue.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 = "updates-origin-group" use_next = true origin { source = "<имя_бакета_с_файлами>.storage.yandexcloud.net" } } resource "yandex_cdn_resource" "my_resource" { cname = "cdn.ycprojectblue.example" active = true origin_protocol = "https" origin_group_id = yandex_cdn_origin_group.my_group.id options { custom_host_header = "<имя_бакета_с_файлами>.storage.yandexcloud.net" } ssl_certificate { type = "certificate_manager" certificate_manager_id = "<идентификатор_сертификата>" } }
Подробнее см. в описаниях ресурсов 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. Чтобы включить кеширование на CDN-серверах, добавьте в тело запроса поле edge_cache_settings
.
Настройте DNS для своего домена
-
Получите доменное имя в домене
.edgecdn.ru
, сгенерированное для созданного CDN-ресурса:Консоль управления- В консоли управления
выберите сервис Cloud CDN. - Выберите созданный CDN-ресурс (в списке ресурсов будет указано его основное доменное имя —
cdn.ycprojectblue.example
). - На вкладке Обзор в разделе Настройки DNS скопируйте в буфер обмена сгенерированное сервисом имя в домене
.edgecdn.ru
.
- В консоли управления
-
Перейдите в настройки DNS вашего домена на сайте компании, которая предоставляет вам услуги DNS-хостинга.
-
Измените CNAME-запись для
cdn
таким образом, чтобы она указывала на скопированный ранее адрес в домене.edgecdn.ru
, например:cdn CNAME cl-********.edgecdn.ru.
Примечание
Не используйте ресурсную запись ANAME с доменными именами для раздачи контента, поскольку в таком случае конечный пользователь получит ответ от CDN-сервера, не связанного с геолокацией пользователя. Ответ всегда будет одинаков для всех пользователей.
Если вы пользуетесь Cloud DNS, настройте запись по следующей инструкции:
Инструкция по настройке DNS-записей для Cloud DNS
Консоль управленияCLIAPI- В консоли управления
выберите сервис Cloud DNS. - Если у вас нет публичной зоны DNS, создайте ее:
- Нажмите кнопку Создать зону.
- Укажите Имя зоны:
cdn-dns-a
. - В поле Зона укажите ваш домен с точкой в конце:
ycprojectblue.example.
- Выберите Тип зоны —
Публичная
. - Нажмите кнопку Создать.
- Создайте запись в зоне:
- В списке зон нажмите на зону
cdn-dns-a
. - Нажмите кнопку Создать запись.
- В поле Имя укажите
cdn
, чтобы запись соответствовала доменному имениcdn.ycprojectblue.example
. - Выберите Тип записи —
CNAME
. - В поле Значение вставьте скопированный адрес в домене
.edgecdn.ru
с точкой на конце. - Нажмите кнопку Создать.
- В списке зон нажмите на зону
-
Если у вас нет публичной зоны DNS, создайте ее:
yc dns zone create --name cdn-dns-a --zone ycprojectblue.example. --public-visibility
Где:
--name
— имя зоны.--zone
— доменная зона — ваш домен с точкой на конце.--public-visibility
— опция публичной видимости зоны.
Результат:
id: aetuvdw77q61******** folder_id: aoewzf73jwdl******** created_at: "2021-09-28T10:33:31.917Z" name: cdn-zone-a zone: ycprojectblue.example. public_visibility: {}
-
Создайте запись в зоне:
yc dns zone add-records --name cdn-dns-a --record "cdn CNAME cl-********.edgecdn.ru."
Где:
--name
— имя зоны.--record
— ресурсная запись.
-
Проверьте, что запись создана:
yc dns zone list-records --name cdn-dns-a
Результат:
+----------------------------+------+-------+------------------------------+ | NAME | TTL | TYPE | DATA | +----------------------------+------+-------+------------------------------+ | ycprojectblue.example. | 3600 | NS | ns1.yandexcloud.net. | | | | | ns2.yandexcloud.net. | | ycprojectblue.example. | 3600 | SOA | ns1.yandexcloud.net. | | | | | mx.cloud.yandex.net. 1 10800 | | | | | 900 604800 86400 | | cdn.ycprojectblue.example. | 600 | CNAME | cl-********.edgecdn.ru. | +----------------------------+------+-------+------------------------------+
В списке должна быть запись с именем
cdn.ycprojectblue.example.
- Если у вас нет публичной зоны DNS, создайте ее с помощью вызова gRPC API DnsZoneService/Create или метода REST API create. Чтобы сделать зону публичной, добавьте в тело запроса поле
public_visibility
(gRPC) илиpublicVisibility
(REST). - Создайте в зоне запись
cdn CNAME cl-********.edgecdn.ru.
с помощью вызова gRPC API DnsZoneService/UpdateRecordSets или метода REST API updateRecordSets.
- В консоли управления
Предзагрузите контент в кеш CDN-серверов
-
В консоли управления
выберите сервис Cloud CDN. -
Выберите созданный CDN-ресурс (в списке ресурсов будет указано его основное доменное имя —
cdn.ycprojectblue.example
). -
Перейдите на вкладку Контент.
-
Нажмите
→ Предзагрузить контент. -
В поле Пути к файлам укажите путь к файлу, хранящемуся в источнике, без доменного имени:
/ycgame-update-v1.1.exe
-
Нажмите кнопку Предзагрузить контент.
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
Укажите путь к файлу, который нужно предзагрузить:
yc cdn cache prefetch --resource-id <идентификатор_ресурса> \
--path /ycgame-update-v1.1.exe
Подробнее о команде yc cdn cache prefetch
см. в справочнике CLI.
Используйте вызов gRPC API CacheService/Prefetch или метод REST API prefetch.
Проверьте работу CDN
-
Дождитесь обновления DNS-записей (на это может потребоваться несколько часов) и предзагрузки файла на CDN-серверы.
-
Скачайте файл по новому URL:
https://cdn.ycprojectblue.example/ycgame-update-v1.1.exe
-
Получите логи запросов к бакету с файлами:
Консоль управленияAWS CLIAPI- В консоли управления
выберите сервис Object Storage. - Выберите бакет с логами.
- Нажмите на имя объекта, соответствующего времени скачивания файла
ycgame-update-v1.1.exe
. - Нажмите
→ Скачать.
-
Получите список объектов с логами:
aws --endpoint-url=https://storage.yandexcloud.net \ s3 ls s3://<имя_бакета_с_логами>
Результат:
2021-10-01 08:37:53 10 2021-10-01-08-37-53-631E0FC3B732AEDD 2021-10-01 09:38:05 62 2021-10-01-09-38-05-436E6CDC832A20EF 2021-10-01 10:38:01 23 2021-10-01-10-38-01-7F65EF1A6366FB18 2021-10-01 11:37:57 41 2021-10-01-11-37-57-6F31613427A7DB9A 2021-10-01 12:38:02 58 2021-10-01-12-38-02-AB893E6148AFDC55 2021-10-01 13:38:02 73 2021-10-01-13-38-02-E69EAEC1C9083756
-
Найдите в полученном списке объект с логом, сохраненным после скачивания файла
ycgame-update-v1.1.exe
, и скачайте его:aws --endpoint-url=https://storage.yandexcloud.net \ s3 cp s3://<имя_бакета_с_логами>/2021-10-01-13-38-02-E69EAEC1C9083756 \ 2021-10-01-13-38-02-E69EAEC1C9083756
Результат:
download: s3://<имя_бакета_с_логами>/2021-10-01-13-38-02-E69EAEC1C9083756 to 2021-10-01-13-38-02-E69EAEC1C9083756
- Получите список объектов в бакете с логами с помощью метода API listObjects.
- Найдите в полученном списке объект с логом, сохраненным после скачивания файла
ycgame-update-v1.1.exe
, и скачайте его с помощью метода API get.
- В консоли управления
-
По логам запросов к бакету-источнику убедитесь, что CDN-серверы не скачивали файл из источника после вашего запроса. Подробнее о содержимом логов см. в разделе Формат объекта с логами документации Object Storage.
Как удалить созданные ресурсы
Чтобы остановить работу CDN-ресурса и перестать платить за созданные ресурсы: