Подключение к базе данных Yandex Managed Service for YDB из функции Cloud Functions на Node.js
Примечание
Руководство предназначено для пользователей Linux. На Windows пройти руководство можно в среде WSL
Вы создадите функцию с приложением на Node.jstcs
.
Функция с привязанным сервисным аккаунтом авторизуется в YDB через сервис метаданных.
Приложение создает драйвер подключения к БД YDB, сессию, транзакцию и выполняет запрос, используя библиотеку ydb
. Эта библиотека устанавливается как зависимость при создании версии функции. Параметры подключения к БД передаются в приложение через переменные окружения.
Чтобы настроить подключение к БД YDB:
- Подготовьте облако к работе.
- Подготовьте окружение.
- Создайте сервисный аккаунт.
- Создайте авторизованный ключ.
- Создайте БД YDB.
- Создайте функцию.
- Протестируйте функцию.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры для этого сценария входит:
- Плата за использование функции (см. тарифы Yandex Cloud Functions).
- Плата за выполнение запросов к БД (см. тарифы Yandex Managed Service for YDB).
Подготовьте окружение
-
Клонируйте репозиторий examples
с помощью Git:git clone https://github.com/yandex-cloud/examples.git
-
Установите и инициализируйте интерфейс командной строки Yandex Cloud.
-
Перейдите в корневую директорию проекта:
cd ~/examples/serverless/functions/YDB-connect-from-serverless-function
Все последующие команды выполняйте в этой директории.
-
Установите утилиту jq
:sudo apt-get install jq
-
Установите Node.js
:curl --fail --silent --show-error --location https://deb.nodesource.com/setup_current.x | sudo -E bash - \ sudo apt-get install -y nodejs
-
Установите зависимости:
npm install
Результат:
up to date, audited 269 packages in 1s 29 packages are looking for funding run `npm fund` for details found 0 vulnerabilities
Создайте сервисный аккаунт
- В консоли управления
выберите каталог, в котором хотите создать сервисный аккаунт. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта:
sa-function
. - Нажмите Добавить роль и выберите
editor
. - Нажмите кнопку Создать.
-
Создайте сервисный аккаунт:
yc iam service-account create --name sa-function
Результат:
id: aje028do8n9r******** folder_id: b1g681qpemb4******** created_at: "2023-08-23T06:24:49.759304161Z" name: sa-function
-
Назначьте сервисному аккаунту роль
editor
:yc resource-manager folder add-access-binding <идентификатор_каталога> \ --role editor \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>
Результат:
...1s...done (4s) effective_deltas: - action: ADD access_binding: role_id: viewer subject: id: aje028do8n9r******** type: serviceAccount
Подробнее о командах см. в справочнике CLI.
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
Опишите в конфигурационном файле параметры сервисного аккаунта:
resource "yandex_iam_service_account" "sa" { name = "sa-function" }
Более подробную информацию о ресурсах, которые вы можете создать с помощью Terraform, см. в документации провайдера
. -
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в директорию, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание ресурсов: введите в терминал слово
yes
и нажмите Enter.
-
Чтобы создать сервисный аккаунт и назначить ему роль, воспользуйтесь методами create и setAccessBindings для ресурса ServiceAccount.
Создайте авторизованный ключ
-
В консоли управления
выберите каталог, которому принадлежит сервисный аккаунт. -
В списке сервисов выберите Identity and Access Management.
-
На панели слева выберите
Сервисные аккаунты. -
В открывшемся списке выберите сервисный аккаунт
sa-function
. -
Нажмите кнопку Создать новый ключ на верхней панели.
-
Выберите пункт Создать авторизованный ключ.
-
Выберите алгоритм шифрования.
-
Задайте описание авторизованного ключа, чтобы потом было проще найти его в консоли управления.
-
Сохраните открытую и закрытую части авторизованного ключа в файл
examples/serverless/functions/YDB-connect-from-serverless-function/service_account_key_file.json
:{ "service_account_id": "<идентификатор_сервисного_аккаунта_sa-function>", "key_algorithm": "RSA_2048", "public_key": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----\n", "private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n" }
Выполните команду:
yc iam key create --service-account-name sa-function -o service_account_key_file.json
Подробнее о команде yc iam key create
см. в справочнике CLI.
В случае успеха в файл service_account_key_file.json
будет записан закрытая часть авторизованного ключа (privateKey
) и идентификатор открытой части (id
).
-
Опишите в конфигурационном файле параметры авторизованного ключа:
resource "yandex_iam_service_account_key" "sa-auth-key" { service_account_id = "<идентификатор_сервисного_аккаунта_sa-function>" key_algorithm = "RSA_2048" }
Более подробную информацию о ресурсах, которые вы можете создать с помощью Terraform, см. в документации провайдера
. -
Проверьте корректность конфигурационных файлов.
-
В командной строке перейдите в директорию, где вы создали конфигурационный файл.
-
Выполните проверку с помощью команды:
terraform plan
Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.
-
-
Разверните облачные ресурсы.
-
Если в конфигурации нет ошибок, выполните команду:
terraform apply
-
Подтвердите создание ресурсов: введите в терминал слово
yes
и нажмите Enter.
-
Создайте БД YDB
-
В консоли управления
выберите каталог, в котором хотите создать БД. -
В списке сервисов выберите Managed Service for YDB.
-
Нажмите кнопку Создать базу данных.
-
Введите имя БД. Требования к имени:
- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
В блоке Тип базы данных выберите опцию
Serverless
. -
Нажмите кнопку Создать базу данных.
Дождитесь запуска БД. В процессе создания БД будет иметь статус
Provisioning
. Когда БД станет готова к использованию, статус сменится наRunning
. -
Нажмите на имя созданной БД.
-
Сохраните значение поля Эндпоинт из блока Соединение. Оно понадобится на следующем шаге.
Создайте функцию
Примечание
Перед созданием функции убедитесь, что в файле .env
и файлах create-func.sh
и create-func-ver.sh
из директории deploy
в качестве символа перевода строки установлен LF
.
-
Перейдите в корневую директорию проекта:
cd ~/examples/serverless/functions/YDB-connect-from-serverless-function
-
Отредактируйте файл
.env
:ENDPOINT
— первая часть сохраненного ранее значения поля Эндпоинт (часть до вхождения/?database=
). Например,grpcs://ydb.serverless.yandexcloud.net:2135
.DATABASE
— вторая часть сохраненного ранее значения поля Эндпоинт (часть после вхождения/?database=
). Например,/ru-central1/r1gra875baom********/g5n22e7ejfr1********
.FUNCTION_NAME
— имя функции:func-test-ydb
.FOLDER_ID
— идентификатор каталога.SERVICE_ACCOUNT_ID
— идентификатор сервисного аккаунтаsa-function
.
-
Создайте функцию:
./deploy/create-func.sh
Этот скрипт создает новую функцию в вашем каталоге и делает ее публичной.
-
Создайте версию функции:
./deploy/create-func-ver.sh
Результат:
npx tsc --build tsconfig.json rm: невозможно удалить '../build/func.zip': Нет такого файла или каталога adding: queries/ (stored 0%) adding: queries/clients-table.js (deflated 57%) adding: queries/helpers.js.map (deflated 43%) adding: queries/helpers.js (deflated 48%) adding: queries/clients-table.js.map (deflated 59%) adding: index.js (deflated 49%) adding: index.js.map (deflated 56%) adding: database.js.map (deflated 62%) adding: index-local.js (deflated 42%) adding: package.json (deflated 55%) adding: database.js (deflated 60%) adding: index-local.js.map (deflated 43%) yc function version create func-test-ydb done (27s) id: abcd2d363b4b******** function_id: efghm9el0ja9******** created_at: "2023-08-15T07:41:07.591Z" runtime: nodejs16 entrypoint: index.handler resources: memory: "268435456" execution_timeout: 5s service_account_id: hijk3hlu8gqe******** image_size: "33497088" status: ACTIVE tags: - $latest log_group_id: lmnoivbe341g******** environment: DATABASE: /ru-central1/b1gia87mbaom********/etnilt3o6v9e******** ENDPOINT: grpcs://ydb.serverless.yandexcloud.net:2135 log_options: folder_id: pqrs81qpemb********
Протестируйте функцию
-
В консоли управления
выберите каталог, в котором находится функция. -
В списке сервисов выберите Cloud Functions.
-
Выберите функцию
func-test-ydb
. -
Перейдите на вкладку Обзор.
-
В поле Ссылка для вызова нажмите на ссылку.
-
В адресной строке браузера добавьте в ссылке параметр
api_key
, например?api_key=b95
:https://functions.yandexcloud.net/efghm9el0ja9********?api_key=b95
-
При успешном подключении в БД будет создана таблица
b95
и в нее будет добавлена одна запись. На странице появится сообщение в формате JSON, например:{ "info": "Создана таблица b95, вставлена одна запись" }
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: