Найти в Дзене
Diz Kragnet

Подключаем Яндекс Object Storage (S3) к платформе n8n

Продолжаем разбираться в n8n и в нюансах яндекс облака. Задача на сегодня загрузить файлы в S3, в данном случае будем делать это через телеграм. Для чего? Например есть скрипт, который по расписанию смотрит новые файлы в бакете, загружает и обрабатывать их. Или использовать SpeechKit API v3, так-как для него нужно использовать хранилище от яндекса. Вариантов масса, а мы разберёмся с инструментом. Первым делом открываем ссылку, переходим на вкладку Сервисные аккаунты и нажимаем единственную кнопку. Далее будет большая синяя кнопка (нет, вы не проснетесь с мыслью что это всего лишь сон и нужно было нажать на красную) - cоздать сервисный аккаунт. Указываем имя и добавляем роли: storage.uploader - позволяет загружать и перезаписывать файлы, а так-же уже включает в себя роль storage.viewer storage.editor - если вы хотите создавать новые бакеты через api, в нашем примере так и есть, то эта роль обязательна. Если вы вручную будете создавать бакеты под нужные задачи и автоматизации не будет,
Оглавление

Продолжаем разбираться в n8n и в нюансах яндекс облака. Задача на сегодня загрузить файлы в S3, в данном случае будем делать это через телеграм. Для чего? Например есть скрипт, который по расписанию смотрит новые файлы в бакете, загружает и обрабатывать их. Или использовать SpeechKit API v3, так-как для него нужно использовать хранилище от яндекса. Вариантов масса, а мы разберёмся с инструментом.

Другие статьи по теме:

Что должно быть к этому моменту:

  1. бот в телеграм и его апи ключ
  2. n8n (в облаке или у себя на сервере)
  3. учетная запись в яндекс облаке

Готовый шаблон n8n просто импортируете и тестируете:

S3_Yandex_dzen.json

Настраиваем сервисный аккаунт яндекса для работы с S3:

Первым делом открываем ссылку, переходим на вкладку Сервисные аккаунты и нажимаем единственную кнопку.

-2

Далее будет большая синяя кнопка (нет, вы не проснетесь с мыслью что это всего лишь сон и нужно было нажать на красную) - cоздать сервисный аккаунт. Указываем имя и добавляем роли:

storage.uploader - позволяет загружать и перезаписывать файлы, а так-же уже включает в себя роль storage.viewer

storage.editor - если вы хотите создавать новые бакеты через api, в нашем примере так и есть, то эта роль обязательна. Если вы вручную будете создавать бакеты под нужные задачи и автоматизации не будет, то она не нужна.

Если мы будем использовать шифрование, тогда нужны будут ещё 2 роли: storage.configurer и kms.keys.encrypterDecrypter

Может содержать строчные буквы латинского алфавита, цифры и дефисы. Первым символом должна быть буква, дефис не может быть последним символом.
Может содержать строчные буквы латинского алфавита, цифры и дефисы. Первым символом должна быть буква, дефис не может быть последним символом.

Открываем наш новый аккаунт и создаём новый статический ключ, сохраняем его и идём настраивать соединение в n8n

Настраиваем соединение в n8n для подключения S3

Нажимаем на + слева вверху и кнопку credential, в поиске ввожим s3 и нажимаем continue.

В S3 Endpoint указываем http://storage.yandexcloud.net

Region оставляем пустым, Access Key ID и Secret Access Key это те ключи которые мы сохранили ранее. Сохранили же?

Смотрим на шаблон и пытаемся понят что тут происходит:

  1. Telegram Trigger и Switch как и в прошлый раз, один ждёт сообщение, второй классифицирует сообщение. Нам нужна ветка document, она сработает при отправке файла в бота.
  2. Bucket Name - задаем заранее имя бакета которое будем использовать в нодах далее.
  3. Search Bucket - ищём нужный нам бакет, если его нет, то перейдем в ноду создания, если он есть, перейдём в ноду загрузки файла.

(!) Важно, замечено уже после, если стоит Return all, то на каждый файл в бакете будет передано в s3UploadFile и один ваш файл будет грузиться несколько раз. Убираем этот параметр и ставим лимит на 1. Или добавляем ноду Limit с параметром Max Items 1

4. Create Bucket - если мы ранее не нашли, то на этом этапе его создадим.

5. Download File - загружает файл из телеграм.

6. БЕСКОНЕЧНОСТЬ - между этапами Download File и s3UploadFile может происходить что угодно, все ограничено вашей фантазией и рабочими задачами.

7. s3UploadFile - тут немного задержимся.

s3UploadFile и его настройки
s3UploadFile и его настройки

Resource - File: работаем с файлами

Operation - Upload: Загрузка файла на сервер

Bucket Name: {{ $('Bucket Name').item.json.bucket_name }} тут мы забираем значение из п.2, это значение используется во всех нодах S3 нашего шаблона. Удобно и не нужно прописывать по несколько раз.

File Name: Самое интересное, папки в бакете можно не создавать заранее, при загрузке файла с именем очень-важная-папка/не-менее-важный-файл будет создана очень-важная-папка и уже в неё загрузится не-менее-важный-файл. В нашем примере структура такая: папка telegram/ в ней папка docs/, в ней папка с ID пользователя телеграм/ и вот тут будет лежать наш загруженный файл (!) с тем же именем файла как мы отправляли.

Binary File: сам файл полученный ранее.

На этом этапе основная задача выполнена, файл загружен и его можно увидеть в админке.

Наши загруженный файлы через телеграм
Наши загруженный файлы через телеграм

У нас остались 2 необязательных пункта. Одним я пользуюсь при отправке боту комманд на выполнение и они сильно забивают чат, поэтому избавляемя от них.

8. DeleteMessage - просто удаляем это сообщение которое мы только что отправили. Например мы отправили комманду /help, бот и так нам пришлёт список всех комманд (ну или что у вас там запрограммировано) и если мы часто используем, то оно засоряет чат. Тут важное поле Message ID которое мы получаем из Telegram Trigger, именно это сообщение и удалится.

-10

9. Telegram - отправка сообщения пользователю, последняя нода в нашем шаблоне. Отправляет что с файлом все хорошо или произошла ошибка. Чтобы не добавлять ещё одну ноду if, пропишем условие прямо в строке сообщения:

json.success передаётся из ноды s3UploadFile, так-же если не хотите видеть подпись в сообщении телеграм "This message was sent automatically with n8n" - нажмите Add Field, выберите "Append n8n Attribution" и выключите его
json.success передаётся из ноды s3UploadFile, так-же если не хотите видеть подпись в сообщении телеграм "This message was sent automatically with n8n" - нажмите Add Field, выберите "Append n8n Attribution" и выключите его
{{ $if($json.success = true, "Файл успешно загружен", "Ошибка загрузки файла") }}

На этом настройка интеграции завершена, можно пользоваться и в п.6 осуществить все свои хотелки с загруженными файлами.

Ознакомиться со стоимость Object Storage можно тут.

Полезность для маленьких проектов:

Каждый месяц не тарифицируются ресурсы стандартного хранилища:
первый 1 ГБ в месяц хранения;
первые 10 000 операций PUT, POST, PATCH, LIST;
первые 100 000 операций GET, HEAD, OPTIONS.
После того как вы израсходуете нетарифицируемый объем услуг, начнет взиматься плата в соответствии с тарифами. Если вы не израсходовали нетарифицируемый объем услуг до конца календарного месяца, остаток обнуляется.