簡體   English   中英

為什么我的Amazon S3密鑰權限不堅持?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM