Удаление всех объектов из бакета
Примечание
Для автоматического удаления частично загруженных объектов в Object Storage настройте правило жизненных циклов.
Чтобы очистить бакет и не платить за хранение:
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name
или --folder-id
.
-
Посмотрите описание команды CLI для удаления объектов:
yc storage s3api delete-objects --help
-
Получите список бакетов в каталоге по умолчанию:
yc storage bucket list
Результат:
+------------------+----------------------+-------------+-----------------------+---------------------+ | NAME | FOLDER ID | MAX SIZE | DEFAULT STORAGE CLASS | CREATED AT | +------------------+----------------------+-------------+-----------------------+---------------------+ | first-bucket | b1gmit33ngp6******** | 53687091200 | STANDARD | 2022-12-16 13:58:18 | +------------------+----------------------+-------------+-----------------------+---------------------+
-
Подготовьте файл JSON со списком объектов для удаления. Пример наполнения:
{ "Objects": [ { "Key": "<ключ_объекта>" }, { "Key": "<ключ_объекта>" }, ... ] }
Где:
Objects
— массив объектов для удаления.Key
— ключ объекта.
-
Выполните команду:
yc storage s3api delete-objects \ --bucket <имя_бакета> \ --delete <путь_к_файлу_json>
Где:
--bucket
— имя вашего бакета.--delete
— путь к файлу JSON со списком объектов для удаления.
Результат:
deleted: - key: file-1 version_id: "null" - key: file-2 version_id: "null" request_id: 4c35e7d4********
Если у вас еще нет AWS CLI, установите и сконфигурируйте его.
-
Создайте переменную с именем бакета:
BUCKET_NAME=<имя_бакета>
-
Удалите все версии объектов из бакета:
aws s3api delete-objects \ --endpoint-url https://storage.yandexcloud.net \ --bucket $BUCKET_NAME \ --delete \ "$(aws s3api list-object-versions \ --endpoint-url https://storage.yandexcloud.net \ --bucket $BUCKET_NAME \ --query '{Objects: Versions[].{Key: Key, VersionId: VersionId}}' \ --max-items 1000)"
Также вместо параметра
--max-items
вы можете использовать--max-keys
.Результат:
{ "Deleted": [ { "Key": "object_000", "VersionId": "0005CDD3********" }, { "Key": "object_001", "VersionId": "0005CDD3********" }, ... ] }
С помощью этой команды можно удалить до 1000 версий объектов: это связано с ограничением операции
aws s3api delete-objects
. Если в бакете больше версий, повторите команду несколько раз. -
Если для бакета включено версионирование, удалите все delete-маркеры:
aws s3api delete-objects \ --endpoint-url https://storage.yandexcloud.net \ --bucket $BUCKET_NAME \ --delete \ "$(aws s3api list-object-versions \ --endpoint-url https://storage.yandexcloud.net \ --bucket $BUCKET_NAME \ --query '{Objects: DeleteMarkers[].{Key: Key, VersionId: VersionId}}' \ --max-items 1000)"
Также вместо параметра
--max-items
вы можете использовать--max-keys
.Результат:
{ "Deleted": [ { "Key": "object_034", "DeleteMarker": true, "DeleteMarkerVersionId": "0005CDD3********" }, { "Key": "object_057", "DeleteMarker": true, "DeleteMarkerVersionId": "0005CDD3********" }, ... ] }
С помощью этой команды можно удалить до 1000 delete-маркеров: это связано с ограничением операции
aws s3api delete-objects
. Если в бакете больше версий, повторите команду несколько раз. -
Удалите частично загруженные объекты:
aws s3api list-multipart-uploads \ --endpoint-url https://storage.yandexcloud.net \ --bucket $BUCKET_NAME \ | jq -r '.Uploads[] | "--key \"\(.Key)\" --upload-id \(.UploadId)"' \ | while read -r line; do eval "aws s3api abort-multipart-upload \ --endpoint-url https://storage.yandexcloud.net \ --bucket $BUCKET_NAME \ $line"; done
-
Получите список частей объектов, оставшихся в бакете:
aws s3api list-multipart-uploads \ --endpoint-url https://storage.yandexcloud.net \ --bucket $BUCKET_NAME \ | jq -r '.Uploads[] | "--key \"\(.Key)\" --upload-id \(.UploadId)"' \ | while read -r line; do eval "aws s3api list-parts \ --endpoint-url https://storage.yandexcloud.net \ --bucket $BUCKET_NAME \ $line"; done
В списке могут оказаться части объектов, загрузка которых началась до выполнения предыдущего шага и закончилась после него. Если список не пуст, повторите шаги 4–5.
Выполните следующий код:
import boto3
bucket_name = '<имя_бакета>'
s3 = boto3.resource('s3',
endpoint_url='https://storage.yandexcloud.net',
aws_access_key_id='<идентификатор_ключа>',
aws_secret_access_key='<секретный_ключ>')
bucket = s3.Bucket(bucket_name)
# Deleting all versions (works for non-versioned buckets too).
bucket.object_versions.delete()
# Aborting all multipart uploads, which also deletes all parts.
for multipart_upload in bucket.multipart_uploads.iterator():
# Part uploads that are currently in progress may or may not succeed,
# so it might be necessary to abort a multipart upload multiple times.
while len(list(multipart_upload.parts.all())) > 0:
multipart_upload.abort()
Воспользуйтесь методом S3 API deleteMultipleObjects.
В консоли управления информация о количестве объектов в бакете и занятом месте обновляется с задержкой в несколько минут.