Создание интерактивного serverless-приложения с использованием WebSocket
- Перед началом работы
- Подготовьте окружение
- Создайте базы данных Managed Service for YDB
- Создайте поток данных Data Streams
- Создайте секрет Yandex Lockbox
- Разверните проект
- Создайте ключи доступа для сервисных аккаунтов
- Создайте новую версию секрета и разверните проект еще раз
- Создайте API-шлюз API Gateway
- Подключите домен к Telegram-боту
- Протестируйте приложение
- Как удалить созданные ресурсы
В этом руководстве вы развернете онлайн-игру, реализованную на Node.js с использованием WebSocket.
Статические ресурсы игры будут храниться в бакете Object Storage, данные игры — в базах данных Managed Service for YDB. Данные будут передаваться в потоке Data Streams и обрабатываться функциями Cloud Functions. Для передачи сообщений между компонентами приложения используется очередь Message Queue. Секреты безопасно доставляются в приложение с помощью сервиса Yandex Lockbox. API-шлюз API Gateway будет принимать запросы от пользователей и перенаправлять их в функции Cloud Functions.
Для авторизации пользователей игры используется интеграция с Telegram.
Чтобы создать онлайн-игру:
- Подготовьте окружение.
- Создайте базы данных Yandex Managed Service for YDB.
- Создайте поток данных Yandex Data Streams.
- Создайте секрет Yandex Lockbox.
- Разверните проект.
- Создайте ключи доступа для сервисных аккаунтов.
- Создайте новую версию секрета и разверните проект еще раз.
- Создайте API-шлюз Yandex API Gateway.
- Подключите домен к Telegram-боту.
- Протестируйте приложение.
Если созданные ресурсы больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры для данного руководства входят:
- плата за операции с данными и за объем хранимых данных (см. тарифы Yandex Managed Service for YDB);
- плата за использование потока данных (см. тарифы Yandex Data Streams);
- плата за хранение секрета (см. тарифы Yandex Lockbox);
- плата за хранение данных и операции с данными (см. тарифы Yandex Object Storage);
- плата за запросы к созданным API-шлюзам и исходящий трафик (см. тарифы Yandex API Gateway);
- плата за запросы к очередям и исходящий трафик (см. тарифы Yandex Message Queue);
- плата за вызовы функций и вычислительные ресурсы, выделенные для выполнения функций (см. тарифы Yandex Cloud Functions).
Подготовьте окружение
- Установите утилиту WSL
для использования окружения Linux. - Запустите подсистему Linux (по умолчанию — Ubuntu).
- Далее настройте окружение так, как описано в этой инструкции для операционной системы Linux.
Примечание
Если вы используете дистрибутив, отличный от Ubuntu, установите указанные утилиты с помощью команд вашего пакетного менеджера.
-
Последовательно установите следующие утилиты с помощью команд в терминале:
-
WebStorm
или IntelliJ IDEA Community Edition .sudo snap install webstorm --classic -
sudo apt-get install curl git -y -
Утилиту jq
:sudo apt-get install jq -
curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash exec -l $SHELL yc version -
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" --output "AWSCLIV2.pkg" sudo installer -pkg AWSCLIV2.pkg -target / -
curl --silent --show-error --location https://storage.yandexcloud.net/yandexcloud-ydb/install.sh | bash -
Node.js
версии16.16.0:sudo apt-get install curl curl --silent --location https://deb.nodesource.com/setup_16.x | sudo -E bash sudo apt-get install nodejs node -v npm -v -
sudo npm install -g typescript
-
-
Создайте профиль Yandex Cloud CLI с базовыми параметрами.
-
Последовательно установите следующие утилиты с помощью команд в терминале:
-
/bin/bash -c "$(curl --fail --silent --show-error --location https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -
WebStorm
или IntelliJ IDEA Community Edition .brew install --cask webstorm -
brew install curl git -
Утилиту jq
:brew install jq -
curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash exec -l $SHELL yc version -
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" --output "AWSCLIV2.pkg" sudo installer -pkg AWSCLIV2.pkg -target / -
curl --silent --show-error --location https://storage.yandexcloud.net/yandexcloud-ydb/install.sh | bash -
Node.js
версии16.16.0:brew install node@16 brew install nvm node -v npm -vЕсли вы используете zsh, выполните:
echo 'export NVM_DIR=~/.nvm' >> ~/.zshrc echo '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' >> ~/.zshrc source ~/.zshrc -
npm install -g typescript
-
-
Создайте профиль Yandex Cloud CLI с базовыми параметрами.
Скачайте проект
Клонируйте репозиторийyc-serverless-game:
git clone https://github.com/yandex-cloud-examples/yc-serverless-game.git
Зарегистрируйте Telegram-бота
Зарегистрируйте вашего бота в Telegram и получите токен.
-
Чтобы зарегистрировать нового бота, запустите бота BotFather
и отправьте команду:/newbot -
В поле
nameукажите имя создаваемого бота, напримерServerless Game With WebSockets. Это имя увидят пользователи при общении с ботом. -
В поле
usernameукажите имя пользователя для создаваемого бота, напримерServerlessGameWithWebSocketsBot. По имени пользователя можно будет найти бота в Telegram. Имя пользователя должно оканчиваться на...Botили..._bot. -
В ответном сообщении вы получите адрес
t.me/ServerlessGameWithWebSocketsBotи токен. -
Сохраните имя пользователя в переменную
TG_BOT_LOGIN:echo "export TG_BOT_LOGIN=<имя_пользователя_для_бота>" >> ~/.bashrc && . ~/.bashrc echo $TG_BOT_LOGIN -
Сохраните токен в переменную
TG_BOT_TOKEN:echo "export TG_BOT_TOKEN=<токен>" >> ~/.bashrc && . ~/.bashrc echo $TG_BOT_TOKEN
Получите токен доступа
Получите IAM-токен и сохраните его в переменную YC_IAM_TOKEN:
echo "export YC_IAM_TOKEN=$(yc iam create-token)" >> ~/.bashrc && . ~/.bashrc
echo $YC_IAM_TOKEN
Получите OAUTH-токен и сохраните его в переменную OAUTH_TOKEN:
echo "export OAUTH_TOKEN=$(yc config get token)" >> ~/.bashrc && . ~/.bashrc
echo $OAUTH_TOKEN
Создайте сервисный аккаунт
-
Создайте сервисный аккаунт с именем
sls-deployи сохраните его имя в переменнуюSERVICE_ACCOUNT_GAME:export SERVICE_ACCOUNT_GAME=$(yc iam service-account create --name sls-deploy \ --description "service account for serverless game" \ --format json | jq -r .) echo $SERVICE_ACCOUNT_GAME -
В выводе команды, в строке
id, будет указан идентификатор сервисного аккаунта. Сохраните его в переменнуюSERVICE_ACCOUNT_GAME_ID:echo "export SERVICE_ACCOUNT_GAME_ID=<идентификатор_сервисного_аккаунта>" >> ~/.bashrc && . ~/.bashrc -
Назначьте сервисному аккаунту роль
editor:echo "export YC_FOLDER_ID=$(yc config get folder-id)" >> ~/.bashrc && . ~/.bashrc echo $YC_FOLDER_ID echo "export YC_CLOUD_ID=$(yc config get cloud-id)" >> ~/.bashrc && . ~/.bashrc echo $YC_CLOUD_ID yc resource-manager folder add-access-binding $YC_FOLDER_ID \ --subject serviceAccount:$SERVICE_ACCOUNT_GAME_ID \ --role editor -
Создайте авторизованный ключ для сервисного аккаунта:
yc iam key create \ --service-account-name sls-deploy \ --output sls-deploy.sa echo "export SA_KEY_FILE=$PWD/sls-deploy.sa" >> ~/.bashrc && . ~/.bashrc echo $SA_KEY_FILE -
Создайте статический ключ доступа для сервисного аккаунта:
yc iam access-key create --service-account-id $SERVICE_ACCOUNT_GAME_IDРезультат:
access_key: id: ajeibet3219******** service_account_id: ajehr1tv2eo1******** created_at: "2023-03-13T10:20:58.471421425Z" key_id: YCAS33CT2mPCVFh3K******** secret: YCNhBcdvfDdssIuBa-FDl6zZz0MSky******** -
Сохраните идентификатор ключа
key_idв переменнуюAWS_ACCESS_KEY_IDи секретный ключsecret— в переменнуюAWS_SECRET_ACCESS_KEY:echo "export AWS_ACCESS_KEY_ID=<идентификатор_ключа>" >> ~/.bashrc && . ~/.bashrc echo $AWS_ACCESS_KEY_ID echo "export AWS_SECRET_ACCESS_KEY=<секретный_ключ>" >> ~/.bashrc && . ~/.bashrc echo $AWS_SECRET_ACCESS_KEY -
Настройте AWS CLI:
aws configureВведите следующие параметры:
AWS Access Key ID— идентификатор ключа доступаkey_idсервисного аккаунта, полученный ранее.AWS Secret Access Key— секретный ключsecretсервисного аккаунта, полученный ранее.Default region name— используйте значениеru-central1.Default output format— оставьте пустым.
-
Проверьте конфигурацию:
echo $AWS_ACCESS_KEY_ID echo $AWS_SECRET_ACCESS_KEY aws configure list
Создайте базы данных Managed Service for YDB
Создайте базу данных с именем game-data для хранения данных игры и базу данных с именем data-streams для потока Data Streams.
-
Создайте базу данных в режиме serverless с именем
game-data:yc ydb database create game-data --serverlessРезультат:
done (8s) id: etn0ejcvmjm4******** folder_id: b1geoelk7fld******** created_at: "2023-03-30T15:01:19Z" name: game-data status: PROVISIONING endpoint: grpcs://ydb.serverless.yandexcloud.net:2135/?database=/ru-central1/b1gia87mbaom********/etn0ejcvmjm4******** serverless_database: storage_size_limit: "53687091200" location_id: ru-central1 ... -
Сохраните в переменной
YDB_ENDPOINTзначениеendpointиз вывода предыдущей команды. В нашем примере оно равняетсяgrpcs://ydb.serverless.yandexcloud.net:2135.echo "export YDB_ENDPOINT=<эндпоинт_Document_API_БД>" >> ~/.bashrc && . ~/.bashrc echo $YDB_ENDPOINT -
Сохраните в переменной
YDB_DATABASEзначениеdatabaseиз вывода предыдущей команды. В нашем примере оно равняется/ru-central1/b1gia87mbaom********/etn0ejcvmjm4********.echo "export YDB_DATABASE=<имя_таблицы>" >> ~/.bashrc && . ~/.bashrc echo $YDB_DATABASE -
Создайте базу данных в режиме serverless с именем
data-streams:yc ydb database create data-streams --serverlessРезультат:
done (7s) id: etn16k0e1757******** folder_id: b1geoelk7fld******** created_at: "2023-03-30T15:02:44Z" name: data-streams status: PROVISIONING endpoint: grpcs://ydb.serverless.yandexcloud.net:2135/?database=/ru-central1/b1gia87mbaom********/etn16k0e1757******** serverless_database: storage_size_limit: "53687091200" location_id: ru-central1 -
Сохраните в переменной
YDB_DATA_STREAMS_ENDPOINTзначениеendpointиз вывода предыдущей команды. В нашем примере оно равняетсяgrpcs://ydb.serverless.yandexcloud.net:2135.echo "export YDB_DATA_STREAMS_ENDPOINT=<эндпоинт_Document_API_БД>" >> ~/.bashrc && . ~/.bashrc echo $YDB_DATA_STREAMS_ENDPOINT -
Сохраните в переменной
YDB_DATA_STREAMS_DATABASEзначениеdatabaseиз вывода предыдущей команды. В нашем примере оно равняется/ru-central1/b1gia87mbaom********/etn16k0e1757********.echo "export YDB_DATA_STREAMS_DATABASE=<имя_таблицы>" >> ~/.bashrc && . ~/.bashrc echo $YDB_DATA_STREAMS_DATABASE -
Проверьте, что все сделано верно:
ydb \ --endpoint $YDB_ENDPOINT \ --database $YDB_DATABASE \ --sa-key-file $SA_KEY_FILE \ discovery whoami \ --groupsРезультат:
User SID: ajeien4d11sc043******** Group SIDs: all-users@well-known
Создайте таблицу
-
Перейдите в папку
filesвнутри каталогаyc-serverless-game. -
Создайте таблицу, используя файл
db-example.sql:ydb \ --endpoint $YDB_ENDPOINT \ --database $YDB_DATABASE \ --sa-key-file $SA_KEY_FILE \ scripting yql --file db-example.sql -
Добавьте запись для начальной конфигурации:
ydb \ --endpoint $YDB_ENDPOINT \ --database $YDB_DATABASE \ --sa-key-file $SA_KEY_FILE \ scripting yql --file db-update.sql -
Проверьте результат выполнения:
ydb \ --endpoint $YDB_ENDPOINT \ --database $YDB_DATABASE \ --sa-key-file $SA_KEY_FILE \ scheme describe ConfigРезультат:
Columns: ┌────────────────────┬─────────┬────────┬─────┐ | Name | Type | Family | Key | ├────────────────────┼─────────┼────────┼─────┤ | name | Utf8? | | K0 | | grid_cell_size | Uint32? | | | | max_active_players | Uint8? | | | | max_inactive_sec | Int32? | | | | player_size | Uint32? | | | | transport | Utf8? | | | | world_size_x | Uint32? | | | | world_size_y | Uint32? | | | └────────────────────┴─────────┴────────┴─────┘ Storage settings: Store large values in "external blobs": false Column families: ┌─────────┬──────┬─────────────┬────────────────┐ | Name | Data | Compression | Keep in memory | ├─────────┼──────┼─────────────┼────────────────┤ | default | | None | | └─────────┴──────┴─────────────┴────────────────┘ Auto partitioning settings: Partitioning by size: true Partitioning by load: false Preferred partition size (Mb): 2048 Min partitions count: 1
Создайте поток данных Data Streams
echo $YDB_DATA_STREAMS_DATABASE
aws kinesis create-stream \
--endpoint https://yds.serverless.yandexcloud.net \
--stream-name $YDB_DATA_STREAMS_DATABASE/notify-state-change \
--shard-count 1
Создайте секрет Yandex Lockbox
-
Создайте секрет с именем
game-secretsи передайте в него значения переменныхYDB_ENDPOINTиYDB_DATABASE:yc lockbox secret create --name game-secrets \ --description "The secrets for the serverless game" \ --payload "[{'key': 'ydb_endpoint', 'text_value': $YDB_ENDPOINT},{'key': 'ydb_db', 'text_value': $YDB_DATABASE}]" -
Сохраните идентификатор созданного секрета в переменную
LOCKBOX_SECRET_ID:echo "export LOCKBOX_SECRET_ID=$(jq -r <<< \ "$(yc lockbox secret list --format json | jq '.[]' -c | grep game-secrets)" .id)" \ >> ~/.bashrc && . ~/.bashrc echo $LOCKBOX_SECRET_ID -
Передайте в секрет значение переменной
TG_BOT_TOKEN:yc lockbox secret add-version --id $LOCKBOX_SECRET_ID \ --payload "[{'key': 'tg_bot_token', 'text_value': '$TG_BOT_TOKEN'}]" -
Передайте в секрет ключи, значения которых мы получим позже. Пока задайте им значения, равными
null.yc lockbox secret add-version --id $LOCKBOX_SECRET_ID \ --payload "[{'key': 'ymq_writer_key_id', 'text_value': 'null'},\ {'key': 'ymq_writer_key_secret', 'text_value': 'null'},\ {'key': 'ymq_capture_queue_url', 'text_value': 'null'},\ {'key': 'yds_writer_key_id', 'text_value': 'null'},\ {'key': 'yds_writer_key_secret', 'text_value': 'null'},\ {'key': 'yds_state_change_stream', 'text_value': 'notify-state-change'},\ {'key': 'yds_state_change_database', 'text_value': '$YDB_DATA_STREAMS_DATABASE'}]"
Разверните проект
-
Перейдите в папку
filesвнутри каталогаyc-serverless-game. -
Измените конфигурацию для Object Storage. Так как имя бакета должно быть уникальным, замените имя бакета на собственное в следующих файлах:
-
файл
serverless.yaml:sls-game-files: type: yc::ObjectStorageBucket -
файл
upload-to-s3.tsвнутри папкиscripts:Bucket: 'sls-game-files',Например, вместо
sls-game-filesукажитеsls-game-files-example.
-
-
Задайте переменную
APP_ENVдля сборки проекта:echo "export APP_ENV=production" >> ~/.bashrc && . ~/.bashrc echo $APP_ENV -
Соберите и разверните проект. В корне каталога
yc-serverless-gameпоследовательно выполните следующие команды:nvm use nvm install npm ci npm run build npm run deploy
При развертывании проекта в вашем рабочем каталоге будут созданы следующие ресурсы:
-
Функции Cloud Functions:
get-stateget-configmovecapturestate-changeloginauthws-connectws-messagews-disconnect
-
Сервисные аккаунты:
functions-saс рольюeditortriggers-saс рольюserverless.functions.invokeryds-reader-saс рольюyds.adminyds-writer-saс рольюyds.writerymq-reader-saс рольюymq.readerymq-writer-saс рольюymq.writerapigw-s3-viewerс рольюstorage.viewerapigw-fn-callerс рольюserverless.functions.invoker
-
Бакет Object Storage с именем, которое вы указали в файле
serverless.yaml -
Очередь Message Queue —
capturing-queue
Создайте ключи доступа для сервисных аккаунтов
При развертывании проекта создались следующие сервисные аккаунты:
yds-writer-saс рольюyds.writerдля записи в поток Data Streams;ymq-writer-saс рольюymq.writerдля записи в очередь Message Queue.
-
Создайте статический ключ доступа для сервисного аккаунта
yds-writer-sa:echo "export YDS_WRITER_SA_ID=$(jq -r <<< \ "$(yc iam service-account list --format json | jq '.[]' -c | grep yds-writer-sa)" .id)" \ >> ~/.bashrc && . ~/.bashrc yc iam access-key create --service-account-id $YDS_WRITER_SA_IDРезультат:
access_key: id: ajeibet32197******** service_account_id: ajehr6tv2eoo******** created_at: "2023-03-13T10:20:58.471421425Z" key_id: YCASD3CT9mPCVFh3K******** secret: YCNhBcdvfDdssIuBa-FDl6zZz0MSky******** -
Скопируйте значение идентификатора ключа
key_idи сохраните в переменнуюYDS_WRITER_KEY_ID:echo "export YDS_WRITER_KEY_ID=<идентификатора_ключа>" >> ~/.bashrc && . ~/.bashrc echo $YDS_WRITER_KEY_ID -
Скопируйте значение секрета
secretи сохраните в переменнуюYDS_WRITER_KEY_SECRET:echo "export YDS_WRITER_KEY_SECRET=<секрет>" >> ~/.bashrc && . ~/.bashrc echo $YDS_WRITER_KEY_SECRET -
Создайте статический ключ доступа для сервисного аккаунта
ymq-writer-sa:echo "export YMQ_WRITER_SA_ID=$(jq -r <<< \ "$(yc iam service-account list --format json | jq '.[]' -c | grep ymq-writer-sa)" .id)" \ >> ~/.bashrc && . ~/.bashrc yc iam access-key create --service-account-id $YMQ_WRITER_SA_ID -
Скопируйте идентификатора ключа
key_idи сохраните в переменнуюYMQ_WRITER_KEY_ID:echo "export YMQ_WRITER_KEY_ID=<идентификатор_ключа>" >> ~/.bashrc && . ~/.bashrc echo $YMQ_WRITER_KEY_ID -
Скопируйте значение секрета
secretи сохраните в переменнуюYMQ_WRITER_KEY_SECRET:echo "export YMQ_WRITER_KEY_SECRET=<секрет>" >> ~/.bashrc && . ~/.bashrc echo $YMQ_WRITER_KEY_SECRET
Создайте новую версию секрета и разверните проект еще раз
-
Передайте новые значения в секрет
game-secrets:-
В консоли управления
выберите ваш рабочий каталог. -
Выберите сервис Message Queue.
-
Выберите очередь
capturing-queue. -
Скопируйте значение из поля URL и сохраните его в переменную
YMQ_CAPTURE_QUEUE_URL:echo "export YMQ_CAPTURE_QUEUE_URL=<URL>" >> ~/.bashrc && . ~/.bashrc -
Проверьте значения переменных, которые нужно будет передать в секрет:
echo $LOCKBOX_SECRET_ID echo $YMQ_WRITER_KEY_ID echo $YMQ_WRITER_KEY_SECRET echo $YDS_WRITER_KEY_ID echo $YDS_WRITER_KEY_SECRET echo $YMQ_CAPTURE_QUEUE_URL -
Передайте значения в секрет:
yc lockbox secret add-version --id $LOCKBOX_SECRET_ID \ --payload "[{'key': 'ymq_writer_key_id', 'text_value': '$YMQ_WRITER_KEY_ID'},\ {'key': 'ymq_writer_key_secret', 'text_value': '$YMQ_WRITER_KEY_SECRET'},\ {'key': 'ymq_capture_queue_url', 'text_value': '$YMQ_CAPTURE_QUEUE_URL'},\ {'key': 'yds_writer_key_id', 'text_value': '$YDS_WRITER_KEY_ID'},\ {'key': 'yds_writer_key_secret', 'text_value': '$YDS_WRITER_KEY_SECRET'}]"
-
-
Перейдите в корень каталога
yc-serverless-gameи еще раз разверните проект:npm run deploy
Создайте API-шлюз API Gateway
При развертывании проекта создались следующие сервисные аккаунты:
apigw-s3-viewerс рольюstorage.viewerдля чтения объектов из бакета Object Storage.apigw-fn-callerс рольюfunctions.functionInvokerдля вызова функций Cloud Functions.
-
Сохраните идентификаторы сервисных аккаунтов
apigw-s3-viewerиapigw-fn-callerв переменныеAPIGW_S3_VIEWER_IDиAPIGW_FN_CALLER_ID:echo "export APIGW_S3_VIEWER_ID=$(jq -r <<< \ "$(yc iam service-account list --format json | jq '.[]' -c | grep apigw-s3-viewer)" .id)" \ >> ~/.bashrc && . ~/.bashrc echo "export APIGW_FN_CALLER_ID=$(jq -r <<< \ "$(yc iam service-account list --format json | jq '.[]' -c | grep apigw-fn-caller)" .id)" \ >> ~/.bashrc && . ~/.bashrc -
Внесите изменения в спецификацию API-шлюза. Перейдите в папку
filesвнутри каталогаyc-serverless-gameи выполните команду:cp apigw-example.yml apigw.yml -
Получите идентификаторы ресурсов, созданных ранее:
echo $APIGW_S3_VIEWER_ID echo $APIGW_FN_CALLER_ID yc storage bucket list yc serverless function list -
Внесите в файл
apigw.ymlследующие изменения:- Во всех строках
bucket: serverless-game-filesзамените название бакета на ваше. - Во всех строках
service_account_id: <sa-id-for-object-storage>замените<sa-id-for-object-storage>на значение переменной$APIGW_S3_VIEWER_ID. - Во всех строках
service_account_id: <sa-id-for-functions>замените<sa-id-for-functions>на значение переменной$APIGW_FN_CALLER_ID. - В строке
58замените<yandex-cloud-nodejs-dev-get-state-function-id>на значение идентификатора функцииyandex-cloud-nodejs-dev-get-state. - В строке
65замените<yandex-cloud-nodejs-dev-get-config-function-id>на значение идентификатора функцииyandex-cloud-nodejs-dev-get-config. - В строке
72замените<yandex-cloud-nodejs-dev-move-function-id>на значение идентификатора функцииyandex-cloud-nodejs-dev-move. - В строке
79замените<yandex-cloud-nodejs-dev-login-function-id>на значение идентификатора функцииyandex-cloud-nodejs-dev-login. - В строке
101замените<yandex-cloud-nodejs-dev-ws-message-function-id>на значение идентификатора функцииyandex-cloud-nodejs-dev-ws-message. - В строке
106замените<yandex-cloud-nodejs-dev-ws-connect-function-id>на значение идентификатора функцииyandex-cloud-nodejs-dev-ws-connect. - В строке
111замените<yandex-cloud-nodejs-dev-ws-disconnect-function-id>на значение идентификатора функцииyandex-cloud-nodejs-dev-ws-disconnect. - В строке
118замените<yandex-cloud-nodejs-dev-auth-function-id>на значение идентификатора функцииyandex-cloud-nodejs-dev-auth.
- Во всех строках
-
Разверните экземпляр API Gateway:
yc serverless api-gateway create \ --name serverless-game-api \ --spec=apigw.yml \ --description "for serverless-game-api"Если вы допустили ошибку в спецификации API-шлюза, внесите правки и выполните команду:
yc serverless api-gateway update \ --name serverless-game-api \ --spec=apigw.yml
Подключите домен к Telegram-боту
-
Выполните команду:
yc serverless api-gateway get --name serverless-game-api -
Скопируйте служебный домен API-шлюза. Он находится в выводе предыдущей команды, в поле
domain. -
В Telegram найдите BotFather
и введите команду/setdomain. -
Выберите из списка своего бота и отправьте служебный домен API-шлюза. Перед доменом добавьте
https://. Например, если служебный домен API-шлюза —d5dm1lba80md********.i9******.apigw.yandexcloud.net, URL будетhttps://d5dm1lba80md********.i9******.apigw.yandexcloud.net.
Протестируйте приложение
Перейдите по ссылке, которую отправили Telegram-боту, авторизуйтесь и откройте игру.
В игре доступна статистика игроков. Если служебный домен API-шлюза — d5dm1lba80md********.i9******.apigw.yandexcloud.net, тогда по адресу https://d5dm1lba80md********.i9******.apigw.yandexcloud.net/stats.html будет доступна страница со статистикой всех игроков.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
- удалите базы данных Managed Service for YDB;
- удалите поток данных Data Streams;
- удалите секрет Yandex Lockbox;
- удалите все объекты из бакета и удалите пустой бакет Object Storage;
- удалите API-шлюз API Gateway;
- удалите функции Cloud Functions.
- удалите очередь Message Queue.