Передать ответы в базу данных с помощью Cloud Functions

Вы можете передавать ответы на форму в базу данных PostgreSQL, созданную в Yandex Cloud, и хранить их там.

Шаг 1. Создать базу данных

  1. Перейдите в консоль Yandex Cloud и выберите каталог, в котором хотите создать базу данных.
  2. На панели слева нажмите и выберите сервис Managed Service for PostgreSQL.
  3. В правом верхнем углу нажмите Создать кластер.
  4. Настройте кластер:
    1. В разделе Базовые параметры заполните поле Имя кластера. Оно может содержать строчные и прописные буквы латинского алфавита, цифры, нижние подчеркивания и дефисы.
    2. В разделе База данных заполните поля Имя БД и Имя пользвателя. Они могут содержать строчные и прописные буквы латинского алфавита, цифры, нижние подчеркивания и дефисы.
    3. В разделе База данных заполните поле Пароль.
    4. В разделе База данных в полях Локаль сортировки (LC_COLLATE) и Локаль набора символов (LC_CTYPE) установите значение en_US.UTF8. После создания базы данных изменить эти параметры не получится.
    5. В разделе Дополнительные настройки включите опции Доступ из консоли управления и Доступ из Serverless.
    6. При желании настройте другие параметры. Подробнее в разделе {#T}.
  5. Нажмите Создать кластер.
  6. Дождитесь, когда в у нового кластера поле Доступность примет значение Alive.

Шаг 2. Создать таблицу

  1. Перейдите на страницу созданного кластера.
  2. На панели слева нажмите SQL.
  3. Выберите подходящее имя пользователя и базу данных, введите пароль и нажмите Подключиться.
  4. Выберите схему public.
  5. В редакторе SQL выполните следующий запрос:
    create table answers(
    	id serial primary key,
    	answer jsonb,
    	created timestamp with time zone default now()
    );
    

Шаг 3. Создать подключение к базе данных

  1. В консоли перейдите обратно в каталог, в котором находится созданный кластер.
  2. На панели слева нажмите и выберите сервис Cloud Functions.
  3. На панели слева нажмите .
  4. В правом верхнем углу нажмите Создать подключение.
  5. Настройте подключение:
    1. Заполните поле Имя. Оно может содержать только строчные буквы латинского алфавита, цифры и дефисы.
    2. В поле Тип выберите PostgreSQL.
    3. Запоните поля Кластер, База данных, Пользователь и Пароль. Введите в них те значения, которые устанавливали при создании кластера в шаге 1.
  6. Нажмите Создать.
  7. Перейдите на страницу подключения и скопируйте значение поля Точка входа.

Шаг 4. Создать сервисный аккаунт

  1. В консоли перейдите обратно в каталог, в котором находится созданный кластер.
  2. В правом верхнем углу нажмите Создать сервисный аккаунт.
  3. В окне создания сервисного аккаунта заполните поля:
    1. Имя может содержать только строчные буквы латинского алфавита, цифры и дефисы.
    2. Описание может содержать любые символы.
    3. В поле Роли в каталоге добавьте следующие роли:
      • serverless.functions.invoker
      • serverless.mdbProxies.user
  4. Нажмите Создать.

Шаг 5. Создать ключ сервисного аккаунта

  1. В консоли перейдите обратно в каталог, в котором находится созданный кластер.
  2. Перейдите на вкладку Сервисные аккаунты.
  3. Выберите нужный аккаунт.
  4. На странице аккаунта на верхней панели нажмите Создать новый ключСоздать API-ключ.
  5. Напишите краткое описание ключа.
  6. Нажмите Создать.
  7. Откроется окно с идентификатором ключа и секретным ключом. Сохраните их в безопасном месте. После закрытия окна доступ к ним получить нельзя.

Шаг 6. Создать облачную функцию

  1. В консоли перейдите обратно в каталог, в котором находится созданный кластер.

  2. На панели слева нажмите и выберите сервис Cloud Functions.

  3. В правом верхнем углу нажмите Создать функцию.

  4. На странице создания функции заполните поля:

    1. Имя может содержать только строчные буквы латинского алфавита, цифры и дефисы.
    2. Описание может содержать любые символы.
  5. Выберите язык программирования Python.

  6. Создайте файл requirements.txt и напишите в нем строку:

    psycopg2
    
  7. Создайте или отредактируйте файл 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. Скопировать его можно на странице подключения.
  8. Нажмите Сохранить изменения.

  9. На странице функции скопируйте значение ее поля Идентификатор.

Шаг 7. Настроить интеграцию

  1. Перейдите в форму, ответы на которую хотите передавать в базу данных, и выберите вкладку Интеграции.
  2. Выберите группу действий, в которой хотите настроить создание задачи, и внизу группы нажмите кнопку Cloud Functions.
  3. В поле Код функции вставьте идентификатор функции, который скопировали в предыдущем шаге.
  4. При желании в разделе Параметры выберите дополнительные параметры, которые хотите передать в функцию.
  5. Нажмите Сохранить.

Теперь все ответы на эту форму будут дополнительно сохраняться в вашей базе данных в таблице answers.