[英]Why are my Amazon S3 key permissions not sticking?
我正在使用Python庫boto
連接到Amazon S3並為靜態網站創建存儲桶和密鑰。 我的鍵和值是動態生成的,因此我以編程方式而不是通過Web界面(它使用Web界面工作)進行此操作。 我的代碼目前看起來像這樣:
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
異常。 顯然關鍵不在那里,因為我正在努力創造它。
我是以錯誤的方式來做這件事的嗎? 有沒有不同的方法來創建密鑰而不是更新密鑰? 當權限不堅持時,我是否遇到某種競爭條件?
我仍然不完全確定為什么上面的代碼不起作用,但我發現了一種不同的(或更新的?)語法來創建密鑰。 操作順序似乎也有一些影響。 這就是我提出的有效方法:
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
這也困擾了我。 boto的set_contents_from_string()
方法顯然將密鑰的ACL設置為private,覆蓋任何現有的ACL。
因此,如果你執行set_acl('public-read')
,然后執行set_contents_from_string()
,則會覆蓋'public-read'
。
我可以通過policy關鍵字arg一次性設置ACL:
k.set_contents_from_stream(buff, policy='public-read')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.