В этой статье мы рассмотрим новый транспорт S3. Функционально S3 сильно отличается от того, с чем большинство привыкли работать, поэтому в начале статьи подробно рассмотрим его основные особенности.
Важно! Для работы протокола https необходимы следующие библиотеки Open SSL: libssl-3.dll и libcrypto-3.dll их можно найти в директории с главным демо приложением. Библиотеки необходимо скопировать в папку с приложением или системную директорию.
S3 – это не файловое хранилище как Dropbox, Google Drive, Mega и другие. S3 является объектным хранилищем. И в первую очередь нам нужно понять разницу между этими двумя понятиями.
Файловое хранилище имеет привычную иерархическую (древовидную) структуру. То есть всем знакомые каталоги (папки), в которых хранятся другие каталоги и файлы.
Объектные хранилища появились относительно недавно (самому старому сейчас около 20 лет). Они незначительно отличаются в своих реализациях, поэтому большинство особенностей будут общими, но будут и такие которые применимы только к S3.
Все объектные хранилища “плоские”, то есть не имеют иерархической структуры, хотя и могут ее “имитировать”.
Первой сущностью, с которой вы столкнетесь, начиная работать с S3 будет Бакет (Bucket). Ближайшая аналогия это «Map» во многих языках программирования, где по ключу запрашиваются данные. Бакет может хранить внутри себя только файлы, но не другие бакеты.
Давайте представим бакет более наглядно.
Бакет |
|
Ключ |
Данные |
video.mp4 |
Данные |
text_file.txt |
Данные |
code.pas |
Данные |
По ключу вы можете получить соответствующие ему метаданные и сами интерпретировать их так как вам требуется. Гораздо интереснее это имитация иерархической структуры папок в такой системе.
Бакет |
|
Ключ |
Данные |
video.mp4 |
Данные |
folder1\text_file.txt |
Данные |
folder1\video.mp4 |
Данные |
folder1\folder1_1\video.mp4 |
Данные |
folder2\text_file.txt |
Данные |
folder1\ |
Пусто |
folder1\folder1_1\ |
Пусто |
folder2\ |
Пусто |
Некие «Папки» являются все теми же объектами что и файлы. В другой цвет они окрашены просто для наглядности. А также имеется одна отличительная особенность, в конце ключа стоит слеш (\). Зачастую такие «папки» не имеют данных (хотя и могут иметь).
Чтобы посмотреть, что находится в “папке” folder1 нам нужно сделать фильтрацию по началу ключа “folder1\”. Но куда интереснее удаление “папок”. Если мы в Web-GUI попытаемся удалить “папку” folder1, то некоторые сервисы сделают это, но оставшиеся нам выдадут ошибку “невозможно удалить непустую папку”.
Если мы по API удалим одну запись по ключу “folder1\”, то большинство GUI перестанет отрисовывать данную “папку”. А также мы не сможем в нее зайти, но фактически файлы внутри этой «папки» никуда не денутся. Как только мы создадим после этого “папку” folder1, то она уже будет содержать в себе забытые нами файлы. У самого ключа очень мало ограничений и он, например может быть таким: “////”. И это будут “папки” с пустыми именами.
1. Объектные хранилища существенно дешевле. Каждый объект не привязан к конкретному устройству, поэтому объектные хранилища легко расширяются под требуемый объем. Вы можете довольно просто арендовать объектное хранилище на петабайт (около 1000000 гигабайт).
2. У объектных хранилищ очень быстрый поиск. Но естественно лучше всего объектные хранилища использовать для неструктурированных (не древовидных) данных.
Все прошлые транспорты работали по OAuth 2 протоколу. S3 в теории может работать и по OAuth 2, но в его API встроена своя система аутентификации. OAuth 2 с помощью Client ID и Secret ID получал токен, который жил определённое количество времени и мог подписывать любые запросы.
Внутренняя аутентификация S3 с помощью тех же Client ID и Secret ID на каждую операцию создаёт новый одноразовый токен с помощью SHA256HMAC на основе около 30 переменных (включая время создания токена, требуемую операцию и так далее). Сервер лишь проверяет правильность генерации токена и если принятый сервером токен совпадает с тем который сгенерировал сам сервер, то операция совершается. После этого токен больше нельзя использовать.
Хотя транспорт и называется “TfrxS3IOTransport”, явно ссылаясь на AWS S3 (Amazon Simple Storage Service), но их API скопировали многие объектные хранилища (которые можно условно называть S3 подобными), поэтому данный транспорт позволяет работать не только с сервисом от Амазона.
В самом начале вам нужно добавить соответствующий компонент из вкладки “FastReport VCL Internet transports”.
Можно использовать контекстное меню на компоненте. Это установит подключение прямо из среды разработки. Нажимаем на подменю “Edit connection”.
Когда вам необходимо открыть или сохранить в файл с помощью транспорта, то вам будет доступен следующий стандартный диалог авторизации (если не было авторизации ранее).
Рассмотрим все уникальные поля данной формы:
Server URL - URL адрес используемый в API. Чтобы узнать URL адрес нужно читать документацию, для AWS S3 он по умолчанию должен быть “s3.amazonaws.com”.
Client ID - публичный ключ для авторизации (часто называется Access Key).
Secret ID - секретный ключ для авторизации (часто называется Secret Access Key).
Region - необходимо читать документацию для возможных значений региона. Иногда встречаются необычные требования, например в AWS S3 запросить список бакетов можно только с регионом “us-east-1”.
Bucket - чтобы каждый раз не выбирать бакет вручную его можно указать в этом поле, иногда для бакетов характерен конкретный регион.
Bucket style - Есть 2 вида указания бакета: path style (aws.s3.com/bucket) и virtual hosted style (bucket.aws.s3.com). «Path style» является устаревшим, потому что через определенный DNS может быть множество обращений к разным бакетам, что может создать дополнительную нагрузку. Некоторые сервисы поддерживают оба вида, некоторые только один, а некоторые настраиваются под разные ситуации. Об этом можете почитать по следующей ссылке.
При удачном подключении вы увидите стандартный браузер файлов FastReport VCL (на скриншоте ниже изображен список файлов внутри бакета).
На этом настройка подключения успешно окончена. Теперь вы знаете, как подключаться к S3 в FastReport VCL.
Осталось только отметить последние нюансы нашей реализации. Наша команда не реализовала создание и удаление бакетов. Пока визуально бакеты ничем не отличаются от папок (на нашей первой версии GUI), так как это было бы слишком опасно. Также пока не реализовано удаление папки вместе с содержимым. А также отсутствует загрузка файла по частям (рекомендуется при размере файла от 100 мегабайт).
Данный транспорт имеет множество деталей и тонкостей при настройке, но в отдельных случаях он станет оптимальной заменой файловых хранилищ.