Работа с объектами в S3-хранилище

S3 хранилище данных позволяет удобно управлять объектами: загружать, удалять и оптимизировать размещение больших файлов. Ниже описаны основные способы работы с объектами.


1. Загрузка объектов

Базовая загрузка

Применяется для загрузки объектов размером до 100 МБ. Поддерживается загрузка через веб-интерфейс или S3 API.

Загрузка через веб-интерфейс:

1. Перейдите в раздел Контейнеры.

2. В списке контейнеров выберите нужный и нажмите ссылку Показать объекты.

3. Нажмите кнопку Загрузить файлы и выберите необходимые объекты для загрузки.

Загрузка одного файла

mc cp ./file.txt <alias_name>/<bucket-name>/<object>

Загрузка всей папки рекурсивно

mc cp --recursive ./<local-folder>/ <alias_name>/<bucket-name>/<prefix>/

Просмотр списка файлов и папок в бакете или префиксе

mc ls <alias_name>/<bucket-name>

Просмотр содержимого папки рекурсивно

mc ls --recursive <alias_name>/<bucket-name>/<prefix>/

Загрузка одного файла

rclone copy ./file.txt <remote_name>:<bucket-name> --s3-no-check-bucket

Загрузка всей папки

rclone copy ./<local-folder>/ <remote_name>:<bucket-name>/

Просмотр содержимого бакета или папки

rclone ls <remote_name>:<bucket-name>/

Просмотр с детальной информацией (размер, дата)

rclone lsl <remote_name>:<bucket-name>/<prefix>/

Загрузка одного файла

s3cmd put ./file.txt s3://<bucket-name>/<object>

Рекурсивная загрузка всей папки

s3cmd put --recursive ./<local-folder>/ s3://<bucket-name>/

Просмотр содержимого бакета или папки

s3cmd ls s3://<bucket-name>/

Просмотр с рекурсивным выводом

s3cmd ls --recursive s3://<bucket-name>/<prefix>/

Загрузка одного файла

aws s3 cp ./file.txt s3://<bucket-name>/

Рекурсивная загрузка папки

aws s3 cp ./<local-folder>/ s3://<bucket-name>/ --recursive

Просмотр содержимого бакета или папки

aws s3 ls s3://<bucket-name>/

Просмотр содержимого папки рекурсивно

aws s3 ls s3://<bucket-name>/<prefix>/ --recursive

Загрузка одного файла

aws s3api put-object --bucket <bucket-name> --key <object> --body ./file.txt

Просмотр содержимого бакета или папки

aws s3api list-objects-v2 --bucket <bucket-name> --delimiter "/"

Просмотр содержимого папки рекурсивно

aws s3api list-objects-v2 --bucket <bucket-name> --prefix "<prefix>/"

Для удобства задайте ключи доступа через переменные окружения:

export AWS_ACCESS_KEY_ID="<YOUR_ACCESS_KEY_ID>"
export AWS_SECRET_ACCESS_KEY="<YOUR_SECRET_ACCESS_KEY>"
export AWS_REGION="ru-1"

Загрузка файла PUT-запросом с AWS SigV4 авторизацией

curl -i -X PUT "https://s3.buckets.ru/<bucket-name>/<object>" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
--aws-sigv4 "aws:amz:${AWS_REGION}:s3" \
--upload-file ./file.txt

Просмотр содержимого бакета

curl -X GET "https://s3.buckets.ru/<bucket-name>/?list-type=2" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
--aws-sigv4 "aws:amz:${AWS_REGION}:s3"
Многосегментная загрузка (Multipart Upload)

Multipart-загрузка это механизм, позволяющий разбивать большой объект на сегменты и загружать их параллельно, что повышает надёжность и производительность передачи данных в объектное хранилище.

Рекомендуется для передачи объектов объёмом более 100 МБ. Реализуется с использованием S3-совместимого API, поддерживаемого сторонними клиентами.

Сегменты сохраняются во внутренние (системные) контейнеры. Итоговый объект представлен манифестом, содержащим ссылки на все сегменты и порядок их сборки.

Принудительное использование multipart с заданным размером чанка

Размер чанка по умолчанию: 16MiB

mc put --part-size 64MiB ./largefile.txt <alias_name>/<bucket-name>/<object>

Размер chunk по умолчанию 5 MiB

Рекомендуемый для улучшения производительности размер: 64 MiB

rclone config update <remote_name> chunk_size 64Mi

Альтернативно, параметр можно указать напрямую в командной строке:

rclone copyto ./largefile.txt <remote_name>:<bucket-name>/<object> \
--s3-chunk-size 64Mi \
--s3-no-check-bucket \
--progress

Размер chunk по умолчанию в s3cmd: 15 MiB

Можно изменить в ~/.s3cfg, например на 64 МБ для ускорения

multipart_chunk_size = 64

Или напрямую в командной строке

s3cmd put --multipart-chunk-size-mb=64 ./largefile.txt s3://<bucket-name>/<object>

AWS CLI автоматически использует multipart для файлов больше 8 МБ (части по 8 МБ по умолчанию)

Можно изменить размер частей, например, на 64 МБ, с помощью:

aws configure set default.s3.multipart_chunksize 64MB

После этого AWS CLI будет использовать части по 64 МБ при multipart-загрузке

aws s3 cp ./largefile.txt s3://<bucket-name>/<object>

В awscli s3api нет прямой настройки chunk size — вы управляете загрузкой частей вручную.

Минимальный размер части — 5 МБ (кроме последней части).

Инициализация multipart-загрузки, получение UploadId:

aws s3api create-multipart-upload --bucket <bucket-name> --key <object>

Загрузка части с номером 1 (повторить для всех частей с увеличением part-number):

aws s3api upload-part --bucket <bucket-name> --key <object> --part-number 1 --body <path/to/part1> --upload-id <UploadId>
# Полученный ETag необходимо указать в файле parts.json для соответствующей части загрузки.

После загрузки всех частей необходимо завершить multipart-загрузку.

Создайте JSON-файл parts.json с информацией о частях:

{
"Parts": [
{ "ETag": "\"etag-of-part-1\"", "PartNumber": 1 },
{ "ETag": "\"etag-of-part-2\"", "PartNumber": 2 }
// добавьте все части
]
}

Команда завершения загрузки:

aws s3api complete-multipart-upload --bucket <bucket-name> --key <object> --upload-id <UploadId> --multipart-upload file://parts.json

В curl нет прямой настройки chunk size — вы управляете загрузкой частей вручную.

Минимальный размер части — 5 МБ (кроме последней части).

Инициализация multipart-загрузки, получаем UploadId:

curl -X POST "https://s3.buckets.ru/<bucket-name>/<object>?uploads" \
  --user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
  --aws-sigv4 "aws:amz:${AWS_REGION}:s3"

Загрузка части с номером 1 (повторять для всех частей с увеличением partNumber):

curl -i -X PUT "https://s3.buckets.ru/<bucket-name>/<object>?partNumber=1&uploadId=<UploadId>" \
  --user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
  --aws-sigv4 "aws:amz:${AWS_REGION}:s3" \
  --upload-file <path/to/part1>

После загрузки всех частей нужно завершить multipart-загрузку.

Создайте XML-файл complete.xml со списком загруженных частей:

cat > complete.xml <<EOF
<CompleteMultipartUpload>
  <Part>
    <PartNumber>1</PartNumber>
    <ETag>"etag-of-part-1"</ETag>
  </Part>
  <Part>
    <PartNumber>2</PartNumber>
    <ETag>"etag-of-part-2"</ETag>
  </Part>
  <!-- добавьте все остальные части -->
</CompleteMultipartUpload>
EOF

Завершение multipart-загрузки:

curl -X POST "https://s3.buckets.ru/<bucket-name>/<object>?uploadId=<UploadId>" \
  --user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
  --aws-sigv4 "aws:amz:${AWS_REGION}:s3" \
  -H "Content-Type: application/xml" \
  --data-binary "@complete.xml"

2. Повторная загрузка

При загрузке объекта с существующим именем предыдущая версия объекта перезаписывается новым содержимым.

Предыдущая копия не сохраняется и удаляется без возможности восстановления.

3. Удаление объектов

Удаление через веб-интерфейс:

1. Перейдите в раздел Контейнеры. Выберите нужный контейнер и нажмите ссылку Показать объекты.

2. В списке объектов выделите нужный элемент.

3. Нажмите Удалить и подтвердите операцию.

После удаления объект безвозвратно удаляется и не подлежит восстановлению.

Удаление объекта из хранилища

mc rm <alias_name>/<bucket-name>/<object>

Удаление всей папки (рекурсивно)

mc rm --recursive <alias_name>/<bucket-name>/<prefix>/

Удаление объекта из хранилища

rclone delete <remote_name>:<bucket-name>/<object>

Удаление всей папки рекурсивно

rclone delete <remote_name>:<bucket-name>/<prefix>/ --rmdirs

Удаление объекта из бакета

s3cmd del s3://<bucket-name>/<object>

Удаление всей папки рекурсивно

s3cmd del --recursive s3://<bucket-name>/<folder>/

Удаление объекта из S3

aws s3 rm s3://<bucket-name>/<object>

Удаление всей папки рекурсивно

aws s3 rm s3://<bucket-name>/<prefix>/ --recursive

Удаление объекта

aws s3api delete-object --bucket <bucket-name> --key <object>

Для удаления папки нужно удалять объекты по одному — прямой команды нет

Удаление объекта

curl -i -X DELETE "https://s3.buckets.ru/<bucket-name>/<object>" \
  --user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
  --aws-sigv4 "aws:amz:${AWS_REGION}:s3"
Удаление многосегментного объекта

Удаление многосегментного объекта осуществляется так же, как и обычного — путем удаления манифеста. Связанные сегменты удаляются сервером автоматически в фоновом режиме, обычно в течение нескольких минут.

Очистка незавершённых multipart-загрузок

Если multipart-загрузка прерывается и не завершается, в хранилище остаются сегменты и метаданные, которые не отображаются как объекты, занимают место и со временем накапливаются, увеличивая затраты.

Если автоматическое удаление не настроено, незавершённые загрузки можно удалить вручную.

Получение сведений о незавершённых загрузках

mc ls --incomplete <alias_name>/

Незавершённую multipart-загрузку нельзя удалить обычной командой. Чтобы отменить её, используйте AWS CLI s3api.

В Rclone такой функционал сейчас не реализован. Используйте AWS CLI s3api.

Показать незавершённые multipart-загрузки

s3cmd multipart s3://<bucket-name>/<object>

Список частей multipart-загрузки по UploadId

s3cmd listmp s3://<bucket-name>/<object> <upload_id>

Отмена multipart-загрузки по UploadId

s3cmd abortmp s3://<bucket-name>/<object> <upload_id>

В интерфейсе aws s3 нет прямых команд для управления частями

Используйте aws s3api для получения информации и управления частями загрузки

Показать все незавершённые multipart-загрузки для указанного бакета

aws s3api list-multipart-uploads --bucket <bucket-name>

Получение списка всех загруженных частей

aws s3api list-parts --bucket <bucket-name> --key <object> --upload-id <UploadId>

Отмена multipart-загрузки

aws s3api abort-multipart-upload --bucket <bucket-name> --key <object> --upload-id <UploadId>

Показать все незавершённые multipart-загрузки для указанного бакета

curl -X GET "https://s3.buckets.ru/<bucket-name>/?uploads" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
--aws-sigv4 "aws:amz:${AWS_REGION}:s3"

Получение списка всех загруженных частей

curl -X GET "https://s3.buckets.ru/<bucket-name>/<object>?uploadId=<UploadId>" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
--aws-sigv4 "aws:amz:${AWS_REGION}:s3"

Отмена multipart-загрузки

curl -i -X DELETE "https://s3.buckets.ru/<bucket-name>/<object>?uploadId=<UploadId>" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
--aws-sigv4 "aws:amz:${AWS_REGION}:s3"
Все еще нужна помощь?
Создать заявку в поддержку