Передать ответы в базу данных с помощью Cloud Functions
Статья создана
Обновлена 29 августа 2024 г.
Вы можете передавать ответы на форму в базу данных PostgreSQL, созданную в Yandex Cloud, и хранить их там.
Шаг 1. Создать базу данных
- Перейдите в консоль Yandex Cloud
и выберите каталог, в котором хотите создать базу данных. - На панели слева нажмите
и выберите сервис Yandex Managed Service for PostgreSQL. - В правом верхнем углу нажмите Создать кластер.
- Настройте кластер:
- В разделе Базовые параметры заполните поле Имя кластера. Оно может содержать строчные и заглавные буквы латинского алфавита, цифры, подчеркивания и дефисы.
- В разделе База данных заполните поля Имя БД и Имя пользователя. Они могут содержать строчные и заглавные буквы латинского алфавита, цифры, подчеркивания и дефисы.
- В разделе База данных заполните поле Пароль.
- В разделе База данных в полях Локаль сортировки (LC_COLLATE) и Локаль набора символов (LC_CTYPE) установите значение en_US.UTF8. После создания базы данных изменить эти параметры не получится.
- В разделе Дополнительные настройки включите опции Доступ из консоли управления и Доступ из Serverless.
- При желании настройте другие параметры. Подробнее в разделе Создание кластера PostgreSQL.
- Нажмите Создать кластер.
- Дождитесь, когда в у нового кластера поле Доступность примет значение Alive.
Шаг 2. Создать таблицу
- Перейдите на страницу созданного кластера.
- На панели слева нажмите SQL.
- Выберите подходящее имя пользователя и базу данных, введите пароль и нажмите Подключиться.
- Выберите схему public.
- В редакторе SQL выполните следующий запрос:
create table answers( id serial primary key, answer jsonb, created timestamp with time zone default now() );
Шаг 3. Создать подключение к базе данных
- В консоли
перейдите обратно в каталог, в котором находится созданный кластер. - На панели слева нажмите
и выберите сервис Cloud Functions. - На панели слева нажмите
. - В правом верхнем углу нажмите Создать подключение.
- Настройте подключение:
- Заполните поле Имя. Оно может содержать только строчные буквы латинского алфавита, цифры и дефисы.
- В поле Тип выберите PostgreSQL.
- Запоните поля Кластер, База данных, Пользователь и Пароль. Введите в них те значения, которые устанавливали при создании кластера в шаге 1.
- Нажмите Создать.
- Перейдите на страницу подключения и скопируйте значение поля Точка входа.
Шаг 4. Создать сервисный аккаунт
- В консоли
перейдите обратно в каталог, в котором находится созданный кластер. - В правом верхнем углу нажмите
→ Создать сервисный аккаунт. - В окне создания сервисного аккаунта заполните поля:
- Имя может содержать только строчные буквы латинского алфавита, цифры и дефисы.
- Описание может содержать любые символы.
- В поле Роли в каталоге добавьте следующие роли:
serverless.functions.invoker
serverless.mdbProxies.user
- Нажмите Создать.
Шаг 5. Создать ключ сервисного аккаунта
- В консоли
перейдите обратно в каталог, в котором находится созданный кластер. - Перейдите на вкладку Сервисные аккаунты.
- Выберите нужный аккаунт.
- На странице аккаунта на верхней панели нажмите Создать новый ключ → Создать API-ключ.
- Напишите краткое описание ключа.
- Нажмите Создать.
- Откроется окно с идентификатором ключа и секретным ключом. Сохраните их в безопасном месте. После закрытия окна доступ к ним получить нельзя.
Шаг 6. Создать облачную функцию
-
В консоли
перейдите обратно в каталог, в котором находится созданный кластер. -
На панели слева нажмите
и выберите сервис Cloud Functions. -
В правом верхнем углу нажмите Создать функцию.
-
На странице создания функции заполните поля:
- Имя может содержать только строчные буквы латинского алфавита, цифры и дефисы.
- Описание может содержать любые символы.
-
Выберите язык программирования Python.
-
Создайте файл
requirements.txt
и напишите в нем строку:psycopg2
-
Создайте или отредактируйте файл
index.py
:import json import psycopg2 def run_function(connection, answer, **params) -> int: data = { 'answer': answer, 'params': params, } args = (json.dumps(data), ) with connection.cursor() as c: c.execute('insert into answers(answer) values(%s) returning id', args) rs = c.fetchone() connection.commit() return rs[0] def get_connection(context): return psycopg2.connect( database="<идентификатор_подключения>", user="<имя_пользователя>", password=context.token["access_token"], host="<точка_входа>", port=6432, sslmode="require", ) def handler(event, context): body = json.loads(event.get('body')) params = { name: value for name, value in body.items() if name != 'answer' } connection = get_connection(context) result = { 'id': run_function(connection, body.get('answer'), **params), } return { 'statusCode': 200, 'body': result, 'headers': { 'Content-Type': 'application/json', } }
В этой функции подставьте значения:
<идентификатор_подключения>
— значение поля Идентификатор подключения к базе данных, которое вы создавали в шаге 3. Скопировать его можно на странице подключения.<имя_пользователя>
— имя пользователя базы данных, которое вы вводили при настройке кластера в шаге 1. Найти его можно на странице кластера во вкладке Пользователи.<точка_входа>
— значение поля Точка входа в подключении к базе данных, которое вы создавали в шаге 3. Скопировать его можно на странице подключения.
-
Нажмите Сохранить изменения.
-
На странице функции скопируйте значение ее поля Идентификатор.
Шаг 7. Настроить интеграцию
- Перейдите в форму, ответы на которую хотите передавать в базу данных, и выберите вкладку Интеграции.
- Выберите группу действий, в которой хотите настроить создание задачи, и внизу группы нажмите кнопку Cloud Functions.
- В поле Код функции вставьте идентификатор функции, который скопировали в предыдущем шаге.
- При желании в разделе Параметры выберите дополнительные параметры, которые хотите передать в функцию.
- Нажмите Сохранить.
Теперь все ответы на эту форму будут дополнительно сохраняться в вашей базе данных в таблице answers.