0

我有一个包含一堆旧文件的 S3 存储桶。我刚刚打开了版本控制,并试图弄清楚与切换后上传的新文件相比,这给了我对旧文件的哪种删除保护。这是一些示例代码:

import boto
c = boto.connect_s3()
bucket = c.get_bucket('my-bucket')
pfx='myfolder/subfolder/'
i = 0
for k in bucket.list_versions(prefix=pfx):
    if type(k) == boto.s3.deletemarker.DeleteMarker:
        print "DM %s %s" % (k.name, k.version_id)
    else:
        s = k.get_contents_as_string()
        print "REG %s %s %d" % (k.name, k.version_id, len(s))

包含pfx一些遗留文件,所以我第一次运行它时,我得到了这样的东西:

REG myfolder/subfolder/ null 0
REG myfolder/subfolder/f1 null 369
REG myfolder/subfolder/f2 null 427
REG myfolder/subfolder/f3 null 141

f2然后我使用该S3Browser工具删除。当我重新运行上面的代码时,我得到了这个:

REG myfolder/subfolder/ null 0
REG myfolder/subfolder/f1 null 369
DM myfolder/subfolder/f2 KPNaxqBeIrCGKUx3tYUsRDwWzKbX06
REG myfolder/subfolder/f2 null 427
REG myfolder/subfolder/f3 null 141

问题是:有没有办法检索/取消f2删除我刚刚删除的(唯一)版本?

4

2 回答 2

1

在以前未版本化的存储桶上启用版本控制可以对现有对象提供与新对象完全相同的删除保护,只有一个细微差别......并且这种差异在您的输出中是可见的,尽管一开始很难理解。

版本化存储桶中版本化对象的每个版本都有一个版本 ID,当您删除最新版本时,它会被一个删除标记替换,该标记会获取一个新的版本 ID。要访问旧版本,您可以通过其版本 ID 访问它,或者删除删除标记。这一切,你已经知道了。

不同之处在于,当您启用版本控制时,所有现有的非版本控制对象实际上都会获得一个版本 ID,而该版本 ID 实际上是“null”。不是三值逻辑意义上的“值不存在”中的“空”,而是实际上是 4 个字节n u l l。您可以使用此版本 ID 访问对象,就像通过其密钥和版本 ID 访问任何版本化对象一样。

于 2015-02-05T01:59:52.340 回答
0

在存储桶上启用版本控制后,它将为存储桶中的所有对象启用。任何被删除的对象,无论它是在启用版本控制之前还是之后创建的,都会导致将 DeleteMarker 写入存储桶。除非您明确执行版本化删除操作,否则该对象以及该对象的任何先前版本仍将存在。

因此,如果您调用list_versions(prefix='myfolder/subfolder/f2')该存储桶,它应该Key为保留的版本返回一个对象。您应该能够使用对象的常规方法Key来检索对象的内容。

于 2015-02-03T23:29:07.130 回答