Как я могу программно проверить разрешения Amazon S3 с помощью boto?

У нас есть кустистое дерево в ведре на Amazon S3 с большим количеством файлов. Я только что обнаружил, что, хотя некоторые файлы имеют две записи разрешений, как видно, если один щелкает файл в консоли управления AWS, затем свойства -> разрешения, одна строка — «все», а другая — какой-то конкретный пользователь, другие файлы имеют только один запись для этого пользователя. В результате у нас возникли проблемы с загрузкой этих файлов в инстансы Amazon EC2 с помощью boto или curl.

Что мне нужно сделать, так это просмотреть все файлы в корзине и проверить их. Я знаю, как получить полный список ключей для префикса. Могу ли я использовать boto для извлечения разрешений для ключа, и есть ли стандартный способ проверки, предназначены ли эти разрешения для всех или кого-то конкретного, и какие они?

Кроме того, как только я определяю, имеет ли ключ ограничительные разрешения, могу ли я изменить их программно, добавив разрешения на чтение «всем»?

Спасибо


person I Z    schedule 17.04.2013    source источник


Ответы (1)


Вот некоторый код Python, использующий boto, который просматривает все ключи в ведре. Если ключ не позволяет «всем» читать содержимое ключа, он добавит public-read разрешений для этого ключа:

import boto

all_users = 'http://acs.amazonaws.com/groups/global/AllUsers'
conn = boto.connect_s3()
bucket = conn.get_bucket('mybucket')

for key in bucket:
    readable = False
    acl = key.get_acl()
    for grant in acl.acl.grants:
        if grant.permission == 'READ':
            if grant.uri == all_users:
                readable = True
    if not readable:
        key.make_public()

Этот код не был тщательно протестирован, поэтому вам следует сначала попробовать. Кроме того, имейте в виду, что конечным результатом этого является то, что ВСЕ объекты в корзине могут быть прочитаны кем угодно. Также имейте в виду, что этот сценарий извлекает текущий ACL каждого объекта в корзине, поэтому, если есть миллионы объектов, это миллионы запросов, которые могут занять много времени и повлечь за собой определенные затраты.

Другой подход состоял бы в том, чтобы просто вызывать make_public() для каждого ключа в корзине, независимо от текущего ACL.

person garnaat    schedule 17.04.2013
comment
У меня много объектов в корзине, поэтому я хотел сделать этот процесс многопоточным. Вот мой код на случай, если кому-то он покажется полезным: pixelchef.net / - person northben; 18.07.2015
comment
У вас есть подобное решение для boto3? - person Kshitij Marwah; 27.10.2016