Работа с 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/s3multipartuploads//, который будет хранить Content-Type и все пользовательские метаданные до финализации.

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

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

Финализация

  1. Делается листинг всех объектов по префиксу _s3multipartuploads/// и сравнивается с листингом, который пришел от клиента.
  2. Считается суммарный размер объекта и суммируются хэши.
  3. Создаётся манифест, который будет находиться по пути загружаемого multipart-объекта.
  4. Из созданного ранее мета-объекта считывается Content-Type и пользовательские метаданные и записываются в манифест, а сам мета-объект затем удаляется.

Реализован данный метод с небольшим ограничением — в качестве разделителя можно использовать только /.

Примечание: в бакетах видны контейнеры с сегментами.

Поддерживаемые методы

Облачное хранилище поддерживает базовые методы для работы с HTTP API Amazon S3.

Метод Команда Действие Доступ
GET Service GET / Получение списка бакетов Пользователь получает листинг только тех бакетов, к которым у него есть доступ на чтение и запись
DELETE Bucket DELETE / Удаление бакета Пользователь может удалить бакет, если он имеет доступ на чтение и запись
GET Bucket (List Objects) Version 1 GET / Получение списка объектов в бакете Пользователь может получить листинг объектов только того бакета, к которому он имеет доступ на чтение и запись
HEAD Bucket HEAD / Получение статуса бакета Пользователь может получить статус бакета, если у него есть доступ на чтение и запись
List Multipart Uploads GET /?uploads Получение списка загружаемых multipart-объектов Пользователь может получить листинг загружаемых multipart-объектов только того бакета, к которому он имеет доступ на чтение и запись
PUT Bucket PUT / Создание бакета Пользователь может создать бакет, если он имеет доступ на чтение и запись
Delete Multiple Objects POST /?delete Множественное удаление объектов в бакете Пользователь может удалить несколько объектов, если он имеет доступ на чтение и запись в бакет
DELETE Object DELETE // Удаление объекта Пользователь может удалить объект, если он имеет доступ на чтение и запись в бакет
GET Object GET // Получение объекта Пользователь может получить объект, если он имеет доступ на чтение и запись
HEAD Object HEAD // Получение метаданных объекта Пользователь может получить метаданные объекта, если он имеет доступ на чтение и запись
PUT Object PUT // Создание объекта Пользователь может создать объект, если он имеет доступ на чтение и запись
PUT Object - Copy PUT // (x-amz-copy-source) Копирование объекта. При копировании объекта самого в себя выполняется модификация метаданных объекта Пользователь может скопировать объект, если он имеет доступ на чтение и запись в бакет-источник
Initiate Multipart Upload POST //?uploads Инициирование загрузки multipart-объекта Пользователь может инициировать multipart upload, если он имеет доступ на чтение и запись
Complete Multipart Upload POST //?uploadId= Финализация загрузки multipart-объекта Пользователь может финализировать multipart upload, если он имеет доступ на чтение и запись
Abort Multipart Upload DELETE //?uploadId= Отмена загрузки multipart-объекта. Примечание: удаляется каждый загруженный сегмент, затем и мета-объект Пользователь может отменить загрузку multipart-объекта, если он имеет доступ на чтение и запись
List Parts GET //?uploadId= Получение списка сегментов multipart-объекта Пользователь может получить список сегментов, если он имеет доступ на чтение и запись
Upload Part PUT //?partNumber=&uploadId= Загрузка части multipart-объекта. Примечание: в этом методе к имени бакета добавляется суффикс _s3multipartuploads, а путь к объекту заменяется на // Пользователь может создать часть multipart-объекта, если он имеет доступ на чтение и запись
Upload Part - Copy PUT //?partNumber=&uploadId= (x-amz-copy-source) Копирование части multipart-объекта Пользователь может скопировать часть multipart-объекта, если он имеет доступ на чтение и запись в бакет-источник