Подключение к базе данных Yandex Managed Service for YDB из функции Cloud Functions на Python
В этом сценарии вы создадите функцию с приложением на Python, которое выполняет простой запрос к базе данных YDB.
Функция с привязанным сервисным аккаунтом авторизуется в YDB через сервис метаданных.
Приложение создает драйвер подключения к базе YDB, сессию, транзакцию и выполняет запрос, используя библиотеку ydb
. Эта библиотека устанавливается как зависимость при создании версии функции. Параметры подключения к базе данных передаются в приложение через переменные окружения.
Подготовьте облако к работе
Перед работой нужно зарегистрироваться в Yandex Cloud и создать платежный аккаунт:
- Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь, если вы еще не зарегистрированы.
- На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры для этого сценария входит:
- плата за использование функции (см. тарифы Yandex Cloud Functions);
- плата за выполнение запросов к базе данных (см. тарифы Yandex Managed Service for YDB).
Создайте сервисный аккаунт
-
В консоли управления выберите каталог, в котором хотите создать сервисный аккаунт.
-
Выберите вкладку Сервисные аккаунты.
-
Нажмите кнопку Создать сервисный аккаунт.
-
Введите имя сервисного аккаунта, например
sa-function
. Требования к имени:- Длина — от 3 до 63 символов.
- Может содержать строчные буквы латинского алфавита, цифры и дефисы.
- Первый символ — буква. Последний символ — не дефис.
-
Нажмите Добавить роль и выберите
editor
. -
Нажмите кнопку Создать.
Создайте базу данных YDB
-
В консоли управления выберите каталог, в котором хотите создать базу данных.
-
В списке сервисов выберите Managed Service for YDB.
-
Нажмите кнопку Создать базу данных.
-
Введите имя базы. Требования к имени:
- Длина — от 3 до 63 символов.
- Может содержать строчные буквы латинского алфавита, цифры и дефисы.
- Первый символ — буква. Последний символ — не дефис.
-
В блоке Тип базы данных выберите опцию Serverless.
-
Нажмите кнопку Создать базу данных.
Дождитесь запуска базы данных. В процессе создания база будет иметь статус
Provisioning
. Когда база станет готова к использованию, статус сменится наRunning
. -
Нажмите на имя созданной БД.
-
В блоке YDB эндпоинт найдите поля Эндпоинт и База данных и сохраните их значения. Они понадобятся на следующем шаге.
Создайте функцию
-
В консоли управления выберите каталог, в котором хотите создать функцию.
-
В списке сервисов выберите Cloud Functions.
-
Нажмите кнопку Создать функцию.
-
Введите имя и описание функции. Требования к имени:
- Длина — от 3 до 63 символов.
- Может содержать строчные буквы латинского алфавита, цифры и дефисы.
- Первый символ — буква. Последний символ — не дефис.
-
Нажмите кнопку Создать.
-
В блоке Редактор выберите среду выполнения Python и нажмите Продолжить.
-
В блоке Код функции очистите содержимое файла
index.py
и вставьте в него следующий код:import os import ydb # create driver in global space. driver = ydb.Driver(endpoint=os.getenv('YDB_ENDPOINT'), database=os.getenv('YDB_DATABASE')) # Wait for the driver to become active for requests. driver.wait(fail_fast=True, timeout=5) # Create the session pool instance to manage YDB sessions. pool = ydb.SessionPool(driver) def execute_query(session): # create the transaction and execute query. return session.transaction().execute( 'select 1 as cnt;', commit_tx=True, settings=ydb.BaseRequestSettings().with_timeout(3).with_operation_timeout(2) ) def handler(event, context): # Execute query with the retry_operation helper. result = pool.retry_operation_sync(execute_query) return { 'statusCode': 200, 'body': str(result[0].rows[0].cnt == 1), }
-
В блоке Код функции создайте файл
requirements.txt
и вставьте в него следующий текст:ydb
-
В качестве точки входа укажите
index.handler
. -
Выберите сервисный аккаунт, например
sa-function
. -
Настройте переменные окружения:
-
YDB_ENDPOINT
— введите строку вида<протокол>://<эндпоинт базы данных>
.Например, если протокол
grpcs
, а эндпоинтydb.serverless.yandexcloud.net:2135
, введитеgrpcs://ydb.serverless.yandexcloud.net:2135
. -
YDB_DATABASE
— введите сохраненное ранее значение поля База данных, например/ru-central1/b1gia87mbaomkfvsleds/etn02j1mlm4vgjhij03e
.
-
-
В верхнем правом углу блока Редактор нажмите кнопку Создать версию.
Протестируйте функцию
-
Перейдите на вкладку Тестирование.
-
Нажмите кнопку Запустить тест и посмотрите результат тестирования.
При успешных подключении к БД и выполнении запроса состояние функции изменится на
Выполнена
, а ответ функции будет содержать следующий текст:{ "statusCode": 200, "body": "True" }