Работа с объектами в 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.
Показать незавершённые 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"