Удаление частично загруженного объекта
- AWS CLI
- Python API
Если AWS CLI еще не установлен, установите и настройте его. Для работы с объектным хранилищем используйте команды s3api и s3.
AWS CLI. Удаление частично загруженного объекта
При использовании составной (многокомпонентной) загрузки объект может быть сохранен не полностью. Такие незавершенные загрузки остаются в системе до их явного удаления.
Чтобы избавиться от таких объектов автоматически, настройте правила жизненного цикла.
Если нужно удалить объект вручную, выполните следующие шаги:
1. Найдите незавершенные составные загрузки
В терминале выполните команду:
aws s3api list-multipart-uploads --bucket <bucket_name>
Укажите:
<bucket_name> — имя бакета.
Пример ответа:
{
"Uploads": [
{
"UploadId": "2~xYzW9Pj3mTqRsKLnVobFiJUcEad1hw",
"Key": "archive.mp4",
"Initiated": "2025-05-16T10:30:45.123000+00:00"
}
]
}
Скопируйте значение UploadId — оно потребуется на следующих шагах.
2. Удалите незавершенную загрузку
В терминале выполните команду:
aws s3api abort-multipart-upload \
--bucket <bucket_name> \
--key <object_name> \
--upload-id <UploadId>
Укажите:
<bucket_name> — имя бакета;
<object_name> — имя объекта;
<UploadId> — идентификатор составной загрузки из пункта 1.
Подробнее об объектах см. в статье Об объектах.
Boto3 — это библиотека Python, предоставляющая программный интерфейс (SDK) для взаимодействия с объектным хранилищем S3. Подробности см. в документации AWS Boto3.
Python API. Удаление частично загруженного объекта
Когда вы загружаете большие файлы в S3-совместимое объектное хранилище с помощью multipart-загрузки, может случиться сбой: сеть оборвалась, сервер перезагрузился, загрузка не завершена. Такие "подвисшие" загрузки продолжают занимать ресурсы и место в хранилище.
Этот Python-скрипт автоматически:
- находит все незавершенные multipart-загрузки в указанном бакете;
- показывает их список: имя объекта (Key), UploadId, дата начала;
- удаляет все найденные загрузки через abort_multipart_upload.
Чтобы избавиться от таких объектов автоматически, настройте правила жизненного цикла.
import boto3
# Конфигурация
bucket_name = "<bucket_name>"
session = boto3.session.Session(profile_name='default') #Создает сессию с использованием профиля default. Профиль находится в файле ~/.aws/credentials.
s3 = session.client('s3', endpoint_url='$endpoint')
def list_multipart_uploads(bucket):
response = s3.list_multipart_uploads(Bucket=bucket)
uploads = response.get("Uploads", [])
if not uploads:
print("Нет незавершённых загрузок.")
return []
print(f"Найдено {len(uploads)} незавершённых загрузок:")
for upload in uploads:
print(f"- Key: {upload['Key']}, UploadId: {upload['UploadId']}, Initiated: {upload['Initiated']}")
return uploads
def abort_upload(bucket, key, upload_id):
try:
s3.abort_multipart_upload(Bucket=bucket, Key=key, UploadId=upload_id)
print(f"Удалена multipart-загрузка: {key} (UploadId: {upload_id})")
except Exception as e:
print(f"Ошибка при удалении загрузки {key} (UploadId: {upload_id}): {e}")
if __name__ == "__main__":
uploads = list_multipart_uploads(bucket_name)
for upload in uploads:
key = upload["Key"]
upload_id = upload["UploadId"]
abort_upload(bucket_name, key, upload_id)
Укажите:
<bucket_name> — имя бакета.
Подробнее об объектах см. в статье Об объектах.