Разработка навыка Алисы и сайта с авторизацией
Важно
Часть ресурсов, необходимых для прохождения практического руководства, доступны только в регионе Россия.
В этом руководстве вы разработаете навык Алисы
Данные проекта хранятся в бакете Yandex Object Storage и базе данных Yandex Managed Service for YDB. Функции Yandex Cloud Functions обрабатывают запросы, а Yandex API Gateway обеспечивает взаимодействие сервисов.
Смотреть видео в Yandex Cloud Video
Чтобы развернуть проект:
- Подготовьте облако к работе.
- Настройте окружение.
- Создайте ресурсы.
- Задайте переменные проекта.
- Разверните проект.
- Зарегистрируйте навык Алисы.
- Проверьте работу навыка.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- плата за количество вызовов функций, вычислительные ресурсы, выделенные для выполнения функций, и исходящий трафик (см. тарифы Yandex Cloud Functions);
- плата за операции с YDB и хранение данных (см. тарифы Yandex Managed Service for YDB);
- плата за хранение данных в бакете (см. тарифы Yandex Object Storage);
- плата за количество запросов к созданному API-шлюзу и исходящий трафик (см. тарифы Yandex API Gateway);
- плата за запись и хранение данных в лог-группе (см. тарифы Yandex Cloud Logging).
Настройте окружение
- Установите подсистему Windows Subsystem for Linux (WSL)
для использования Linux. - Запустите WSL (по умолчанию — Ubuntu).
- Настройте окружение так, как описано в инструкции для операционной системы Linux.
Примечание
Если вы используете дистрибутив, отличный от Ubuntu, установите указанные программы с помощью команд вашего пакетного менеджера.
-
Клонируйте репозиторий yc-serverless-alice-shareable-todolist
:git clone https://github.com/yandex-cloud-examples/yc-serverless-alice-shareable-todolist.git
-
Установите и настройте следующие программы:
-
(Опционально) Для доработки проекта дополнительно установите:
Создайте ресурсы
Создайте бакет
Создайте бакет для хранения статических данных:
- В консоли управления
Yandex Cloud выберите каталог, в котором будете выполнять операции. - На странице каталога нажмите Создать ресурс и выберите Бакет.
- В поле Имя укажите имя бакета в соответствии с правилами именования.
- В полях Доступ на чтение объектов, Доступ к списку объектов и Доступ на чтение настроек выберите
Ограниченный
. - Укажите максимальный размер бакета в ГБ.
- Нажмите Создать бакет.
Создайте API-шлюз
Создайте API-шлюз для взаимодействия сервисов:
- В консоли управления
выберите каталог, в котором вы выполняете руководство. - В списке сервисов выберите API Gateway.
- Нажмите Создать API-шлюз.
- В поле Имя введите
gate-1
. - Нажмите Создать.
- Дождитесь, когда статус API-шлюза изменится на
Active
. - Выберите созданный API-шлюз.
- Найдите поля Идентификатор и Служебный домен и сохраните их значения. Они понадобятся при настройке навыка.
Создайте базу данных
Создайте базу данных YDB в режиме Serverless:
-
В консоли управления
выберите каталог, в котором создали бакет. -
Выберите сервис Managed Service for YDB.
-
Нажмите Создать базу данных.
-
Введите Имя базы. Требования к имени:
- длина — от 2 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
В блоке Тип базы данных выберите
Serverless
. -
Нажмите Создать базу данных.
-
Дождитесь, когда статус базы данных изменится на
Running
. -
Выберите созданную БД.
-
В блоке Соединение найдите поле Эндпоинт и сохраните его значение. Оно понадобится при создании функций.
Создайте приложение
Создайте
-
Перейдите на сайт сервиса
и авторизуйтесь. -
Нажмите Создать приложение.
-
Выберите подходящее имя приложения и загрузите иконку.
-
В разделе Для каких платформ нужно приложение выберите
Веб-сервисы
и нажмите Сохранить и продолжить. -
В разделе Платформы приложения в поле Redirect URI укажите следующие URL:
https://social.yandex.net/broker/redirect
;<служебный_домен_API-шлюза>/receive-token
.
Поле Suggest Hostname оставьте пустым.
-
Нажмите Сохранить и продолжить.
-
В разделе Доступ к данным выберите
Доступ к портрету пользователя
и нажмите Сохранить и продолжить. -
В разделе Почта для связи укажите адрес своей почты и нажмите Сохранить и продолжить.
-
Проверьте данные и нажмите Всё верно, создать приложение.
Подробнее о возможностях сервиса Яндекс.OAuth читайте в документации
Задайте переменные проекта
Сконфигурируйте проект с помощью значений, которые получили при создании ресурсов.
Создайте файл секретов
Создайте файл secure-config.json
с секретами:
-
Чтобы создать файл из шаблона
secure-config-template.json
, в папке с файлами проектаyc-serverless-alice-shareable-todolist
выполните команду:cp secure-config-template.json secure-config.json
-
Откройте файл
secure-config.json
с помощью редактораnano
:nano secure-config.json
-
Подставьте в файл значения переменных:
oauth_secret
— пароль приложения (Client secret), зарегистрированного в Яндекс OAuth .hash
— случайная строка длиной 64 байта, закодированная с помощью base64, напримерqrJagO5NVwOj0FeTmgYSwUN+XXkiQJMWifvrklF53wT55q80Xk8vmEB3kxhtpDnA1WDC893Z9Bh6QcqK********
. Сгенерировать случайное значение можно в терминале с помощью командыopenssl rand -base64 64 | tr -d '\n'
.block
— случайная строка длиной 32 байта, закодированная с помощью base64, напримерuwk0duFgn2nYyfu2VzJe+MnWKWQrfKaiZijI********
. Сгенерировать случайное значение можно в терминале с помощью командыopenssl rand -base64 32 | tr -d '\n'
.
Сгенерировать случайные значения можно с помощью сайта generate.plus
.
Создайте файл конфигурации
Создайте файл variables.json
с конфигурацией для развертывания проекта:
-
Чтобы создать файл из шаблона
variables-template.json
, в папке с файлами проекта выполните команду:cp variables-template.json variables.json
-
Откройте файл
variables.json
с помощью редактораnano
:nano variables.json
-
Подставьте в файл значения переменных:
folder-id
— идентификатор каталога в облаке.domain
— служебный домен API-шлюзаgate-1
безhttps://
. Напримерd5dbo25bol8n********.apigw.yandexcloud.net
.oauth-client-id
— значение поля ClientID приложения, зарегистрированного в Яндекс.OAuth .database
— размещение базы данных: вторая часть сохраненного ранее значения поля Эндпоинт (часть после вхождения/?database=
). Например,/kz1/r1gra875baom********/g5n22e7ejfr1********
.database-endpoint
— первая часть сохраненного ранее значения поля Эндпоинт (часть после вхожденияgrpcs://
и до вхождения/?database=
). Например,ydb.serverless.yandexcloud.net:2135
.yc-profile
— название профиля Yandex Cloud CLI.secure-config-path
— путь к файлу секретовsecure-config.json
.storage-bucket
— имя созданного бакета для хранения статических данных.gateway-id
— идентификатор API-шлюзаgate-1
.
Разверните проект
Перенесите файлы проекта в Yandex Cloud и обновите конфигурацию.
Примените схему данных
Чтобы создать таблицы в базе данных, в папке с файлами проекта выполните команду:
./upload_ydb_schema.sh
Получите OAuth-токен
Получите OAuth-токен:
- Перейдите в сервис Яндекс.OAuth
. Перед выдачей токена сервис может запросить доступ к данным. - Сохраните полученный токен, он понадобится для загрузки кода.
Загрузите код бэкенда в Cloud Functions
Используйте Terraform для автоматизации действий. Перед использованием проинициализируйте его.
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
В папке с конфигурационным файлом
app.tf
выполните команду:terraform init
Примечание
В случае ошибки инициализации провайдера Terraform вида
permission denied
выполните командуsudo chown $(whoami) ~/yc-serverless-alice-shareable-todolist
для изменения прав доступа текущего пользователя к папке проекта. -
После успешной инициализации создайте ресурсы, передав значение OAuth-токена для авторизации в Yandex Cloud:
terraform apply -var-file ./variables.json -var yc-token=<OAuth-токен>
Terraform автоматически создаст или обновит требуемые ресурсы.
Загрузите код фронтенда в Object Storage
Чтобы развернуть веб-приложение фронтенда, скомпилируйте статические файлы и загрузите их в Object Storage.
-
Перед компиляцией статических файлов убедитесь, что у вас установлен Node.js и пакетный менеджер npm.
-
Перейдите в папку
yc-serverless-alice-shareable-todolist/frontend
и выполните команду:npm run build
Если в процессе компиляции возникает ошибка:
-
ERR_OSSL_EVP_UNSUPPORTED
, создайте переменнуюNODE_OPTIONS
:export NODE_OPTIONS=--openssl-legacy-provider
-
npm ERR! Could not resolve dependency
, выполните команду:npm install --legacy-peer-deps && npm install --force
Результат:
> todolist@0.1.0 build > react-scripts build Creating an optimized production build... Compiled successfully. File sizes after gzip: 75.93 KB build/static/js/2.84be0fca.chunk.js 23.26 KB build/static/css/2.ef9168ec.chunk.css 2.63 KB build/static/js/main.d9e069c9.chunk.js 776 B build/static/js/runtime-main.676997b0.js 402 B build/static/css/main.e5cbab88.chunk.css The project was built assuming it is hosted at /. You can control this with the homepage field in your package.json. The build folder is ready to be deployed. You may serve it with a static server: npm install -g serve serve -s build
-
-
Чтобы загрузить файлы в Object Storage, выполните команду:
cd ../ ./upload_static.sh
Результат:
./upload_static.sh upload: frontend/build/robots.txt to s3://frontent-statics/robots.txt upload: frontend/build/manifest.json to s3://frontent-statics/manifest.json upload: frontend/build/static/css/main.e5cbab88.chunk.css.map to s3://frontent-statics/static/css/main.e5cbab88.chunk.css.map upload: frontend/build/index.html to s3://frontent-statics/index.html upload: frontend/build/asset-manifest.json to s3://frontent-statics/asset-manifest.json upload: frontend/build/static/js/2.84be0fca.chunk.js.LICENSE.txt to s3://frontent-statics/static/js/2.84be0fca.chunk.js.LICENSE.txt upload: frontend/build/static/css/main.e5cbab88.chunk.css to s3://frontent-statics/static/css/main.e5cbab88.chunk.css upload: frontend/build/static/js/main.d9e069c9.chunk.js to s3://frontent-statics/static/js/main.d9e069c9.chunk.js upload: frontend/build/static/js/2.84be0fca.chunk.js to s3://frontent-statics/static/js/2.84be0fca.chunk.js upload: frontend/build/static/js/runtime-main.676997b0.js to s3://frontent-statics/static/js/runtime-main.676997b0.js upload: frontend/build/static/js/runtime-main.676997b0.js.map to s3://frontent-statics/static/js/runtime-main.676997b0.js.map upload: frontend/build/static/js/main.d9e069c9.chunk.js.map to s3://frontent-statics/static/js/main.d9e069c9.chunk.js.map upload: frontend/build/static/css/2.ef9168ec.chunk.css to s3://frontent-statics/static/css/2.ef9168ec.chunk.css upload: frontend/build/static/css/2.ef9168ec.chunk.css.map to s3://frontent-statics/static/css/2.ef9168ec.chunk.css.map upload: frontend/build/static/js/2.84be0fca.chunk.js.map to s3://frontent-statics/static/js/2.84be0fca.chunk.js.map
Обновите конфигурацию API-шлюза
Чтобы загрузить актуальную спецификацию в API Gateway, выполните команду:
./update_gateway.sh
Результат:
done (2s)
id: d5dsj4st2g81********
folder_id: b1g86q4m5vej********
created_at: "2024-10-22T16:01:54.777Z"
name: gate-1
status: ACTIVE
domain: d5dm1lba80md********.i9******.apigw.yandexcloud.net
connectivity:
network_id: enp3srbi9u49********
log_options:
folder_id: b1g86q4m5vej********
execution_timeout: 300s
Зарегистрируйте навык Алисы
Создайте диалог
- Перейдите в Яндекс Диалоги
и авторизуйтесь в консоли. - Нажмите Создать диалог и выберите тип диалога
Навык
. - В поле Имя навыка укажите
Списки дел
. - В поле Backend включите опцию Функция в Яндекс Облаке и выберите из списка функцию
todolist-alice
, которую вы ранее создали в сервисе Cloud Functions. - Включите опцию Использовать хранилище данных в навыке.
- Заполните обязательные поля в разделе Публикация в каталоге. Остальные параметры задайте по своим предпочтениям. Например, можно задать разные словоформы для активации навыка, выбрать голос или тип доступа к навыку.
- Нажмите Сохранить внизу страницы.
Подробнее см. в документации
Настройте авторизацию в Алисе
-
Перейдите на вкладку Связка аккаунтов.
-
Введите:
- Идентификатор приложения — значение поля
ClientID
приложения, зарегистрированного в Яндекс.OAuth . - Секрет приложения — значение поля
Client secret
приложения, зарегистрированного в Яндекс.OAuth . - URL авторизации —
https://oauth.yandex.ru/authorize
. - URL для получения токена —
https://oauth.yandex.ru/token
. - URL для обновления токена —
https://oauth.yandex.ru/token
.
- Идентификатор приложения — значение поля
-
Нажмите Сохранить.
Подробнее о протоколе OAuth 2.0 читайте в RFC 6749
Добавьте интенты
-
Перейдите на вкладку Настройки.
-
Перейдите на вкладку Интенты и нажмите Создать.
-
Добавьте интенты для каждого действия, возможного в диалоге. Разработанные интенты находятся в папке
yc-serverless-alice-shareable-todolist/intents
проекта. -
Введите:
- Название — произвольное имя, которое будет отображаться в интерфейсе.
- ID — идентификатор интента, равный имени файла в папке
intents
. - Грамматика — текст грамматики, равный содержимому файла в папке
intents
.
-
Нажмите Сохранить.
-
Чтобы завершить создание диалога, в правой части страницы нажмите На модерацию.
Подробнее об интентах см. в документации Навыков Алисы
Проверьте работу навыка
Для отладки навыка используйте вкладку Тестирование в консоли Яндекс Диалогов
Перейдите на вкладку Тестирование. В левой части отображается чат с Алисой, в правой — протокол взаимодействия в формате JSON.
Пример диалога:
Давайте я помогу вам со списками!
Алиса, привет. Создай список Продукты
Готово, создала список "продукты"
Добавь молоко в Продукты
Готово, добавила "молоко" в "продукты"
Добавь хлеб
В какой список записать "хлеб"?
Продукты
Готово, добавила "хлеб" в "продукты"
Добавь яйца
В какой список записать "яйца"?
Продукты
Готово, добавила "яйца" в "продукты"
Алиса, перечисли список Продукты
продукты:
1. молоко
2. хлеб
3. яйца
Чтобы начать диалог, используйте любое поддерживаемое Алисой
В браузере перейдите по адресу, который указан в поле Служебный домен API-шлюза gate-1
, и авторизуйтесь. Откроется страница Мои списки. При переходе в любой из списков можно добавить или удалить пункты, а также предоставить доступ к списку другим пользователям.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: