Поставка данных из Yandex Forms в Yandex DataLens с использованием Yandex Cloud Functions и Yandex Query при помощи консоли управления
Чтобы настроить интеграцию Forms и DataLens через консоль управления:
- Подготовьте инфраструктуру.
- Создайте функцию Yandex Cloud Functions.
- Создайте форму в Forms.
- Настройте подключение и привязку к данным в сервисе Yandex Query.
- Настройте получение данных в DataLens.
- Протестируйте интеграцию созданных ресурсов.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входят:
- плата за использование бакета Yandex Object Storage (см. тарифы Object Storage);
- плата за хранение и запросы секретов Yandex Lockbox (см. тарифы Yandex Lockbox);
- плата за вызовы функций и вычислительные ресурсы, выделенные для выполнения функций (см. тарифы Cloud Functions);
- плата за объем считанных из источников данных при исполнении запросов Query (см. тарифы Query);
- плата за использование DataLens в соответствии с тарифным планом (см. тарифы DataLens).
Подготовьте инфраструктуру
Создайте сервисный аккаунт
- В консоли управления
выберите нужный каталог. - В списке сервисов выберите Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта:
forms-integration-sa
. - Нажмите кнопку
Добавить роль и выберите роли:- lockbox.payloadViewer — для чтения секретов Yandex Lockbox.
- functions.functionInvoker — для вызова функции Cloud Functions.
- storage.editor — для чтения и записи данных в бакет Object Storage.
- yq.viewer и yq.invoker — для интеграции DataLens и Query.
- Нажмите кнопку Создать.
Создайте бакет Object Storage
В бакете Object Storage будут сохраняться данные из Forms.
- В консоли управления
выберите нужный каталог. - В списке сервисов выберите Object Storage.
- Нажмите кнопку Создать бакет.
- Введите Имя бакета.
- Нажмите кнопку Создать бакет.
Назначьте сервисному аккаунту права доступа на бакет
-
В консоли управления
выберите нужный каталог. -
В списке сервисов выберите Object Storage.
-
Откройте созданный ранее бакет.
-
Перейдите в раздел Объекты.
-
Нажмите на кнопку
и выберите Настроить ACL. -
В открывшемся окне Редактирование ACL:
- Начните вводить имя сервисного аккаунта
forms-integration
и выберите его из выпадающего списка. - Выберите права доступа READ и WRITE .
- Нажмите кнопку Добавить.
- Нажмите кнопку Сохранить.
- Начните вводить имя сервисного аккаунта
Создайте статический ключ для сервисного аккаунта
- В консоли управления
выберите нужный каталог. - В списке сервисов выберите Identity and Access Management.
- Выберите сервисный аккаунт
forms-integration
. - Перейдите в раздел Обзор.
- Нажмите кнопку Создать новый ключ и выберите Создать статический ключ доступа.
- Нажмите кнопку Создать.
- В открывшемся окне Новый ключ отобразятся Идентификатор ключа и Ваш секретный ключ. Сохраните их — они понадобятся в дальнейшем.
Создайте секрет Yandex Lockbox для статического ключа
- В консоли управления
выберите нужный каталог. - В списке сервисов выберите Lockbox.
- Нажмите кнопку Создать секрет.
- Введите Имя секрета —
static-key
. - В блоке Данные секрета:
- Выберите Тип секрета — Пользовательский.
- Создайте следующие пары ключ-значение:
-
Идентификатор статического ключа:
- Ключ —
static-key-id
. - Значение — выберите Текст и введите идентификатор статического ключа, созданного ранее.
- Ключ —
-
Значение статического ключа:
- Ключ —
static-key-value
. - Значение — выберите Текст и введите значение статического ключа, созданного ранее.
- Ключ —
-
Создайте и настройте функцию Cloud Functions
-
В консоли управления
выберите нужный каталог. -
В списке сервисов выберите Cloud Functions.
-
Создайте функцию:
- Нажмите кнопку Создать функцию в правом верхнем углу.
- Введите Имя функции —
forms-function
. - Нажмите кнопку Создать.
-
Создайте версию функции:
-
В открывшемся окне Редактор выберите среду исполнения — Python.
-
Отключите опцию Добавить файлы с примерами кода.
-
Нажмите кнопку Продолжить.
-
Выберите Способ создания функции — Редактор кода.
-
В окне редактора функции нажмите кнопку Создать файл.
-
В открывшемся окне введите Имя файла —
forms-integration.py
и нажмите кнопку Создать. -
Вставьте в созданный файл
forms-integration.py
код функции:import boto3 import os import json from botocore.config import Config def get_answers(raw_answers: json) -> json: result = {} for name, value in raw_answers.get('answer').get('data').items(): if name.startswith('answer_choices_'): choices = [] for c in value.get('value'): choices.append(c.get('text')) result[name] = ','.join(choices) else: result[name] = value.get('value') return result def handler(event, context): headers = event.get('headers') form_id = headers.get('X-Form-Id') answer_id = headers.get('X-Form-Answer-Id') body_json = json.loads(event.get('body')) answers_json = get_answers(body_json) aws_access_key_id = os.environ['KEY'] aws_secret_access_key = os.environ['SECRET_KEY'] bucket_name = os.environ['BUCKET'] s3 = boto3.client(service_name='s3', aws_access_key_id=aws_access_key_id,aws_secret_access_key=aws_secret_access_key, endpoint_url='https://storage.yandexcloud.net', region_name='ru-central1', config=Config(request_checksum_calculation="when_required")) s3.put_object(Bucket=bucket_name, Key=f"{form_id}/{answer_id}.json", Body=json.dumps(answers_json)) return { 'statusCode': 200, 'body': "OK", 'headers': { 'Content-Type': 'text/plain', } }
-
В окне редактора функции нажмите кнопку Создать файл.
-
В открывшемся окне введите Имя файла —
requirements.txt
и нажмите кнопку Создать. -
Укажите в созданном файле
requirements.txt
библиотекуboto3
для работы с Object Storage из функции:boto3
-
В поле Точка входа укажите
forms-integration.handler
. -
В поле Сервисный аккаунт выберите созданный ранее аккаунт
forms-integration-sa
. -
В блоке Переменные окружения создайте переменную с названием бакета, в который будут сохраняться результаты выполнения функции:
- Ключ —
BUCKET
. - Значение — имя созданного ранее бакета.
- Ключ —
-
В блоке Секреты Lockbox:
-
Создайте переменную
KEY
для идентификатора статического ключа со следующими параметрами:- Переменная окружения —
KEY
. - Идентификатор секрета — выберите секрет
static-key-id
. - Идентификатор версии — выберите версию с пометкой
latest
. - Ключ секрета — выберите
static-key-id
.
- Переменная окружения —
-
Создайте переменную
SECRET_KEY
для идентификатора статического ключа со следующими параметрами:- Переменная окружения —
SECRET_KEY
. - Идентификатор секрета — выберите секрет
static-key-value
. - Идентификатор версии — выберите версию с пометкой
latest
. - Ключ секрета — выберите
static-key-value
.
- Переменная окружения —
-
-
После создания функции на вкладке Обзор включите опцию Публичная функция:
-
Создайте и настройте форму Forms
Создайте API-ключ
API-ключ нужен для настройки интеграции с Forms.
- В консоли управления
выберите нужный каталог. - В списке сервисов выберите Identity and Access Management.
- Выберите сервисный аккаунт
forms-integration
. - Перейдите в раздел Обзор.
- Нажмите кнопку Создать новый ключ и выберите Создать API-ключ.
- Нажмите кнопку Создать.
- В открывшемся окне Новый ключ отобразятся Идентификатор ключа и Ваш секретный ключ. Сохраните их — они понадобятся в дальнейшем.
Создайте форму
-
Перейдите в сервис Forms
. -
Нажмите кнопку Создать форму.
-
Добавьте в форму хотя бы два любых поля и настройте произвольные вопросы в них.
-
Нажмите кнопку Опубликовать.
-
Сохраните ссылку на опубликованную форму — она понадобится позднее.
Настройте интеграцию с функцией Cloud Functions
-
Перейдите в сервис Forms
. -
Откройте созданную ранее форму.
-
Перейдите на вкладку Настройки.
-
Откройте раздел Дополнительно.
-
В блоке Ключ для запуска облачных функций введите данные созданного ранее API-ключа и нажмите кнопку Сохранить.
-
Откройте вкладку Интеграции.
-
Нажмите кнопку Cloud Functions, чтобы добавить условие для интеграции.
-
В поле Код функции введите идентификатор функции Cloud Functions. Вы можете скопировать идентификатор в разделе Обзор функции Cloud Functions в консоли управления
. -
В поле Показывать сообщение о результате действия выберите Показывать.
-
Нажмите кнопку Сохранить.
Проверьте работу созданной интеграции
-
Перейдите по публичной ссылке созданной ранее формы.
-
Заполните форму и нажмите кнопку Отправить.
-
Перейдите в сервис Forms
. -
Откройте созданную ранее форму.
-
Откройте вкладку Интеграции.
-
Перейдите на страницу Выполненные интеграции.
-
Откройте запись о выполненном действии и убедитесь, что в разделе Ответ получен HTTP-ответ
200 — ОК
. -
Перейдите в консоль управления
и откройте созданный ранее бакет. Убедитесь, что в нем появился JSON-файл с данными из заполненной формы.Название папки, в которой будет расположен файл, соответствует внутреннему идентификатору формы. Сохраните этот идентификатор — он понадобится для следующих шагов.
Все последующие результаты заполнения формы будут сохраняться в этой папке.
-
Заполните форму еще несколько раз, причем одно из полей заполните одинаково хотя бы в двух формах. В дальнейшем это увеличит наглядность при тестировании интеграции.
Настройте подключение и привязку к данным в сервисе Query
- Перейдите в консоль управления
и откройте сервис Query. - На вкладке Соединения нажмите кнопку
Создать. - Создайте соединение со следующими параметрами:
- Имя —
forms-connection
. - Тип —
Object Storage
. - Бакет — имя созданного ранее бакета.
- Сервисный аккаунт —
forms-integration-sa
.
- Имя —
- В открывшемся окне задайте параметры привязки к данным:
- Тип —
Object Storage
. - Соединение —
forms-connection
. - Путь —
/<идентификатор_формы>/
.
Вы можете скопировать идентификатор:- В разделе Объекты бакета Object Storage. Название папки, в которой расположен файл с результатами заполнения формы, соответствует ее идентификатору.
- В адресной строке интерфейса Forms
на странице просмотра или редактирования формы.
- Формат —
json_each-row
. - Колонки — создайте колонки для полей, которые вы задали в форме.
Чтобы Query определил колонки самостоятельно, нажмите кнопку Автоопределить колонки.
- Тип —
Настройте получение данных в DataLens
- Перейдите в сервис DataLens
. - На панели слева выберите
Подключения и нажмите кнопку Создать подключение. - Выберите сервис Query и задайте в открывшемся окне следующие параметры:
- Облако и каталог — выберите облако и каталог, в котором вы создали остальные ресурсы.
- Сервисный аккаунт —
forms-integration-sa
.
- Нажмите кнопку Сохранить изменения и в открывшемся окне задайте имя подключения —
forms-datalens-connection
, затем нажмите кнопку Создать. - Вернитесь на главную страницу сервиса DataLens
и нажмите кнопку Создать датасет. - На панели подключений нажмите
Добавить и выберите подключениеforms-datalens-connection
. - В блоке Таблицы выберите нужную таблицу и перетащите ее в рабочую область DataLens.
После загрузки данные из таблицы появятся на панели Предпросмотр. - Нажмите кнопку Сохранить и введите имя датасета —
forms-integration-dataset
, затем нажмите кнопку Создать.
Протестируйте интеграцию созданных ресурсов
Чтобы проверить совместную работу созданных ресурсов, откройте датасет forms-integration-dataset
и нажмите кнопку Создать чарт. В открывшемся окне создайте произвольный чарт с данными, полученными из формы. Для большей наглядности постройте чарт по тому полю, в котором есть повторяющиеся значения.
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
- Чарт DataLens.
- Датасет DataLens.
- Подключение DataLens.
- Привязку Query.
- Соединение Query.
- Функцию Cloud Functions.
- Секрет Yandex Lockbox.
- Бакеты Object Storage.