2014-11-21 34 views
1

在啓用了版本的存儲桶中使用python/boto與AWS S3接口 - 如何將密鑰還原爲歷史版本?Python/Boto + AWS S3版本控制:我如何用舊版本替換當前密鑰?

我可以下載文件的歷史版本並重新上傳,但效率不高,會導致重複密鑰。有沒有辦法選擇我想要的版本並將其設置爲活動/當前版本(例如,在版本未提供時會自動下載)?

from boto.s3.connection import S3Connection 
from boto.s3.key import Key 

conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) 
bucket = conn.create_bucket('my_test_bucket') 
key = Key(bucket) 
key.key = 'my_file.pdf' 
key.set_contents_from_filename('1.pdf') 
key.set_contents_from_filename('2.pdf') 
key.set_contents_from_filename('3.pdf') 

# Now I have a file with the key `my_file.pdf` 
# and I can see the versions using something like: 
versions = list(bucket.list_versions('my_file.pdf')) 
print [k.version_id for k in versions] 

# To make on older version active, I can download & re-upload 
versions[1].get_contents_to_filename('old.pdf') 
key.set_contents_from_filename('old.pdf') 

# But this seems very inefficient, and creates duplicate version keys. It would be 
# Nice to do something like: 
versions[1].last_modified = datetime.now() 
# Or even this, but this seems less efficient: 
versions[1].copy('my_test_bucket', 'my_file.pdf') # And then delete 
bucket.delete_key('my_file.pdf', version_id=versions[1]) 

回答

3

你不能「動」的一個版本是「當前」版本,但您可以使用copy_key()到以前的版本複製到相同的密鑰,從而使之成爲「當前」版本。

> versions = list(bucket.list_versions('my_file.pdf')) 
> print [k.version_id for k in versions] 
[u'tsbfD0oKQ87a.cWyImABs5lVhVv84dnC', u'0nKieCek8C4q4GegjXKh8UhJCoiAMrqM', u'null'] 
> key.name 
'my_file.pdf' 
> bucket.copy_key(key.name, 'bucket-name', key.name, src_version_id=u'0nKieCek8C4q4GegjXKh8UhJCoiAMrqM') 

這會產生一個新版本,它是早期版本的副本。所有複製都在「S3」內完成,無需下載/上傳內容。

是的,它仍然創建另一個版本。如果這是不希望的,你可以刪除以前的版本:

bucket.delete_key(key.name,version_id=u'0nKieCek8C4q4GegjXKh8UhJCoiAMrqM') 
+0

謝謝 - 這很好! – 2014-11-25 20:56:18

相關問題