Публикация обновлений для игр с помощью 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 = "kz1-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-ресурса:
-
В блоке Контент:
-
Включите Доступ к контенту.
-
В поле Запрос контента выберите
Из одного источника. -
В поле Тип источника выберите
Бакет. -
В поле Бакет выберите
<имя_бакета_с_файлами>. -
В поле Протокол для источников выберите
HTTPS. -
В поле Доменное имя укажите основное доменное имя, которое вы будете использовать для публикации патчей, например
cdn.ycprojectblue.example.Внимание
Основное доменное имя для раздачи контента невозможно изменить после создания CDN-ресурса.
-
-
В блоке Дополнительно:
- В поле Переадресация клиентов выберите
С HTTP на HTTPS. - В поле Тип сертификата укажите
Сертификат из Certificate Managerи выберите сертификат для доменного имениcdn.ycprojectblue.example. - В поле Заголовок Host выберите
Свое значение. В поле Значение заголовка укажите доменное имя источника,<имя_бакета_с_файлами>.storage.yandexcloud.net, чтобы бакет-источник корректно отвечал на запросы CDN-серверов.
- В поле Переадресация клиентов выберите
-
-
Нажмите Продолжить.
-
В разделе Кеширование в блоке CDN включите опцию Кеширование в CDN.
-
Нажмите Продолжить.
-
В разделах HTTP-заголовки и методы и Дополнительно оставьте настройки по умолчанию и нажмите Продолжить.
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.
-
Создайте 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 для своего домена
-
Получите доменное имя, сгенерированное для созданного CDN-ресурса:
Консоль управления- В консоли управления
выберите сервис Cloud CDN. - Выберите созданный CDN-ресурс (в списке ресурсов будет указано его основное доменное имя —
cdn.ycprojectblue.example). - На вкладке Обзор в разделе Настройки DNS скопируйте в буфер обмена сгенерированное сервисом доменное имя вида
328938ed********.a.yccdn.cloud.yandex.netилиcl-msa87*****.edgecdn.ruв зависимости от используемого провайдера CDN.
- В консоли управления
-
Перейдите в настройки DNS вашего домена на сайте компании, которая предоставляет вам услуги DNS-хостинга.
-
Измените CNAME-запись для
cdnтаким образом, чтобы она указывала на скопированный ранее адрес в домене.yccdn.cloud.yandex.netили.edgecdn.ru, например:cdn CNAME 328938ed********.a.yccdn.cloud.yandex.net.Примечание
Не используйте ресурсную запись ANAME с доменными именами для раздачи контента, поскольку в таком случае конечный пользователь получит ответ от CDN-сервера, не связанного с геолокацией пользователя. Ответ всегда будет одинаков для всех пользователей.
Если вы пользуетесь Cloud DNS, настройте запись по следующей инструкции:
Инструкция по настройке DNS-записей для Cloud DNS
Консоль управленияCLIAPI- В консоли управления
выберите сервис Cloud DNS. - Если у вас нет публичной зоны DNS, создайте ее:
- Нажмите кнопку Создать зону.
- Укажите Имя зоны:
cdn-dns-a. - В поле Зона укажите ваш домен с точкой в конце:
ycprojectblue.example. - Выберите Тип зоны —
Публичная. - Нажмите кнопку Создать.
- Создайте запись в зоне:
- В списке зон нажмите на зону
cdn-dns-a. - Нажмите кнопку Создать запись.
- В поле Имя укажите
cdn, чтобы запись соответствовала доменному имениcdn.ycprojectblue.example. - Выберите Тип записи —
CNAME. - В поле Значение вставьте скопированный адрес в домене
.yccdn.cloud.yandex.netили.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 328938ed********.a.yccdn.cloud.yandex.net."Где:
--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 | 328938ed********.a.yccdn.cloud.yandex.net. | +----------------------------+------+-------+--------------------------------------------+В списке должна быть запись с именем
cdn.ycprojectblue.example.
- Если у вас нет публичной зоны DNS, создайте ее с помощью вызова gRPC API DnsZoneService/Create или метода REST API create. Чтобы сделать зону публичной, добавьте в тело запроса поле
public_visibility(gRPC) илиpublicVisibility(REST). - Создайте в зоне запись
cdn CNAME 328938ed********.a.yccdn.cloud.yandex.net.с помощью вызова gRPC API DnsZoneService/UpdateRecordSets или метода REST API updateRecordSets.
- В консоли управления
Предзагрузите контент в кеш CDN-серверов
-
В консоли управления
выберите сервис Cloud CDN. -
Выберите созданный CDN-ресурс (в списке ресурсов будет указано его основное доменное имя —
cdn.ycprojectblue.example). -
Перейдите на вкладку Контент.
-
Нажмите
→ Предзагрузить контент. -
В поле Пути к файлам укажите путь к файлу, хранящемуся в источнике, без доменного имени:
/ycgame-update-v1.1.exe -
Нажмите кнопку Предзагрузить контент.
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --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-ресурса и перестать платить за созданные ресурсы: