Загрузка и скачивание файлов с объектного хранилища Selectel
Published 25 августа 2024 г. 8:51
Доброго времени суток, дорогой читатель! Не так давно мне необходимо было настроить загрузку файлов в объектное хранилище одного из российских провайдеров облачных решений Selectel. Признаюсь честно, это было весьма интересно, попробовать отечественное решение для своего пет проекта и во время этого эксперимента я обнаружила некоторые неочевидные моменты 👀.
Итак, начнём!
Прежде всего необходимо создать хранилище, учитывая особенности использования данных. Так как мне необходимо было лишь редко использовать хранилище по сети, я выбрала холодное хранения. Подробнее про особенности хранения можно посмотреть здесь.
Хранилище есть, осталось настроить к нему доступ через API. Хотя конечно можно и с помощью веб-интерфейса файлы загружать, но здесь рекомендуется грузить файлы не более 1 ГБ.
Для работы с хранилищем использовалась библиотека boto3. Делаем s3 клиента:
И здесь начинается забавная вещь. Нам необходимо указать endpoint_url
, и если мы зайдем в панель хранилища, то увидим следующее:
Здесь указан тип адресации, который необходимо использовать для API. Можно заметить, что Virtual-Hosted адресацию нельзя отключить.
Если указать в endpoint_url
данный адрес, то вы сможете загружать файлы в ваше хранилище без проблем. Но если вам нужно скачать файлы с хранилища:
,
использовать ту же конфигурацию клиента не получится. При попытке скачивания файла получим ошибку NoSuchKey.
Дисклеймер:
Вы также можете получить ошибку SSL сертификата, для этого необходимо установить библиотеку certifi.
Заходим в документацию и видим следующее:
Меняем endpoint_url
:
И спокойно скачиваем файл с хранилища!
PS:
При virtual-hosted адресации название контейнера уже включено в url, поэтому имя bucket'а будет другим. Допустим, у вас есть контейнер с именем my_container
, внутри лежат папки с префиксами data1/files/...
, data1/files2/...
, и т д. В случае, когда используется virtual-hosted адресация, имя bucket'а будет data1, а префиксы files1/... и files2/... соответственно.
Если использовать url https://s3.ru-1.storage.selcloud.ru, то имя bucket'а будет my_container
и префиксы data1/files/...
, data1/files2/...