Как вывести список всех версий объекта из корзины и их соответствующих метаданных (x-amz-meta-version) - PullRequest
0 голосов
/ 09 марта 2019

чтобы достичь того, что в названии, я пытаюсь выполнить пару шагов (используя python & AWS SDK), которые я перечислю после того, как упомяну об ошибке, которую я получаю: 412 "По крайней мере одно из указанных вами предварительных условий не выполненоhold »во второй итерации метода get_object, когда я отправляю ему параметры: bucket, key и IfMatch (в этой строке происходит сбой).

Вывести список всех версий объекта с помощью следующего кода

s3 = boto3.client('s3')
response = s3.list_object_versions(
                    Bucket='my-bucket',
                    Prefix='file.exe'
                )
obj_versions = response["Versions"]

Это полностью работает, но мне нужны версии, которые я установил в метаданных (x-amz-meta-version), чтобы получить каждый объектверсия метаданных Я пытаюсь сделать следующее:

obj_info = []
for obj_version in obj_versions:
    obj = s3.get_object(
            Bucket='my-bucket',
            Key='file.exe',
            IfMatch=obj_version['ETag']
        )
    obj_info.append(obj['Metadata']['version'])

И это все, на данный момент это работает только до второй итерации, как это ни странно, но всегда с ошибкой 412 "По крайней мере, одно из предварительных условий, которые выуказанное не удерживается "в строке s3.get_object (IfMatch).Я точно знаю, что ошибка в предварительном условии IfMatch, но я понятия не имею, что не так ... Я напечатал каждый ETag, который он получает, и все они действительны, он должен иметь возможность получить объект.Спасибо за чтение моего поста.

1 Ответ

0 голосов
/ 09 марта 2019

s3.get_object() пытается получить текущую версию объекта, если вы не включите VersionId другой версии, поэтому поведение, которое вы наблюдаете, правильное - ETagтекущая версия не соответствует передаваемому вами значению etag, поэтому предварительное условие не выполняется.ETag не является ключом поиска, а IfMatch не является селектором (это условный запрос - «не давайте мне объект, если не совпадает предусловие»), и в любом случае несколько версий объекта могут иметь одинаковыеETag, если версии объекта имеют одинаковую полезную нагрузку (в зависимости от типа шифрования, которое вы используете в корзине - стандарт требует, чтобы etags различались только при различной полезной нагрузке; технически не требуется, чтобы они соответствовали, если полезная нагрузка совпадает).

Обратите внимание, что если вам нужны только метаданные, то по соображениям стоимости и производительности следует использовать s3.head_object(), чтобы избежать выборки полезных данных объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...