Из 1С в S3 и обратно. Работа с объектным хранилищем

06.02.24

Интеграция - Облачные сервисы, хостинг

В данной статье демонстрируется работа с объектным хранилищем 1С с использованием подписанных (pre-signed) ссылок. Загрузка, скачивание и удаление реализованы на "чистом" языке 1С без внешних компонент и сервисов. В качестве провайдера хранилища S3 будем использовать Яндекс.Облако

Об S3 (Simple Storage Service)

S3 (Simple Storage Service) — это сервис облачного хранения данных от компании Amazon. Он позволяет хранить и получать данные в любом объеме и в любое время.

Принцип работы S3 заключается в том, что данные хранятся на распределенной сети серверов, расположенных в разных дата-центрах. Это обеспечивает высокую надежность и доступность данных. Кроме того, S3 поддерживает георепликацию данных, то есть автоматическое копирование данных в несколько регионов для обеспечения их доступности в случае аварий или сбоев.

Для работы с S3 используются специальные API, которые позволяют загружать, скачивать и удалять файлы, а также управлять доступом к ним. Также S3 интегрирован с многими другими сервисами Amazon, что позволяет использовать его в комплексе с другими облачными сервисами.

 

Как работает S3

Сервис включает доступ к защищенному облачному хранилищу, API-интерфейс с прямым доступом к хранимым объектам через интернет и дополнительные опции, зависящие от поставщика сервиса.

Объект в S3 — это двоичные данные, которые хранятся в бакете (backet). Каждый объект имеет свой уникальный ключ, который используется для доступа к нему. Ключи объектов могут быть любой длины и содержать любые символы, кроме ‘/’, '' и ‘+’.
Кроме того объект содержит метаданные - прочие значимые атрибуты объекта (размер, тип и другие пользовательские данные для отбора и сортировки). Они нужны, чтобы находить однотипные объекты и работать с ними.

 

Инструменты для работы

Для работы с хранилищем S3 существует несколько инструментов: консольные клиенты (AWS CLIS3cmd), файловые браузеры (CyberduckWinSCP), а так же SDK для популярных языков программирования - JavaJavaScriptPython.NETC++PHPGo.
Для 1С готовых решений нет. Однако, поскольку 1С:Предприятие 8.3 поддерживает выполнение HTTP запросов из коробки, можно реализовать основные функции с использованием механизма подписанных (pre-signed) ссылок.

С помощью подписанных ссылок произвольный пользователь Сети может выполнять с хранилищем S3 различные операции, например, скачать, загрузить или удалить объект.

Подписанная ссылка — это URL, содержащий данные для авторизации запроса в своих параметрах. Составить подписанный URL может пользователь, владеющий статическими ключами доступа.  Описание создание подписанной ссылки для Amazon Simple Storage Service можно изучить по ссылке.

В качестве примера для практической реализации механизма мы будем использовать ресурсы Object Storage Яндекс.Облако.

 
 Общий вид подписанной ссылки в Яндекс.Облако

 

 

Создание бакета и получение ключей доступа.

Для работы вы должны предварительно авторизоваться в консоли управления и создать платежный аккаунт. При первой регистрации выдается стартовый грант, который действует в течении 60 дней и позволит использовать ресурсы без оплаты. Подробнее о начале работы в облаке можно прочитать по ссылке.

Далее выберите каталог, в котором хотите создать бакет и нажмите кнопку Создать ресурс и выберите Бакет. Укажите имя бакета, которое должно быть уникальным для всего Object Storage. Это имя используется как часть URL для доступа к данным и его будут видеть пользователи. При необходимости можно ограничить размер. Обратите внимание, что на данный момент первый гигабайт хранения не тарифицируется. В качестве класса хранилище укажите Стандартное. Подробнее о классах хранилищ можно прочитать тут.

Для для доступа к бакету и формирования подписанных ссылок следует получить статические ключи доступа. Для этого в консоли управления в верхней части экрана перейдите на вкладку Сервисные аккаунты. Выбираем аккаунт с нужными правами и жмем кнопку Создать новый ключ на верхней панели и выбираем Создать статический ключ доступа. Копируем ключи из диалогового окна в надежное место, так как после закрытия диалога значение ключей уже будет недоступно. С помощью них мы будем подписывать ссылки для доступа к хранилищу.

 

Реализация.

Подписанная ссылка для работы с Object Storage Яндекса должна иметь следующие параметры:

  • X-Amz-Algorithm - идентифицирует версию подписи и алгоритм ее вычисления. Это константа, значение AWS4-HMAC-SHA256.
  • X-Amz-Date - время в формате ISO8601, например, 20180719T094539Z. Указанная дата должна по значению (не по формату) совпадать с датой в параметре X-Amz-Credential.
  • X-Amz-Expires - время в секундах, в течение которого ссылка действительна. Начало отсчета — момент, указанный в параметре X-Amz-Date. Максимальное значение — 2592000 секунд (30 дней).
  • X-Amz-SignedHeaders  - заголовки запроса, которые вы хотите подписать. Обязательно следует подписать заголовок Host и все заголовки X-Amz-*, которые используются в запросе, в том числе заголовки метаданных X-Amz-Meta-*.  Другие заголовки подписывать не обязательно, однако чем больше вы подпишете заголовков, тем безопаснее будет запрос. Заголовки запроса отделяются символами ;.
  • X-Amz-Credential - идентификатор для подписи. Строка формата <идентификатор_ключа_доступа>/<дата>/ru-central1/s3/aws4_request, где <дата> (в формате YYYYMMDD — год, месяц, день) должна совпадать с датой, установленной в заголовке X-Amz-Date.
  • X-Amz-Signature - подпись запроса, формирование которой будет описано далее.

В первую очередь следует отметить то, что механизм подписания ссылок использует HMAC с хэширующей функцией SHA256. Данный механизм был реализован средствами 1С:Предприятие 8.3.

 
 Реализация HMAC с SHA256

Опишем вспомогательные функции для формирования подписанной ссылки:

 
 Служебные функции

И собственно сама функция.

 
СоздатьСсылку(КлючДоступа, СекретныйКлюч, Бакет, Путь, Метод="GET", ВремяЖизни=300, Заголовки=Неопределено)

В качестве параметров принимает следующие аргументы:

  • КлючДоступа, СекретныйКлюч - ключи, полученные в консоли управления Яндекс.Облако
  • Бакет - имя бакета, который Вы создали в консоли.
  • Метод:
    • GET - получение данных из хранилища
    • PUT - отправка данных в хранилище
  • ВремяЖизни - время жизни ссылки, максимальное значение — 2592000 секунд (30 дней).
  • Заголовки - заголовки метаданных. Ключи всегда должны начинаться на X-Amz-Meta-. Например X-Amz-Meta-Author, X-Amz-Meta-KratkoeOpisanie.

По описанию на Amazon, стандарт позволяет производить загрузку данных частями. Т.е. можно обрабатывать большие файлы частями - последовательно или параллельно. Однако у Яндекса я не нашел описания в документации, поэтому не пробовал это реализовать. А с иностранными облаками сейчас проблемы.

 

Примеры использования

 
 Отправка данных
 
 Получение данных

 

Выводы

Объектное хранилище S3 отличный инструмент для надежного хранения данных. Сферы его использования варьируются от озер данных до структурированных файловых хранилищ. 

Описанный вариант интеграции с 1С можно использовать, например, для отправки данных в облачные СУБД (YDB, ClickHouse) для последующего доступа к ним из BI-систем (Datalens).

Или просто для хранения резервных копий информационных баз.

S3 Яндекс.Облако AWS-S3 Хранилище Интеграция

См. также

Внешние источники данных Облачные сервисы, хостинг Программист Бизнес-аналитик Пользователь Руководитель проекта Платформа 1С v8.3 8.3.14 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Бытовые услуги, сервис Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Гостиничный бизнес Рестораны, кафе и фаст-фуд Реклама, PR и маркетинг Легкая промышленность, мода и одежда Управленческий учет Платные (руб)

Расширение позволяет автоматизировать управление картами лояльности и взаимодействие с покупателями при помощи интеграции корпоративной системы 1С и специализированного облачного сервиса "CARDPR". Автоматическая онлайн синхронизация сведений о владельце электронной карты лояльности и баланса бонусных баллов на карте между корпоративной системой 1С и мобильным устройством покупателя. Оповещение покупателя об изменении баланса его электронной карты лояльности и проведении каких-либо маркетинговых акций в компании при помощи рассылки push-сообщений на его мобильное устройство.

36000 руб.

20.07.2023    3202    1    2    

11

Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Облачные сервисы, хостинг Программист Пользователь Платформа 1С v8.3 Управляемые формы 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Данная система предназначена всем, кому нужно выгружать данные в SPOT 2D или в ОРИМИ. Позволяет гибко настроить получение данных для каждого поля файла и файла выгрузки в целом. Имеет отборы по организации, складу, и папкам номенклатуры. Есть возможность выгружать данные как вручную, с выбором конкретного файла, за конкретный период, так и в автоматическом режиме в указанное вами время. Выгрузка может выполняться в файл или через http напрямую. Имеется подробная справка по настройке, а также примеры запросов для приведенных в примерах файлов выгрузки. Может работать в составе любой конфигурации! Обновление от 31.03.2020!

14400 руб.

19.10.2018    28699    7    1    

9

Облачные сервисы, хостинг Linux Тестирование QA Сервера Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Завершающая публикация цикла "В облако на работу:.. Рецепты от Капитана", в ходе которых был собран полнофункциональный рабочий контур 1С в сети на отечественной Ред ОС. С веб-серверами, доменной авторизацией, архивированием, отказоустойчивостью и прочая, прочая... В этой статье мы определяемся с быстродействием системы, проводим нагрузочное тестирование и отпускаем ее в свободное плавание (зачеркнуто) выпускаем ее в продуктовый контур, где, конечно же, придется отлавливать ошибки, мониторить состояние и т.п.

31.10.2024    1308    capitan    0    

0

Облачные сервисы, хостинг Linux Сервера Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Одна из завершающих публикаций цикла "В облако на работу:.. Рецепты от Капитана", в ходе которых был собран полнофункциональный рабочий контур 1С в сети на отечественной Ред ОС. С веб-серверами, доменной авторизацией, архивированием и прочая, прочая... На закуску разбираемся с отказоустойчивостью. В этой публикации для серверов 1С заодно попробуем подобно сериалу «Разрушители легенд» подтвердить или опровергнуть пару устойчивых мифов о требованиях назначения функциональности.

18.10.2024    1703    capitan    5    

12

Облачные сервисы, хостинг Бесплатно (free)

Перенос 1С в облако — это процесс, который требует тщательного планирования и грамотного исполнения, чтобы избежать простоев и обеспечить бесперебойную работу системы. В этой статье рассмотрим пошаговую инструкцию по переносу 1С в облако, уделяя особое внимание минимизации рисков и обеспечению беспрерывной работы вашего бизнеса.

02.09.2024    443    EFSOL_oblako    0    

-2

Облачные сервисы, хостинг Системный администратор Программист Бесплатно (free)

Примеры решения некоторых насущных проблем при работе с облачными сервисами, покрываемых CLI версией Открытого пакета интеграций - OInt CLI.

05.08.2024    1833    bayselonarrend    7    

26

Облачные сервисы, хостинг Linux Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Одна из завершающих публикаций цикла "В облако на работу:.. Рецепты от Капитана" в ходе которых был собран полнофункциональный рабочий контур 1С в сети на отечественной Ред ОС. С веб-серверами, доменной авторизацией, архивированием и прочая прочая... Это основное блюдо, на закуску разберемся с отказоустойчивостью. В этой публикации для PostgreSQL, заодно попробуем сделать это по новому.

17.06.2024    7649    capitan    18    

40

Облачные сервисы, хостинг Linux Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

В прошлых публикациях мы, не торопясь, после настройки персонального рабочего места на РедОС 7.3, посмотрели РедОС 8 и почти полностью собрали рабочую сеть 1С на отечественной ОС подходящую для работы среднего размера компании. С веб-серверами, доменной авторизацией и прочая прочая... Осталось настроить регулярное архивирование, чтобы не потерять нажитое.

27.05.2024    1455    capitan    6    

9
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Viktor_Ermakov 369 07.02.24 13:17 Сейчас в теме
спасибо за труд, хорошая статья
artbear; Sedaiko; +2 Ответить
2. laperuz 47 07.02.24 17:54 Сейчас в теме
Для полноты статьи стоит упомянуть, что начиная с 8.3.24 в платформе реализована нативная поддержка S3, правда только с КОРП лицензией
https://its.1c.ru/db/v8324doc/bookmark/cs/TI000000349
METAL; Sedaiko; o.nikolaev; +3 Ответить
4. Sedaiko 590 08.02.24 01:04 Сейчас в теме
(2) Спасибо, прозевал инфу. Давно делал реализацию.
Маловероятно, что в ПРОФ появится. Тем более что это фишка клиент-серверного инстанса
11. JohnyDeath 302 11.02.24 19:35 Сейчас в теме
(2) там немного про другое: дали возможность автоматом сохранять двоичные данные в S3, но кодом свой любой файл в нужное тебе хранилище ты никак не отправишь.
Я отправлял запрос в бота 1С, чтобы они дали возможность простым разработчикам удобно работать с S3 хранилищами, ведь внутри платформы всё уже есть, осталось пробросить это для нас наверх и описать в документации.
3. o.nikolaev 216 08.02.24 00:37 Сейчас в теме
5. baracuda 2 08.02.24 09:11 Сейчас в теме
А есть ли бесплатные варианты что у себя на сервере можно было поднять S3 подобное хранилище?
6. S_Vidyaev 08.02.24 11:46 Сейчас в теме
Тоже приходилось реализовывать когда-то. Хочу добавить, что AWS4 аутентификация очень удобно сделана в Коннекторе

(5) Есть, много. например, ceph
kasper076; baracuda; Sedaiko; +3 Ответить
7. Sedaiko 590 08.02.24 13:54 Сейчас в теме
(5) MinIO
Но смысл все на одном сервере? сама фишка объектного хранилища - горизонтальное масштабирование и резервирование данных на разных узлах.
S_Vidyaev; +1 Ответить
8. baracuda 2 08.02.24 14:21 Сейчас в теме
(7) политиками безопасности например может быть запрещено размещение данных на внешних ресурсах.
9. BlizD 1081 08.02.24 20:07 Сейчас в теме
Спасибо. За статью.

Несколько лет назад делал расширение для хранение файлов на s3 вместо томов на диске.

Возможно будет кому полезно.


https://github.com/BlizD/S3_SSL

Расширение для БСП для хранения файлов на s3 (minio, Amazon S3, Mail.Ru Cloud и т.п.)

Разработано совместно с @zotov-vs

Версия БСП: 3.1.2.343

Версия платформы: 8.3.17.1851

При обращении к API используется Connector @vbondarevsky

Спасибо malikov-pro за публикации external-storage-1c-ssl Хранение файлов томов БСП в хранилище с OpenStack API @malikov-pro
10. Sedaiko 590 09.02.24 03:42 Сейчас в теме
(9) Я, кстати, думал об этом. Но больше склоняюсь к монтированию через s3fs-fuse. Хотя в проде не запускал
12. LjeDmitrii 14.02.24 11:12 Сейчас в теме
Спасибо за статью! Очень помогло в построении обмена с Yandex Object Storage
13. magv 25 09.04.24 10:57 Сейчас в теме
Для Yandex Object Storage - заработало сразу
При проверке для провайдера Selectel - сразу не заработало.
Требуется в функции СоздатьСсылку() поменять строку:
Поля.Добавить("X-Amz-Signature=" + ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура));

на строку:
Поля.Добавить("X-Amz-Signature=" + НРег(ПолучитьHexСтрокуИзДвоичныхДанных(Сигнатура)));

В описании на сайте Amazon для поля Signature было указано:
The 256-bit signature expressed as 64 lowercase hexadecimal characters.
user1951539; L0z4; +2 Ответить
14. magv 25 05.09.24 15:12 Сейчас в теме
На днях возникла проблема при загрузке файлов, в имени которых есть пробелы и/или русские буквы.

Ошибка такого рода:
Code: SignatureDoesNotMatch
Message: The request signature we calculated does not match the signature you provided. Check your AWS secret access key and signing method. For more information, see REST Authentication and SOAP Authentication for details.;

Вылечилось (после долгих мучений) передачей параметра "Путь" в функцию СоздатьСсылку():

Путь = СтрЗаменить(КодироватьСтроку(Путь, СпособКодированияСтроки.КодировкаURL, "UTF-8"), "%2F", "/")
Оставьте свое сообщение