2011-06-29 2 views
10

Lorsque je tente de supprimer un seau à l'aide des lignes:Comment supprimer une version s3 d'un seau à l'aide boto et python

conn = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) 

print conn.delete_Bucket('BucketNameHere').message 

Il me dit que le seau j'ai essayé de supprimer n'est pas vide.

Le compartiment n'a aucune clé. Mais il a des versions.

Comment puis-je supprimer les versions?

je peux voir la liste des versions en utilisant bucket.list_versions()

Java possède une méthode DeleteVersion sur sa connexion s3. Je trouve que le code ici:

http://bytecoded.blogspot.com/2011/01/recursive-delete-utility-for-version.html

Il le fait en ligne pour supprimer la version:

s3.deleteVersion(new DeleteVersionRequest(bucketName, keyName, versionId)); 

Y at-il quelque chose de comparable à Boto?

Répondre

20

Boto prend en charge les compartiments versionnés après la version 1.9c. Voici comment cela fonctionne:

import boto 

s3 = boto.connect_s3() 

#Create a versioned bucket 
bucket = s3.create_bucket("versioned.example.com") 
bucket.configure_versioning(True) 

#Create a new key and make a few versions 
key = bucket.new_key("versioned_object") 
key.set_contents_from_string("Version 1") 
key.set_contents_from_string("Version 2") 

#Try to delete bucket 
bucket.delete() ## FAILS with 409 Conflict 

#Delete our key then try to delete our bucket again 
bucket.delete_key("versioned_object") 
bucket.delete() ## STILL FAILS with 409 Conflict 

#Let's see what's in there 
list(bucket.list()) ## Returns empty list [] 

#What's in there including versions? 
list(bucket.list_versions()) ## Returns list of keys and delete markers 

#This time delete all versions including delete markers 
for version in bucket.list_versions(): 
    #NOTE we're still using bucket.delete, we're just adding the version_id parameter 
    bucket.delete_key(version.name, version_id = version.version_id) 

#Now what's in there 
list(bucket.list_versions()) ## Returns empty list [] 

#Ok, now delete the bucket 
bucket.delete() ## SUCCESS!! 
+0

Merci! Ça a marché. – ChickenFur

+0

Juste m'a sauvé un tas de tracas. Me rendait fou! – Sirex

+1

Vous devez utiliser delete_keys, pas delete_key. c'est super duper plus vite. Voir ceci pour la solution équivalente, mais en utilisant delete_keys: http://stackoverflow.com/questions/29809105/how-do-i-delete-a-versioned-bucket-in-aws-s3-using-the-cli – grayaii

Questions connexes