AWS S3 API
Создание пользователя и настройка доступа
Для работы с S3 в Облачном хранилище в панели управления:
- Создайте отдельного пользователя.
- Назначьте созданному пользователю права на работу с нужными контейнерами согласно инструкции. Чтобы дать пользователю полный доступ к необходимому контейнеру выберите значение Чтение и запись.
- Сохраните пароль, проставив галочку Использовать эти данные для доступа по протоколу S3.
Примечание: если пользователь не сохранил свой пароль в панели управления — аутентификация работать не будет, так как для проверки подписи запроса сервис должен знать пароль.
Для работы в конфигурационном файле используйте логин и пароль созданного пользователя:
- в качестве Access Key используется формат <Номер аккаунта>_<Имя пользователя>;
- в качестве Secret Key используется пароль пользователя;
- в качестве Region используется ru-1a.
Примечание: пользователь, являющийся основным для аккаунта (в случае, когда имя пользователя совпадает с номером учетной записи в панели управления), получает доступ на чтение и запись к любому бакету.
Бакет (bucket) — это логическая сущность, которая помогает организовать хранение объектов. В терминологии Swift это контейнеры.
Браузерная загрузка файлов методом POST
Можно загружать файлы напрямую в Облачное хранилище из браузера пользователя, минуя промежуточные серверы. Для загрузки пользователю нужно собрать валидную HTML-форму формата multipart/form-data. Сделать это можно как вручную, так и с помощью python-библиотеки boto3 (или других, которые позволяют генерировать подписи для форм).
Ограничения:
- не поддерживается анонимная загрузка, то есть все запросы должны быть подписаны;
- максимальное значение expiration в Policy ограничено одним годом.
Составная загрузка (Multipart Upload)
Особенность при загрузке объектов.
Составная загрузка позволяет загружать отдельный объект как набор частей.
Примечание: при работе с S3 при Multipart-загрузке больших объектов все загруженные сегменты не собираются в финале в единый объект, а складируются в соседний контейнер с таким же именем и суффиксом _s3multipartuploads
.
Для загрузки больших (размер варьируется) объектов по частям используют этот API.
Загрузка выполняется в три этапа.
Инициализация
- Если объект уже существует, то он удаляется.
- Создается контейнер с именем текущего, к нему добавляется суффикс
_s3multipartuploads
. Далее там будут храниться сегменты загруженного объекта. - Генерируется uploadId.
- В контейнере с сегментами создаётся мета-объект
/uploads/<bucketName>_s3multipartuploads/<objectName>_<uploadId>/
, который будет хранить Content-Type и все пользовательские метаданные до финализации.
Загрузка частей (сегментов)
Происходит загрузка сегментов.
Финализация
- Делается листинг всех объектов по префиксу
<bucketName>_s3multipartuploads/<objectName>/<uploadId>/
и сравнивается с листингом, который пришел от клиента. - Считается суммарный размер объекта и суммируются хэши.
- Создаётся манифест, который будет находиться по пути загружаемого multipart-объекта.
- Из созданного ранее мета-объекта считывается Content-Type и пользовательские метаданные и записываются в манифест, а сам мета-объект затем удаляется.
Реализован данный метод с небольшим ограничением — в качестве разделителя можно использовать только /
.
Примечание: в бакетах видны контейнеры с сегментами.
Поддерживаемые методы
Облачное хранилище поддерживает базовые методы для работы с HTTP API Amazon S3.
Метод | Команда | Действие | Доступ |
---|---|---|---|
GET Service | GET / | Получение списка бакетов |
Пользователь получает листинг только тех бакетов, к которым у него есть доступ на чтение и запись |
DELETE Bucket | DELETE /<bucketName> |
Удаление бакета | Пользователь может удалить бакет, если он имеет доступ на чтение и запись |
GET Bucket (List Objects) Version 1 | GET /<bucketName> |
Получение списка объектов в бакете |
Пользователь может получить листинг объектов только того бакета, к которому он имеет доступ на чтение и запись |
HEAD Bucket | HEAD /<bucketName> |
Получение статуса бакета |
Пользователь может получить статус бакета, если у него есть доступ на чтение и запись |
List Multipart Uploads | GET /<bucketName>?uploads |
Получение списка загружаемых multipart-объектов |
Пользователь может получить листинг загружаемых multipart-объектов только того бакета, к которому он имеет доступ на чтение и запись |
PUT Bucket | PUT /<bucketName> |
Создание бакета | Пользователь может создать бакет, если он имеет доступ на чтение и запись |
Delete Multiple Objects | POST /<bucketName>?delete |
Множественное удаление объектов в бакете |
Пользователь может удалить несколько объектов, если он имеет доступ на чтение и запись в бакет |
DELETE Object | DELETE /<bucketName>/<objectName> |
Удаление объекта | Пользователь может удалить объект, если он имеет доступ на чтение и запись в бакет |
GET Object | GET /<bucketName>/<objectName> |
Получение объекта | Пользователь может получить объект, если он имеет доступ на чтение и запись |
HEAD Object | HEAD /<bucketName>/<objectName> |
Получение метаданных объекта |
Пользователь может получить метаданные объекта, если он имеет доступ на чтение и запись |
PUT Object | PUT /<bucketName>/<objectName> |
Создание объекта | Пользователь может создать объект, если он имеет доступ на чтение и запись |
PUT Object - Copy | PUT /<bucketName>/<objectName> (x-amz-copy-source) |
Копирование объекта * |
Пользователь может скопировать объект, если он имеет доступ на чтение и запись в бакет-источник |
Initiate Multipart Upload | POST /<bucketName>/<objectName>?uploads |
Инициирование загрузки multipart-объекта |
Пользователь может инициировать multipart upload, если он имеет доступ на чтение и запись |
Complete Multipart Upload | POST /<bucketName>/<objectName>?uploadId=<uploadId> |
Финализация загрузки multipart-объекта |
Пользователь может финализировать multipart upload, если он имеет доступ на чтение и запись |
Abort Multipart Upload | DELETE /<bucketName>/<objectName>?uploadId=<uploadId> |
Отмена загрузки multipart-объекта ** |
Пользователь может отменить загрузку multipart-объекта, если он имеет доступ на чтение и запись |
List Parts | GET /<bucketName>/<objectName>?uploadId=<uploadId> |
Получение списка сегментов multipart-объекта |
Пользователь может получить список сегментов, если он имеет доступ на чтение и запись |
Upload Part | PUT /<bucketName>/<objectName>?partNumber=<partNumber>&uploadId=<uploadId> |
Загрузка части multipart-объекта *** |
Пользователь может создать часть multipart-объекта, если он имеет доступ на чтение и запись |
Upload Part - Copy | PUT /<bucketName>/<objectName>?partNumber=<part_number>&uploadId=<uploadId> (x-amz-copy-source) |
Копирование части multipart-объекта |
Пользователь может скопировать часть multipart-объекта, если он имеет доступ на чтение и запись в бакет-источник |
*
При копировании объекта самого в себя выполняется модификация метаданных объекта.
**
Удаляется каждый загруженный сегмент, затем и мета-объект.
***
В этом методе к имени бакета добавляется суффикс _s3multipartuploads, а путь к объекту заменяется на <objectName>/<uploadId>/<partNumber>
.