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

17

Я пробовал оба 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
источник

7 ответов

4

Один из способов сделать это - перебирать версии и удалять их. Немного сложно в 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
источник
15

Я столкнулся с тем же ограничением 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
источник
8

Используя 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
источник
4

У меня возникли проблемы с решением 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!

    
ответ дан Chuckles 26.10.2016 в 17:25
источник
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
источник
3

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

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

    
ответ дан Cheers 27.06.2015 в 09:47
источник
1

Вот один лайнер, который вы можете просто вырезать и вставить в командную строку, чтобы удалить все версии и удалить маркеры (для этого требуются инструменты 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
источник