我可以 undelete/access 在存储桶切换到版本控制之前创建的遗留 S3 密钥吗?

Can I undelete/access legacy S3 key that was created before bucket switched to versioning?

我有一个包含大量遗留文件的 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

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

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

问题是:有没有办法删除 retrieving/undeleting f2 的(唯一)版本?

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

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

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

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

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