Могу ли я восстановить / получить доступ к устаревшему ключу S3, который был создан до того, как ведро переключилось на управление версиями?
У меня есть корзина 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
Я только что удалил?
2 ответа
Как только вы включаете управление версиями в корзине, оно включается для всех объектов в корзине. Любой удаленный объект, независимо от того, был ли он создан до или после включения управления версиями, приведет к записи DeleteMarker в корзину. Объект и все предыдущие версии объекта все еще будут там, если вы явно не выполните версионную операцию удаления.
Итак, если вы позвоните list_versions(prefix='myfolder/subfolder/f2')
на это ведро должно вернуть Key
объект для версии, которая остается. Вы должны быть в состоянии использовать обычные методы Key
объект для извлечения содержимого объекта.
Включение управления версиями в ранее неверсированной корзине дает точно такую же защиту от удаления для существующих объектов, как и для новых объектов, только с одним незначительным отличием... и это различие видно в ваших выходных данных, хотя поначалу это трудно понять.
Каждая версия версионного объекта в версионных корзинах имеет идентификатор версии, и при удалении последней версии он заменяется маркером удаления, который получает идентификатор новой версии. Для доступа к старой версии вы получаете доступ к ней по ее идентификатору или удаляете маркер удаления. Все это вы уже знаете.
Разница в том, что когда вы включаете управление версиями, все существующие не версионные объекты фактически получают идентификатор версии, и этот идентификатор версии буквально равен "нулю". Не "ноль", как в "значение отсутствует" в смысле трехзначной логики, но на самом деле 4 байта, n u l l
, Вы можете использовать этот идентификатор версии для доступа к объекту так же, как вы обращаетесь к любому версионному объекту по его ключу и идентификатору версии.