Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex API Gateway
  • Начало работы
    • Все практические руководства
    • Развертывание веб-приложения с использованием Java Servlet API
    • Разработка навыка Алисы и сайта с авторизацией
    • Разработка Slack-бота
    • Разработка Telegram-бота
    • Разработка Telegram-бота для распознавания текста и аудио
    • Разработка пользовательской интеграции
    • Разработка CRUD API для сервиса фильмов
    • Работа с API-шлюзом по протоколу WebSocket
    • Создание интерактивного serverless-приложения с использованием WebSocket
    • Построение пайплайна CI/CD в GitLab с использованием serverless-продуктов
    • Интерактивная отладка функций Cloud Functions
    • Развертывание веб-приложения с JWT-авторизацией в API Gateway и аутентификацией в Firebase
    • Канареечный релиз функции Cloud Functions
    • Использование API Gateway для настройки синтеза речи в Yandex SpeechKit
    • Запуск контейнерного приложения в Yandex Serverless Containers
    • Сокращатель ссылок
    • Ввод данных в системы хранения
    • Защита API Gateway при помощи Smart Web Security
  • Управление доступом
  • Правила тарификации
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • История изменений
  • Вопросы и ответы
  • Обучающие курсы

В этой статье:

  • Перед началом работы
  • Необходимые платные ресурсы
  • Подготовьте окружение
  • Скачайте проект
  • Зарегистрируйте Telegram-бота
  • Получите токен доступа
  • Создайте сервисный аккаунт
  • Создайте базы данных Managed Service for YDB
  • Создайте таблицу
  • Создайте поток данных Data Streams
  • Создайте секрет Yandex Lockbox
  • Разверните проект
  • Создайте ключи доступа для сервисных аккаунтов
  • Создайте новую версию секрета и разверните проект еще раз
  • Создайте API-шлюз API Gateway
  • Подключите домен к Telegram-боту
  • Протестируйте приложение
  • Как удалить созданные ресурсы
  1. Практические руководства
  2. Создание интерактивного serverless-приложения с использованием WebSocket

Создание интерактивного serverless-приложения с использованием WebSocket

Статья создана
Yandex Cloud
Улучшена
Обновлена 26 декабря 2024 г.
  • Перед началом работы
    • Необходимые платные ресурсы
  • Подготовьте окружение
    • Скачайте проект
    • Зарегистрируйте Telegram-бота
    • Получите токен доступа
    • Создайте сервисный аккаунт
  • Создайте базы данных 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.

Чтобы создать онлайн-игру:

  1. Подготовьте окружение.
  2. Создайте базы данных Yandex Managed Service for YDB.
  3. Создайте поток данных Yandex Data Streams.
  4. Создайте секрет Yandex Lockbox.
  5. Разверните проект.
  6. Создайте ключи доступа для сервисных аккаунтов.
  7. Создайте новую версию секрета и разверните проект еще раз.
  8. Создайте API-шлюз Yandex API Gateway.
  9. Подключите домен к Telegram-боту.
  10. Протестируйте приложение.

Если созданные ресурсы больше не нужны, удалите их.

Перед началом работыПеред началом работы

Необходимые платные ресурсыНеобходимые платные ресурсы

В стоимость поддержки инфраструктуры для данного руководства входят:

  • плата за операции с данными и за объем хранимых данных (см. тарифы Yandex Managed Service for YDB);
  • плата за использование потока данных (см. тарифы Yandex Data Streams);
  • плата за хранение секрета (см. тарифы Yandex Lockbox);
  • плата за хранение данных и операции с данными (см. тарифы Yandex Object Storage);
  • плата за запросы к созданным API-шлюзам и исходящий трафик (см. тарифы Yandex API Gateway);
  • плата за запросы к очередям и исходящий трафик (см. тарифы Yandex Message Queue);
  • плата за вызовы функций и вычислительные ресурсы, выделенные для выполнения функций (см. тарифы Yandex Cloud Functions).

Подготовьте окружениеПодготовьте окружение

Windows
Linux
macOS
  1. Установите утилиту WSL для использования окружения Linux.
  2. Запустите подсистему Linux (по умолчанию — Ubuntu).
  3. Далее настройте окружение так, как описано в этой инструкции для операционной системы Linux.

Примечание

Если вы используете дистрибутив, отличный от Ubuntu, установите указанные утилиты с помощью команд вашего пакетного менеджера.

  1. Последовательно установите следующие утилиты с помощью команд в терминале:

    • WebStorm или IntelliJ IDEA Community Edition.

      sudo snap install webstorm --classic
      
    • Curl и Git:

      sudo apt-get install curl git -y
      
    • Утилиту jq:

      sudo apt-get install jq
      
    • Yandex Cloud CLI:

      curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash
      exec -l $SHELL
      yc version
      
    • AWS CLI:

      curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" --output "AWSCLIV2.pkg"
      sudo installer -pkg AWSCLIV2.pkg -target /
      
    • YDB CLI:

      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
      
    • TypeScript:

      sudo npm install -g typescript
      
  2. Создайте профиль Yandex Cloud CLI с базовыми параметрами.

  1. Последовательно установите следующие утилиты с помощью команд в терминале:

    • Homebrew:

      /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
      
    • Curl и Git:

      brew install curl git
      
    • Утилиту jq:

      brew install jq
      
    • Yandex Cloud CLI:

      curl https://storage.yandexcloud.net/yandexcloud-yc/install.sh | bash
      exec -l $SHELL
      yc version
      
    • AWS CLI:

      curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" --output "AWSCLIV2.pkg"
      sudo installer -pkg AWSCLIV2.pkg -target /
      
    • YDB CLI:

      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
      
    • TypeScript:

      npm install -g typescript
      
  2. Создайте профиль Yandex Cloud CLI с базовыми параметрами.

Скачайте проектСкачайте проект

Клонируйте репозиторий yc-serverless-game:

git clone https://github.com/yandex-cloud-examples/yc-serverless-game.git

Зарегистрируйте Telegram-ботаЗарегистрируйте Telegram-бота

Зарегистрируйте вашего бота в Telegram и получите токен.

  1. Чтобы зарегистрировать нового бота, запустите бота BotFather и отправьте команду:

    /newbot
    
  2. В поле name укажите имя создаваемого бота, например Serverless Game With WebSockets. Это имя увидят пользователи при общении с ботом.

  3. В поле username укажите имя пользователя для создаваемого бота, например ServerlessGameWithWebSocketsBot. По имени пользователя можно будет найти бота в Telegram. Имя пользователя должно оканчиваться на ...Bot или ..._bot.

  4. В ответном сообщении вы получите адрес t.me/ServerlessGameWithWebSocketsBot и токен.

  5. Сохраните имя пользователя в переменную TG_BOT_LOGIN:

    echo "export TG_BOT_LOGIN=<имя_пользователя_для_бота>" >> ~/.bashrc && . ~/.bashrc
    echo $TG_BOT_LOGIN
    
  6. Сохраните токен в переменную 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

Создайте сервисный аккаунтСоздайте сервисный аккаунт

  1. Создайте сервисный аккаунт с именем 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
    
  2. В выводе команды, в строке id, будет указан идентификатор сервисного аккаунта. Сохраните его в переменную SERVICE_ACCOUNT_GAME_ID:

    echo "export SERVICE_ACCOUNT_GAME_ID=<идентификатор_сервисного_аккаунта>" >> ~/.bashrc && . ~/.bashrc
    
  3. Назначьте сервисному аккаунту роль 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
    
  4. Создайте авторизованный ключ для сервисного аккаунта:

    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
    
  5. Создайте статический ключ доступа для сервисного аккаунта:

    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********
    
  6. Сохраните идентификатор ключа 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
    
  7. Настройте AWS CLI:

    aws configure
    

    Введите следующие параметры:

    • AWS Access Key ID — идентификатор ключа доступа key_id сервисного аккаунта, полученный ранее.
    • AWS Secret Access Key — секретный ключ secret сервисного аккаунта, полученный ранее.
    • Default region name — используйте значение ru-central1.
    • Default output format — оставьте пустым.
  8. Проверьте конфигурацию:

    echo $AWS_ACCESS_KEY_ID
    echo $AWS_SECRET_ACCESS_KEY
    aws configure list
    

Создайте базы данных Managed Service for YDBСоздайте базы данных Managed Service for YDB

Создайте базу данных с именем game-data для хранения данных игры и базу данных с именем data-streams для потока Data Streams.

  1. Создайте базу данных в режиме 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
    ...
    
  2. Сохраните в переменной YDB_ENDPOINT значение endpoint из вывода предыдущей команды. В нашем примере оно равняется grpcs://ydb.serverless.yandexcloud.net:2135.

    echo "export YDB_ENDPOINT=<эндпоинт_Document_API_БД>" >> ~/.bashrc && . ~/.bashrc
    echo $YDB_ENDPOINT
    
  3. Сохраните в переменной YDB_DATABASE значение database из вывода предыдущей команды. В нашем примере оно равняется /ru-central1/b1gia87mbaom********/etn0ejcvmjm4********.

    echo "export YDB_DATABASE=<имя_таблицы>" >> ~/.bashrc && . ~/.bashrc
    echo $YDB_DATABASE
    
  4. Создайте базу данных в режиме 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
    
  5. Сохраните в переменной 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
    
  6. Сохраните в переменной YDB_DATA_STREAMS_DATABASE значение database из вывода предыдущей команды. В нашем примере оно равняется /ru-central1/b1gia87mbaom********/etn16k0e1757********.

    echo "export YDB_DATA_STREAMS_DATABASE=<имя_таблицы>" >> ~/.bashrc && . ~/.bashrc
    echo $YDB_DATA_STREAMS_DATABASE
    
  7. Проверьте, что все сделано верно:

    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
    

Создайте таблицуСоздайте таблицу

  1. Перейдите в папку files внутри каталога yc-serverless-game.

  2. Создайте таблицу, используя файл db-example.sql:

    ydb \
      --endpoint $YDB_ENDPOINT \
      --database $YDB_DATABASE \
      --sa-key-file $SA_KEY_FILE \
    scripting yql --file db-example.sql
    
  3. Добавьте запись для начальной конфигурации:

    ydb \
      --endpoint $YDB_ENDPOINT \
      --database $YDB_DATABASE \
      --sa-key-file $SA_KEY_FILE \
    scripting yql --file db-update.sql
    
  4. Проверьте результат выполнения:

    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Создайте поток данных Data Streams

AWS CLI
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Создайте секрет Yandex Lockbox

  1. Создайте секрет с именем 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}]"
    
  2. Сохраните идентификатор созданного секрета в переменную 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
    
  3. Передайте в секрет значение переменной TG_BOT_TOKEN:

    yc lockbox secret add-version --id $LOCKBOX_SECRET_ID \
    --payload "[{'key': 'tg_bot_token', 'text_value': '$TG_BOT_TOKEN'}]"
    
  4. Передайте в секрет ключи, значения которых мы получим позже. Пока задайте им значения, равными 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'}]"
    

Разверните проектРазверните проект

  1. Перейдите в папку files внутри каталога yc-serverless-game.

  2. Измените конфигурацию для 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.

  3. Задайте переменную APP_ENV для сборки проекта:

    echo "export APP_ENV=production" >> ~/.bashrc && . ~/.bashrc
    echo $APP_ENV
    
  4. Соберите и разверните проект. В корне каталога 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.
  1. Создайте статический ключ доступа для сервисного аккаунта 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********
    
  2. Скопируйте значение идентификатора ключа key_id и сохраните в переменную YDS_WRITER_KEY_ID:

    echo "export YDS_WRITER_KEY_ID=<идентификатора_ключа>" >> ~/.bashrc && . ~/.bashrc
    echo $YDS_WRITER_KEY_ID
    
  3. Скопируйте значение секрета secret и сохраните в переменную YDS_WRITER_KEY_SECRET:

    echo "export YDS_WRITER_KEY_SECRET=<секрет>" >> ~/.bashrc && . ~/.bashrc
    echo $YDS_WRITER_KEY_SECRET
    
  4. Создайте статический ключ доступа для сервисного аккаунта 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
    
  5. Скопируйте идентификатора ключа key_id и сохраните в переменную YMQ_WRITER_KEY_ID:

    echo "export YMQ_WRITER_KEY_ID=<идентификатор_ключа>" >> ~/.bashrc && . ~/.bashrc
    
    echo $YMQ_WRITER_KEY_ID
    
  6. Скопируйте значение секрета secret и сохраните в переменную YMQ_WRITER_KEY_SECRET:

    echo "export YMQ_WRITER_KEY_SECRET=<секрет>" >> ~/.bashrc && . ~/.bashrc
    echo $YMQ_WRITER_KEY_SECRET
    

Создайте новую версию секрета и разверните проект еще разСоздайте новую версию секрета и разверните проект еще раз

  1. Передайте новые значения в секрет game-secrets:

    1. В консоли управления выберите ваш рабочий каталог.

    2. Выберите сервис Message Queue.

    3. Выберите очередь capturing-queue.

    4. Скопируйте значение из поля URL и сохраните его в переменную YMQ_CAPTURE_QUEUE_URL:

      echo "export YMQ_CAPTURE_QUEUE_URL=<URL>" >> ~/.bashrc && . ~/.bashrc
      
    5. Проверьте значения переменных, которые нужно будет передать в секрет:

      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
      
    6. Передайте значения в секрет:

      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'}]"
      
  2. Перейдите в корень каталога yc-serverless-game и еще раз разверните проект:

    npm run deploy
    

Создайте API-шлюз API GatewayСоздайте API-шлюз API Gateway

При развертывании проекта создались следующие сервисные аккаунты:

  • apigw-s3-viewer с ролью storage.viewer для чтения объектов из бакета Object Storage.
  • apigw-fn-caller с ролью functions.functionInvoker для вызова функций Cloud Functions.
  1. Сохраните идентификаторы сервисных аккаунтов 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
    
  2. Внесите изменения в спецификацию API-шлюза. Перейдите в папку files внутри каталога yc-serverless-game и выполните команду:

    cp apigw-example.yml apigw.yml
    
  3. Получите идентификаторы ресурсов, созданных ранее:

    echo $APIGW_S3_VIEWER_ID
    echo $APIGW_FN_CALLER_ID
    
    yc storage bucket list
    yc serverless function list
    
  4. Внесите в файл apigw.yml следующие изменения:

    1. Во всех строках bucket: serverless-game-files замените название бакета на ваше.
    2. Во всех строках service_account_id: <sa-id-for-object-storage> замените <sa-id-for-object-storage> на значение переменной $APIGW_S3_VIEWER_ID.
    3. Во всех строках service_account_id: <sa-id-for-functions> замените <sa-id-for-functions> на значение переменной $APIGW_FN_CALLER_ID.
    4. В строке 58 замените <yandex-cloud-nodejs-dev-get-state-function-id> на значение идентификатора функции yandex-cloud-nodejs-dev-get-state.
    5. В строке 65 замените <yandex-cloud-nodejs-dev-get-config-function-id> на значение идентификатора функции yandex-cloud-nodejs-dev-get-config.
    6. В строке 72 замените <yandex-cloud-nodejs-dev-move-function-id> на значение идентификатора функции yandex-cloud-nodejs-dev-move.
    7. В строке 79 замените <yandex-cloud-nodejs-dev-login-function-id> на значение идентификатора функции yandex-cloud-nodejs-dev-login.
    8. В строке 101 замените <yandex-cloud-nodejs-dev-ws-message-function-id> на значение идентификатора функции yandex-cloud-nodejs-dev-ws-message.
    9. В строке 106 замените <yandex-cloud-nodejs-dev-ws-connect-function-id> на значение идентификатора функции yandex-cloud-nodejs-dev-ws-connect.
    10. В строке 111 замените <yandex-cloud-nodejs-dev-ws-disconnect-function-id> на значение идентификатора функции yandex-cloud-nodejs-dev-ws-disconnect.
    11. В строке 118 замените <yandex-cloud-nodejs-dev-auth-function-id> на значение идентификатора функции yandex-cloud-nodejs-dev-auth.
  5. Разверните экземпляр 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-ботуПодключите домен к Telegram-боту

  1. Выполните команду:

    yc serverless api-gateway get --name serverless-game-api
    
  2. Скопируйте служебный домен API-шлюза. Он находится в выводе предыдущей команды, в поле domain.

  3. В Telegram найдите BotFather и введите команду /setdomain.

  4. Выберите из списка своего бота и отправьте служебный домен 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.

Была ли статья полезна?

Предыдущая
Работа с API-шлюзом по протоколу WebSocket
Следующая
Построение пайплайна CI/CD в GitLab с использованием serverless-продуктов
Проект Яндекса
© 2025 ООО «Яндекс.Облако»