Создание интерактивного 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-state
get-config
move
capture
state-change
login
auth
ws-connect
ws-message
ws-disconnect
-
Сервисные аккаунты:
functions-sa
с рольюeditor
triggers-sa
с рольюserverless.functions.invoker
yds-reader-sa
с рольюyds.admin
yds-writer-sa
с рольюyds.writer
ymq-reader-sa
с рольюymq.reader
ymq-writer-sa
с рольюymq.writer
apigw-s3-viewer
с рольюstorage.viewer
apigw-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-шлюза —d5d920bqkitf********.apigw.yandexcloud.net
, URL будетhttps://d5d920bqkitf********.apigw.yandexcloud.net
.
Протестируйте приложение
Перейдите по ссылке, которую отправили Telegram-боту, авторизуйтесь и откройте игру.
В игре доступна статистика игроков. Если служебный домен API-шлюза — d5d920bqkitf********.apigw.yandexcloud.net
, тогда по адресу https://d5d920bqkitf********.apigw.yandexcloud.net/stats.html
будет доступна страница со статистикой всех игроков.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
- удалите базы данных Managed Service for YDB;
- удалите поток данных Data Streams;
- удалите секрет Yandex Lockbox;
- удалите все объекты из бакета и удалите пустой бакет Object Storage;
- удалите API-шлюз API Gateway;
- удалите функции Cloud Functions.
- удалите очередь Message Queue.