Могу ли я восстановить / получить доступ к устаревшему ключу 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, Вы можете использовать этот идентификатор версии для доступа к объекту так же, как вы обращаетесь к любому версионному объекту по его ключу и идентификатору версии.

Другие вопросы по тегам