Продолжаем разбираться в n8n и в нюансах яндекс облака. Задача на сегодня загрузить файлы в S3, в данном случае будем делать это через телеграм. Для чего? Например есть скрипт, который по расписанию смотрит новые файлы в бакете, загружает и обрабатывать их. Или использовать SpeechKit API v3, так-как для него нужно использовать хранилище от яндекса. Вариантов масса, а мы разберёмся с инструментом.
Другие статьи по теме:
Что должно быть к этому моменту:
- бот в телеграм и его апи ключ
- n8n (в облаке или у себя на сервере)
- учетная запись в яндекс облаке
Готовый шаблон n8n просто импортируете и тестируете:
Настраиваем сервисный аккаунт яндекса для работы с S3:
Первым делом открываем ссылку, переходим на вкладку Сервисные аккаунты и нажимаем единственную кнопку.
Далее будет большая синяя кнопка (нет, вы не проснетесь с мыслью что это всего лишь сон и нужно было нажать на красную) - 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 это те ключи которые мы сохранили ранее. Сохранили же?
Смотрим на шаблон и пытаемся понят что тут происходит:
- Telegram Trigger и Switch как и в прошлый раз, один ждёт сообщение, второй классифицирует сообщение. Нам нужна ветка document, она сработает при отправке файла в бота.
- Bucket Name - задаем заранее имя бакета которое будем использовать в нодах далее.
- Search Bucket - ищём нужный нам бакет, если его нет, то перейдем в ноду создания, если он есть, перейдём в ноду загрузки файла.
(!) Важно, замечено уже после, если стоит Return all, то на каждый файл в бакете будет передано в s3UploadFile и один ваш файл будет грузиться несколько раз. Убираем этот параметр и ставим лимит на 1. Или добавляем ноду Limit с параметром Max Items 1
4. Create Bucket - если мы ранее не нашли, то на этом этапе его создадим.
5. Download File - загружает файл из телеграм.
6. БЕСКОНЕЧНОСТЬ - между этапами Download File и s3UploadFile может происходить что угодно, все ограничено вашей фантазией и рабочими задачами.
7. 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, именно это сообщение и удалится.
9. Telegram - отправка сообщения пользователю, последняя нода в нашем шаблоне. Отправляет что с файлом все хорошо или произошла ошибка. Чтобы не добавлять ещё одну ноду if, пропишем условие прямо в строке сообщения:
{{ $if($json.success = true, "Файл успешно загружен", "Ошибка загрузки файла") }}
На этом настройка интеграции завершена, можно пользоваться и в п.6 осуществить все свои хотелки с загруженными файлами.
Ознакомиться со стоимость Object Storage можно тут.
Полезность для маленьких проектов:
Каждый месяц не тарифицируются ресурсы стандартного хранилища:
первый 1 ГБ в месяц хранения;
первые 10 000 операций PUT, POST, PATCH, LIST;
первые 100 000 операций GET, HEAD, OPTIONS.
После того как вы израсходуете нетарифицируемый объем услуг, начнет взиматься плата в соответствии с тарифами. Если вы не израсходовали нетарифицируемый объем услуг до конца календарного месяца, остаток обнуляется.