Развертывание веб-приложения с использованием Java Servlet API и YDB
Узнайте, как с помощью serverless-технологий и Java Servlet API создать небольшое веб-приложение для управления списком задач.
Чтобы создать веб-приложение:
- Подготовьте облако к работе.
- Подготовьте окружение.
- Создайте бакет Yandex Object Storage.
- Создайте базу данных YDB.
- Создайте функции Yandex Cloud Functions.
- Создайте API-шлюз.
- Протестируйте приложение.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость ресурсов поддержки веб-приложения входят:
- Плата за количество запросов к API-шлюзу и исходящий трафик (см. тарифы Yandex API Gateway).
- Плата за операции с YDB и хранение данных (см. тарифы Yandex Managed Service for YDB).
- Плата за количество вызовов функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы Cloud Functions).
Подготовьте окружение
-
Создайте сервисный аккаунт и назначьте ему роль
editor
на ваш каталог. -
Склонируйте репозиторий
c проектом:git clone https://github.com/yandex-cloud-examples/yc-serverless-servlet
-
Добавьте содержимое склонированного локального репозитория
yc-serverless-servlet
в ZIP-архивservlet.zip
. Архив потребуется позднее для создания функций Yandex Cloud Functions.
Создайте бакет Object Storage
Создайте бакет и загрузите в него файл index.html
:
- В консоли управления
выберите каталог, в котором хотите создать бакет. - Выберите сервис Object Storage.
- Нажмите кнопку Создать бакет.
- На странице создания бакета:
- Введите имя бакета в соответствии с правилами именования.
- При необходимости ограничьте максимальный размер бакета.
- В полях Доступ на чтение объектов, Доступ к списку объектов и Доступ на чтение настроек выберите
Ограниченный
. - Выберите класс хранилища по умолчанию.
- Нажмите кнопку Создать бакет для завершения операции.
- Выберите созданный бакет.
- Нажмите кнопку Загрузить и выберите в папке с проектом файл
src/main/resources/index.html
. - Выберите класс хранилища для файла и нажмите кнопку Загрузить.
Создайте базу данных Managed Service for YDB
-
Создайте базу данных в режиме Serverless:
Консоль управления-
В консоли управления
выберите каталог, в котором создали бакет. -
Выберите сервис Managed Service for YDB.
-
Нажмите кнопку Создать базу данных.
-
Введите Имя базы. Требования к имени:
- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
В блоке Тип базы данных выберите
Serverless
. -
Нажмите кнопку Создать базу данных.
-
Дождитесь запуска базы данных. В процессе создания база будет иметь статус
Provisioning
, а когда станет готова к использованию, статус изменится наRunning
. -
Выберите созданную БД.
-
В блоке Соединение найдите поле Эндпоинт и сохраните его значение. Оно понадобится при создании функций.
-
-
Создайте таблицу с именем
Tasks
:Консоль управленияCLI-
В консоли управления
выберите каталог, в котором создали базу данных. -
Выберите сервис Managed Service for YDB.
-
На странице Базы данных выберите базу.
-
Чтобы открыть корневую директорию базы, перейдите на вкладку Навигация.
-
Для создания запроса к базе в правом верхнем углу нажмите кнопку Новый SQL-запрос. Откроется страница Запрос.
-
В поле Запрос введите:
CREATE TABLE Tasks ( TaskId Utf8, Name Utf8, Description Utf8, CreatedAt Datetime, PRIMARY KEY (TaskId) );
-
Нажмите кнопку Выполнить.
Выполните запрос:
ydb -e grpcs://<YDB_эндпоинт> -d <имя_БД> \ scripting yql -s \ "CREATE TABLE Tasks ( TaskId Utf8, Name Utf8, Description Utf8, CreatedAt Datetime, PRIMARY KEY (TaskId) );"
-
Создайте функции Cloud Functions
Создайте функцию для каждого сервлета:
- В консоли управления
перейдите в каталог, в котором создали бакет и базу данных. - Выберите сервис Cloud Functions.
- Нажмите кнопку Создать функцию.
- Введите имя
add-task
и описание функции. - Нажмите кнопку Создать.
- В блоке Редактор выберите среду выполнения
java21
, выключите опцию Добавить файлы с примерами кода и нажмите кнопку Продолжить. - Подготовьте код функции. Для этого в поле Способ выберите
ZIP-архив
. - В поле Файл нажмите кнопку Прикрепить файл и выберите созданный ранее архив
servlet.zip
. - В поле Точка входа введите
yandex.cloud.examples.serverless.todo.AddTaskServlet
. - В поле Таймаут, c установите значение
10
. - В поле Сервисный аккаунт укажите аккаунт, созданный при подготовке окружения.
- Добавьте переменные окружения:
ENDPOINT
— введите первую часть сохраненного при создании базы данных YDB значения поля Эндпоинт (часть между вхождениямиgrpcs://
и/?database=
). Например,ydb.serverless.yandexcloud.net:2135
.DATABASE
— введите вторую часть сохраненного при создании базы данных YDB значения поля Эндпоинт (часть после вхождения/?database=
). Например,/ru-central1/r1gra875baom********/g5n22e7ejfr1********
.
- Нажмите кнопку Сохранить изменения.
- На странице Обзор включите опцию Публичная функция.
- Повторите шаги 3-14 и создайте функцию с именем
list-tasks
и точкой входаyandex.cloud.examples.serverless.todo.ListTasksServlet
. - Повторите шаги 3-14 и создайте функцию с именем
delete-task
и точкой входаyandex.cloud.examples.serverless.todo.DeleteTaskServlet
.
-
Создайте функцию с именем
add-task
:yc serverless function create --name=add-task
Результат:
id: d4ejb1799eko******** folder_id: aoek49ghmknn******** created_at: "2021-03-08T14:07:32.134Z" name: add-task log_group_id: eolm8aoq9vcp******** http_invoke_url: https://functions.yandexcloud.net/d4ejb1799eko******** status: ACTIVE
-
Создайте версию функции
add-task
:yc serverless function version create \ --function-name=add-task \ --runtime java21 \ --entrypoint yandex.cloud.examples.serverless.todo.AddTaskServlet \ --memory 128m \ --execution-timeout 10s \ --source-path ./servlet.zip \ --environment DATABASE=<имя_БД>,ENDPOINT=<YDB_эндпоинт>
Где:
--function-name
— имя функции, версию которой вы хотите создать.--runtime
— среда выполнения.--entrypoint
— точка входа, указывается в формате<имя_файла_с_функцией>
.<имя_обработчика>
.--memory
— объем RAM.--execution-timeout
— максимальное время выполнения функции до таймаута.--source-path
— путь к созданному ранее ZIP-архивуservlet.zip
с кодом функции и необходимыми зависимостями.--environment
— переменные окружения в форматеkey=value
.
Результат:
done (1s) id: d4evvn8obisa******** function_id: d4ejb1799eko******** ... tags: - $latest log_group_id: ckg3qh8h363p********
-
Сделайте функцию публичной:
yc serverless function allow-unauthenticated-invoke add-task
Результат:
done (1s)
-
Повторите шаги 1-3 и создайте функцию с именем
list-tasks
и точкой входаyandex.cloud.examples.serverless.todo.ListTasksServlet
. -
Повторите шаги 1-3 и создайте функцию с именем
delete-task
и точкой входаyandex.cloud.examples.serverless.todo.DeleteTaskServlet
.
Воспользуйтесь API методами create, createVersion и setAccessBindings для ресурса Function.
Создать функцию и ее версию можно с помощью плагина Yandex Cloud Toolkit
Создайте API-шлюз
Для обеспечения взаимодействия между сервисами создайте API-шлюз:
-
В консоли управления
выберите каталог, в котором создали бакет, базу данных и функции. -
Выберите сервис API Gateway.
-
Нажмите кнопку Создать API-шлюз.
-
Введите имя шлюза и описание.
-
В поле Спецификация добавьте спецификацию:
openapi: 3.0.0 info: title: ToDo list version: 1.0.0 paths: /: get: x-yc-apigateway-integration: type: object-storage bucket: <бакет> object: index.html presigned_redirect: false service_account: <сервисный_аккаунт> operationId: static /add: post: x-yc-apigateway-integration: type: cloud-functions function_id: <идентификатор_add-task> operationId: addTask /list: get: x-yc-apigateway-integration: type: cloud-functions function_id: <идентификатор_list-tasks> operationId: listTasks /delete: delete: x-yc-apigateway-integration: type: cloud-functions function_id: <идентификатор_delete-task> operationId: deleteTask
Где:
bucket
— имя бакета, в котором лежит файлindex.html
.service_account
— идентификатор сервисного аккаунта, созданного при подготовке окружения.- Блок
/add
, параметрfunction_id
— идентификатор функцииadd-task
. - Блок
/list
, параметрfunction_id
— идентификатор функцииlist-tasks
. - Блок
/delete
, параметрfunction_id
— идентификатор функцииdelete-task
.
-
Нажмите кнопку Создать.
-
Сохраните следующую спецификацию в файл
todo.yaml
:openapi: 3.0.0 info: title: ToDo list version: 1.0.0 paths: /: get: x-yc-apigateway-integration: type: object-storage bucket: <бакет> object: index.html presigned_redirect: false service_account: <сервисный_аккаунт> operationId: static /add: post: x-yc-apigateway-integration: type: cloud-functions function_id: <идентификатор_add-task> operationId: addTask /list: get: x-yc-apigateway-integration: type: cloud-functions function_id: <идентификатор_list-tasks> operationId: listTasks /delete: delete: x-yc-apigateway-integration: type: cloud-functions function_id: <идентификатор_delete-task> operationId: deleteTask
Где:
bucket
— имя бакета, в котором лежит файлindex.html
.service_account
— идентификатор сервисного аккаунта, созданного при подготовке окружения.- Блок
/add
, параметрfunction_id
— идентификатор функцииadd-task
. - Блок
/list
, параметрfunction_id
— идентификатор функцииlist-tasks
. - Блок
/delete
, параметрfunction_id
— идентификатор функцииdelete-task
.
-
Создайте API-шлюз:
yc serverless api-gateway create \ --name todo-list \ --spec=todo.yaml \ --description "simple todo list"
Результат:
done (41s) id: d5delqeel34q******** folder_id: b1g86q4m5vej******** created_at: "2021-03-08T14:07:32.134Z" name: todo-list description: simple todo list status: ACTIVE domain: d5delqeel34q********.apigw.yandexcloud.net log_group_id: ckg2hdmevnvc********
Создать API-шлюз можно с помощью плагина Yandex Cloud Toolkit
Проверьте работу приложения
Чтобы открыть приложение, перейдите по ссылке, указанной в поле Служебный домен созданного API-шлюза.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: