Почему мои права доступа к Amazon S3 не остаются? - PullRequest
4 голосов
/ 28 декабря 2011

Я использую библиотеку Python boto для подключения к Amazon S3 и создания блоков и ключей для статического веб-сайта.Мои ключи и значения генерируются динамически, поэтому я делаю это программно, а не через веб-интерфейс (он работает с помощью веб-интерфейса).Мой код в настоящее время выглядит так:

import boto
from boto.s3.connection import S3Connection
from boto.s3.key import Key

conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
bucket = conn.create_bucket(BUCKET_NAME)
bucket.configure_website('index.html', 'error.html')
bucket.set_acl('public-read')

for template in ['index.html', 'contact-us.html', 'cart.html', 'checkout.html']:
    k = Key(bucket)
    k.key = key
    k.set_acl('public-read')
    k.set_metadata('Content-Type', 'text/html')
    k.set_contents_from_string(get_page_contents(template))

Я получаю различные ошибки и проблемы с этим кодом.Когда ключи уже существуют, и я использовал этот код для их обновления, я устанавливал ACL каждого ключа на public-read, но при просмотре файла в браузере все равно получал 403 запрещенных ошибки.

Я попытался удалить все ключи, чтобы воссоздать их с нуля, и теперь я получаю исключение NoSuchKey.Очевидно, ключа нет, потому что я пытаюсь его создать.

Я поступаю неправильно?Есть ли другой способ сделать это для создания ключей, в отличие от их обновления?И испытываю ли я какое-то состояние гонки, когда разрешения не меняются?

Ответы [ 3 ]

11 голосов
/ 28 декабря 2011

Я все еще не совсем уверен, почему приведенный выше код не работает, но я нашел другой (или более новый?) Синтаксис для создания ключей. Порядок операций также, кажется, имеет некоторый эффект. Вот что я придумал, чтобы сработало:

conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
bucket = conn.create_bucket(store.domain_name)
bucket.set_acl('public-read')
bucket.configure_website('index.html', 'error.html')

for template in ['index.html', 'contact-us.html', 'cart.html', 'checkout.html']:
    k = bucket.new_key(template)
    k.set_metadata('Content-Type', 'text/html')
    k.set_contents_from_string(get_page_contents(template))
    k.set_acl('public-read') #doing this last seems to be important for some reason
4 голосов
/ 01 мая 2014

Меня это тоже укусило.Метод boto set_contents_from_string(), по-видимому, устанавливает ACL ключа как частный, переопределяя любой существующий ACL.

Так что если вы выполните set_acl('public-read'), а затем set_contents_from_string(), 'public-read' будет переопределено.

2 голосов
/ 22 мая 2014

Мне удалось установить ACL за один раз с помощью ключевого слова политики arg:

k.set_contents_from_stream(buff, policy='public-read')
...