Развертывание веб-приложения с использованием Java Servlet API
Узнайте, как с помощью 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).
Подготовьте окружение
-
Создайте сервисный аккаунт и назначьте ему следующие роли на ваш каталог:
-
Склонируйте репозиторий
c проектом:git clone https://github.com/yandex-cloud-examples/yc-serverless-servlet -
Добавьте содержимое склонированного локального репозитория
yc-serverless-servletв ZIP-архивservlet.zip. Архив потребуется позднее при создании функций Yandex Cloud Functions.
Создайте бакет Yandex Object Storage
Создайте бакет и загрузите в него файл index.html:
-
В консоли управления
выберите каталог, в котором хотите создать бакет. -
Перейдите в сервис Object Storage.
-
Нажмите кнопку Создать бакет и в открывшемся окне:
- Задайте имя бакета в соответствии с правилами именования.
- При необходимости ограничьте максимальный размер бакета.
- В полях Чтение объектов, Чтение списка объектов и Чтение настроек выберите
С авторизацией. - Выберите класс хранилища по умолчанию.
- Нажмите кнопку Создать бакет.
-
Выберите созданный бакет.
-
В правом верхнем углу страницы нажмите кнопку
Загрузить и в папке с проектом выберите файлsrc/main/resources/index.html. -
Выберите класс хранилища для файла и нажмите кнопку Загрузить.
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.
-
Чтобы создать бакет, выполните команду, указав уникальное имя бакета:
yc storage bucket create \ --name <имя_бакета> \ --default-storage-class standardРезультат:
name: sample-bucket folder_id: b1g5bhjofg7o******** anonymous_access_flags: {} default_storage_class: STANDARD versioning: VERSIONING_DISABLED created_at: "2026-06-01T04:44:30.688587Z" resource_id: e3eqmpmknkus********Подробнее о команде
yc storage bucket createчитайте в справочнике CLI. -
Чтобы загрузить в бакет файл
index.html, выполните команду:yc storage s3api put-object \ --bucket <имя_бакета> \ --key index.html \ --body "<локальный_путь_к_файлу>" \ --content-type "text/html"Где:
--bucket— имя бакета, созданного ранее.--body— локальный путь к файлуindex.html, скачанному ранее из репозитория. Например:/Users/myuser/repositories/yc-serverless-servlet/src/main/resources/index.html.
Результат:
etag: '"f38989ca9039c275f5f56840********"' request_id: 72d413fc********Подробнее о команде
yc storage s3api put-objectчитайте в справочнике CLI.
Создайте базу данных Yandex Managed Service for YDB
-
Создайте базу данных в режиме Serverless:
- В консоли управления
выберите каталог, в котором вы создали бакет. - Перейдите в сервис Managed Service for YDB.
- Нажмите кнопку Создать базу данных.
- Задайте Имя базы.
- В блоке Тип базы данных выберите
Serverless. - Нажмите кнопку Создать базу данных.
- Дождитесь запуска базы данных. В процессе создания база будет иметь статус
Provisioning, а когда станет готова к использованию, статус изменится наRunning. - Выберите созданную БД.
- В блоке Соединение найдите поле Эндпоинт и сохраните его значение. Оно понадобится позднее при создании функций.
- В консоли управления
-
Создайте таблицу с именем
Tasks:-
Чтобы открыть корневую директорию базы, в меню слева выберите
Навигация. -
Чтобы создать запрос к БД, в правом верхнем углу нажмите кнопку Новый SQL-запрос. На открывшейся странице Запрос:
-
В поле Запрос введите:
CREATE TABLE Tasks ( TaskId Utf8, Name Utf8, Description Utf8, CreatedAt Datetime, PRIMARY KEY (TaskId) ); -
Нажмите кнопку
Выполнить.
-
-
-
Создайте базу данных в режиме Serverless, указав в команде ее имя:
yc ydb database create <имя_БД> \ --serverlessРезультат:
done (22s) id: etnm3b9gco6k******** folder_id: b1g5bhjofg7o******** created_at: "2026-06-01T04:54:48Z" name: sample-database status: PROVISIONING endpoint: grpcs://ydb.serverless.yandexcloud.net:2135/?database=/ru-central1/b1gj9ja2h4ct********/etnm3b9gco6k******** serverless_database: storage_size_limit: "53687091200" location_id: ru-central1 backup_config: backup_settings: - name: daily backup_schedule: daily_backup_schedule: execute_time: hours: 17 backup_time_to_live: 604800s type: SYSTEM document_api_endpoint: https://docapi.serverless.yandexcloud.net/ru-central1/b1gj9ja2h4ct********/etnm3b9gco6k******** monitoring_config: {}Сохраните значение поля
endpoint. Оно понадобится позднее.Подробнее о команде
yc ydb database createчитайте в справочнике CLI. -
Установите
утилитуYDB CLI, позволяющую работать с базами данных YDB. -
Сохраните IAM-токен, необходимый для аутентификации запросов через
YDB CLI, в переменную окруженияIAM_TOKEN:export IAM_TOKEN=$(yc iam create-token) -
Создайте таблицу с именем
Tasks:ydb \ --endpoint grpcs://ydb.serverless.yandexcloud.net:2135 \ --database "/ru-central1/b1gj9ja2h4ct********/etnjkrvloo7k********" \ scripting yql -s \ "CREATE TABLE Tasks ( TaskId Utf8, Name Utf8, Description Utf8, CreatedAt Datetime, PRIMARY KEY (TaskId) );"Где:
--endpoint— первая часть значения поляendpoint, сохраненного при создании базы данных (часть до вхождения/?database=). Например,grpcs://ydb.serverless.yandexcloud.net:2135.--database— вторая часть значения поляendpoint(часть после вхождения/?database=). Например:/ru-central1/b1gj9ja2h4ct********/etnjkrvloo7k********.
Создайте функции Cloud Functions
Создайте функцию для каждого сервлета:
- В консоли управления
перейдите в каталог, в котором вы создали бакет и базу данных. - Перейдите в сервис Cloud Functions.
- Нажмите кнопку Создать функцию.
- Задайте Имя
add-taskи (опционально) Описание функции. - Нажмите кнопку Создать.
- В блоке Редактор выберите среду выполнения
Java 21, отключите опцию Добавить файлы с примерами кода и нажмите кнопку Продолжить. - Подготовьте код функции. Для этого в поле Источник кода выберите
ZIP-архив. - В поле Файл нажмите кнопку Прикрепить файл и выберите созданный ранее архив
servlet.zip. - В поле Точка входа введите
yandex.cloud.examples.serverless.todo.AddTaskServlet. - В поле Таймаут установите значение
10. - В поле Сервисный аккаунт выберите аккаунт, созданный при подготовке окружения.
- Добавьте переменные окружения:
ENDPOINT— введите первую часть значения поля Эндпоинт, сохраненного при создании базы данных YDB (часть между вхождениямиgrpcs://и/?database=). Например,ydb.serverless.yandexcloud.net:2135.DATABASE— введите вторую часть значения поля Эндпоинт (часть после вхождения/?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: d4e3reah34e0******** folder_id: b1g5bhjofg7o******** created_at: "2026-06-01T05:07:13.071Z" name: add-task http_invoke_url: https://functions.yandexcloud.net/d4e3reah34e0******** status: ACTIVEСохраните идентификатор созданной функции (значение поля
id). Он понадобится позднее при создании API-шлюза.Подробнее о команде
yc serverless function createчитайте в справочнике CLI. -
Создайте версию функции
add-task:yc serverless function version create \ --function-name add-task \ --runtime java21 \ --service-account-id <идентификатор_сервисного_аккаунта> \ --entrypoint "yandex.cloud.examples.serverless.todo.AddTaskServlet" \ --memory 128m \ --execution-timeout 10s \ --source-path "./servlet.zip" \ --environment ENDPOINT="<YDB_эндпоинт>",DATABASE="<имя_БД>"Где:
-
--function-name— имя функции, версию которой вы хотите создать. -
--runtime— среда выполнения. -
--service-account-id— идентификатор сервисного аккаунта, созданного при подготовке окружения. -
--entrypoint— точка входа, указывается в формате<имя_файла_с_функцией>.<имя_обработчика>. -
--memory— объем RAM, доступный функции. -
--execution-timeout— максимальное время выполнения функции до таймаута. -
--source-path— локальный путь к созданному ранее ZIP-архивуservlet.zipс кодом функции и необходимыми зависимостями. -
--environment— переменные окружения в форматеkey=value:ENDPOINT— первая часть значения поляendpoint, сохраненного при создании базы данных (часть между вхождениямиgrpcs://и/?database=). Например,ydb.serverless.yandexcloud.net:2135.DATABASE— вторая часть значения поляendpoint(часть после вхождения/?database=). Например:/ru-central1/b1gj9ja2h4ct********/etnjkrvloo7k********.
Результат:
done (52s) id: d4eve0ahaf3e******** function_id: d4e3reah34e0******** created_at: "2026-06-01T05:18:34.900Z" ... log_options: folder_id: b1g5bhjofg7o********Подробнее о команде
yc serverless function version createчитайте в справочнике CLI. -
-
Сделайте функцию публичной:
yc serverless function allow-unauthenticated-invoke add-taskПодробнее о команде
yc serverless function allow-unauthenticated-invokeчитайте в справочнике CLI. -
Повторите действия 1–3, чтобы создать функцию с именем
list-tasksи точкой входаyandex.cloud.examples.serverless.todo.ListTasksServlet. -
Повторите действия 1–3, чтобы создать функцию с именем
delete-taskи точкой входаyandex.cloud.examples.serverless.todo.DeleteTaskServlet.
Создайте 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_id: <идентификатор_сервисного_аккаунта> 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_id— идентификатор сервисного аккаунта, созданного при подготовке окружения.- Блок
/add, параметрfunction_id— идентификатор функцииadd-task. - Блок
/list, параметрfunction_id— идентификатор функцииlist-tasks. - Блок
/delete, параметрfunction_id— идентификатор функцииdelete-task.
-
Нажмите кнопку Создать.
-
В открывшемся списке API-шлюзов нажмите на созданный шлюз и сохраните URL-адрес созданного API-шлюза (значение поля Служебный домен).
-
Создайте файл
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_id: <идентификатор_сервисного_аккаунта> 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_id— идентификатор сервисного аккаунта, созданного при подготовке окружения.- Блок
/add, параметрfunction_id— идентификатор функцииadd-task, сохраненный ранее. - Блок
/list, параметрfunction_id— идентификатор функцииlist-tasks, сохраненный ранее. - Блок
/delete, параметрfunction_id— идентификатор функцииdelete-task, сохраненный ранее.
-
Создайте API-шлюз, указав в команде локальный путь к созданному ранее файлу
todo.yaml:yc serverless api-gateway create \ --name todo-list \ --spec "./todo.yaml" \ --description "simple todo list"Результат:
done (2s) id: d5d9ut8546r7******** folder_id: b1g5bhjofg7o******** created_at: "2026-06-01T05:49:08.648Z" name: todo-list description: simple todo list status: ACTIVE domain: d5d9ut8546r7********.wnq2w1o5.apigw.yandexcloud.net connectivity: {} log_options: folder_id: b1g5bhjofg7o******** execution_timeout: 300sСохраните доменное имя (значение поля
domain) созданного API-шлюза. Шлюз будет доступен по URL-адресуhttps://<доменное_имя>.Подробнее о команде
yc serverless api-gateway createчитайте в справочнике CLI.
Проверьте работу приложения
Чтобы открыть приложение, в браузере перейдите по URL-адресу созданного API-шлюза. Если все было настроено правильно, в открывшемся приложении вы сможете создавать, просматривать и удалять задачи.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
- Удалите API-шлюз.
- Удалите функции.
- Удалите базу данных.
- Удалите файл
index.html, затем удалите бакет.
Требования к имени:
- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
Имя бакета должно быть уникальным в пределах сервиса Yandex Object Storage. Подробнее читайте в разделе Именование бакетов.
В зависимости от требований пользователя к длительности хранения объектов и частоте операций с ними Yandex Object Storage предоставляет хранилища разных классов. Подробнее читайте в разделе Класс хранилища.
Базы данных YDB типа Serverless не требуют от пользователя какого-либо конфигурирования, администрирования, отслеживания загрузки или управления ресурсами. Подробнее читайте в разделе Режимы работы Serverless и Dedicated.
Функции Yandex Cloud Functions позволяют размещать в Yandex Cloud код, который можно запускать по запросу или триггеру. Подробнее читайте в разделе Функция.
Бакет — это часть хранилища Yandex Object Storage, выделенная для данных пользователя. Подробнее читайте в разделе Бакет в Object Storage.
API-шлюз — это интерфейс взаимодействия с сервисами в интернете или внутри Yandex Cloud, который задается декларативно при помощи спецификации. Подробнее читайте в разделе Взаимосвязь ресурсов в API Gateway.
Роль — это набор разрешений, который определяет допустимые операции с ресурсами в Yandex Cloud. Подробнее читайте в разделе Роли.