AWS S3 API

Создание пользователя и настройка доступа

Для работы с S3 в Облачном хранилище в панели управления:

  1. Создайте отдельного пользователя.
  2. Назначьте созданному пользователю права на работу с нужными контейнерами согласно инструкции. Чтобы дать пользователю полный доступ к необходимому контейнеру выберите значение Чтение и запись.
  3. Сохраните пароль, проставив галочку Использовать эти данные для доступа по протоколу 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.

Загрузка выполняется в три этапа.

Инициализация

  1. Если объект уже существует, то он удаляется.
  2. Создается контейнер с именем текущего, к нему добавляется суффикс _s3multipartuploads. Далее там будут храниться сегменты загруженного объекта.
  3. Генерируется uploadId.
  4. В контейнере с сегментами создаётся мета-объект /uploads/<bucketName>_s3multipartuploads/<objectName>_<uploadId>/, который будет хранить Content-Type и все пользовательские метаданные до финализации.

Загрузка частей (сегментов)

Происходит загрузка сегментов.

Финализация

  1. Делается листинг всех объектов по префиксу <bucketName>_s3multipartuploads/<objectName>/<uploadId>/ и сравнивается с листингом, который пришел от клиента.
  2. Считается суммарный размер объекта и суммируются хэши.
  3. Создаётся манифест, который будет находиться по пути загружаемого multipart-объекта.
  4. Из созданного ранее мета-объекта считывается 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>.