Как удалить ведомый версией в AWS S3 с помощью CLI?

21

Я пробовал оба s3cmd :

$ s3cmd -r -f -v del s3://my-versioned-bucket/

И AWI CLI:

$ aws s3 rm s3://my-versioned-bucket/ --recursive

Но обе эти команды просто добавляют DELETE к S3. Команда для удаления ведра также не работает (из AWS CLI):

$ aws s3 rb s3://my-versioned-bucket/ --force
Cleaning up. Please wait...
Completed 1 part(s) with ... file(s) remaining
remove_bucket failed: s3://my-versioned-bucket/ A client error (BucketNotEmpty) occurred when calling the DeleteBucket operation: The bucket you tried to delete is not empty. You must delete all versions in the bucket.

Хорошо ... как? Для этого нет информации в их документации . S3Cmd говорит, что это «полнофункциональный» инструмент командной строки S3, но он не ссылается на версии , отличные от его собственных. Есть ли способ сделать это, не используя веб-интерфейс, который займет навсегда и требует, чтобы я оставил свой ноутбук?

    
задан NobleUplift 22.04.2015 в 23:22
источник
  • Насколько я знаю, вам нужно будет перебирать версии объектов и удалять их партиями по 1000 ... –  Julio_AWS_DevRel 23.04.2015 в 16:22
  • Если для этого есть пример кода Java, это было бы здорово. Документация AWS действительно ужасна ... –  NobleUplift 26.04.2015 в 06:35

7 ответов

3

Один из способов сделать это - перебирать версии и удалять их. Немного сложно в CLI, но, как вы упомянули Java, это было бы более просто:

AmazonS3Client s3 = new AmazonS3Client();
String bucketName = "deleteversions-"+UUID.randomUUID();

//Creates Bucket
s3.createBucket(bucketName);

//Enable Versioning
BucketVersioningConfiguration configuration = new BucketVersioningConfiguration(ENABLED);
s3.setBucketVersioningConfiguration(new SetBucketVersioningConfigurationRequest(bucketName, configuration ));

//Puts versions
s3.putObject(bucketName, "some-key",new ByteArrayInputStream("some-bytes".getBytes()), null);
s3.putObject(bucketName, "some-key",new ByteArrayInputStream("other-bytes".getBytes()), null);

//Removes all versions
for ( S3VersionSummary version : S3Versions.inBucket(s3, bucketName) ) {
    String key = version.getKey();
    String versionId = version.getVersionId();          
    s3.deleteVersion(bucketName, key, versionId);
}

//Removes the bucket
s3.deleteBucket(bucketName);
System.out.println("Done!");

Вы также можете пакетно удалить вызовы для повышения эффективности, если это необходимо.

    
ответ дан Julio_AWS_DevRel 26.04.2015 в 21:20
источник
  • Я действительно собирался попытаться запустить многопоточную программу для удаления каждой из «папок» в моем ведомости S3 (их четыре) и при необходимости разделить потоки для более крупных папок в first / 1. .., first / 9 и т. д. ... но коллега, и я только что удалил все версии с помощью веб-интерфейса и Cyberduck. Спасибо за помощь, когда мне это нужно! –  NobleUplift 30.04.2015 в 17:40
22

Я столкнулся с тем же ограничением CLI AWS. Я нашел самое легкое решение для использования Python и boto3

BUCKET = 'your-bucket-here'

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket(BUCKET)
bucket.object_versions.delete()

# if you want to delete the now-empty bucket as well, uncomment this line:
#bucket.delete()

В предыдущей версии этого ответа использовался boto , но у этого решения были проблемы с производительностью с большим количеством ключей, как заметил Чаклз.     

ответ дан Abe Voelker 10.02.2016 в 05:10
источник
  • Определенно работает !!! –  Marcello de Sales 08.02.2018 в 04:25
12

Используя boto3 , это еще проще, чем с предлагаемым решением boto для удаления всех версий объектов в ведре S3:

#!/usr/bin/env python
import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('your-bucket-name')
bucket.object_versions.all().delete()

Хорошо работает и для очень больших объемов версий объектов, хотя в этом случае может потребоваться некоторое время.

    
ответ дан Dunedan 30.12.2016 в 17:07
источник
6

Вы можете удалить все объекты в вебе версии s3. Но я не знаю, как удалить заданные объекты. % Co_de%

Надеюсь, что это вам полезно.

    
ответ дан Cheers 27.06.2015 в 09:47
источник
  • Это работает, но мне пришлось сменить объекты на Objecs и тихо на Тихий. По-видимому, это было чувствительным к регистру. –  Nate Fox 11.02.2016 в 00:50
  • Это, к сожалению, не работает для 1000+ объектов. –  Koen. 05.03.2017 в 20:09
  • Любой способ обойти ограничение 1000+ объектов? –  Matías 01.03.2018 в 00:43
5

У меня возникли проблемы с решением Abe , поскольку генератор list_buckets используется для создания массивного списка с именем all_keys , и я провел час без его завершения. Кажется, эта настройка работает лучше для меня, у меня было около миллиона объектов в моем ковше и подсчета!

import boto

s3 = boto.connect_s3()
bucket = s3.get_bucket("your-bucket-name-here")

chunk_counter = 0 #this is simply a nice to have
keys = []
for key in bucket.list_versions():
    keys.append(key)
    if len(keys) > 1000:
        bucket.delete_keys(keys)
        chunk_counter += 1
        keys = []
        print("Another 1000 done.... {n} chunks so far".format(n=chunk_counter))

#bucket.delete() #as per usual uncomment if you're sure!

Надеюсь, это поможет кому-то еще столкнуться с этим кошмаром S3!

    
ответ дан chuckwired 26.10.2016 в 17:25
источник
  • Спасибо за пример, это помогло мне, одна вещь, это отсутствие окончательного bucket.delete_keys (keys) после цикла for, чтобы поймать любых отступников на основе вашей логики дозирования здесь. –  Sean 05.02.2018 в 20:58
4
  1. Для удаления определенного объекта (ов), используя jq-фильтр.
  2. Вам может потребоваться очистка «DeleteMarkers» не только «Версии».
  3. Используя $() вместо '' , вы можете вставлять переменные для bucket-name и key-value.
aws s3api delete-objects --bucket bucket-name --delete "$(aws s3api list-object-versions --bucket bucket-name | jq -M '{Objects: [.["Versions","DeleteMarkers"][]|select(.Key == "key-value")| {Key:.Key, VersionId : .VersionId}], Quiet: false}')"
    
ответ дан Tiger peng 13.04.2016 в 18:41
источник
  • Этот oneliner (а также один выше stackoverflow.com/a/31086407/465684) выглядит и работает хорошо, но они не удовлетворяют ситуации, когда удалено более 1000 объектов (жесткое ограничение s3api вызов delete-objects). –  Andrei Neculau 06.09.2016 в 12:27
  • @ tiger-peng Получил ошибку «Произошла ошибка (MalformedXML) при вызове операции DeleteObjects: предоставленный вами XML не был корректным или не подтвердил нашу опубликованную схему». Любая идея, что происходит? –  Marcello de Sales 07.02.2018 в 19:16
  • @MarcellodeSales, если вы можете поделиться какой командой вы использовали, я могу попытаться ее проверить. –  Tiger peng 16.03.2018 в 18:46
  • Я использую решение ниже с Python ... Я отказался от aws cli –  Marcello de Sales 19.03.2018 в 22:08
2

Вот один лайнер, который вы можете просто вырезать и вставить в командную строку, чтобы удалить все версии и удалить маркеры (для этого требуются инструменты aws, замените yourbucket-name-backup своим именем в виде ведра)

echo '#!/bin/bash' > deleteBucketScript.sh && aws --output text s3api list-object-versions --bucket yourbucket-name-backup | grep -E "^VERSIONS" | awk '{print "aws s3api delete-object --bucket yourbucket-name-backup --key "" --version-id "";"}' >> deleteBucketScript.sh && . deleteBucketScript.sh; rm -f deleteBucketScript.sh; echo '#!/bin/bash' > deleteBucketScript.sh && aws --output text s3api list-object-versions --bucket yourbucket-name-backup | grep -E "^DELETEMARKERS" | grep -v "null" | awk '{print "aws s3api delete-object --bucket yourbucket-name-backup --key "" --version-id "";"}' >> deleteBucketScript.sh && . deleteBucketScript.sh; rm -f deleteBucketScript.sh;

, то вы можете использовать:

aws s3 rb s3://bucket-name --force     

ответ дан Nitin 16.09.2016 в 09:25
источник
  • Мой сотрудник установил правила жизненного цикла, которые будут медленно удалять ведра для версий в течение следующих нескольких дней. Ваш ответ ироничен в том, что он навсегда заканчивает окончание версий S3 в нашей системе. –  NobleUplift 20.09.2016 в 00:31
  • Из того, что я вижу, это единственный фактический ответ на основе CLI, который обслуживает ведра любого размера, который действительно работает. –  volvox 13.05.2018 в 22:33