4

Pythonライブラリbotoを使用してAmazonS3に接続し、静的Webサイトのバケットとキーを作成しています。私のキーと値は動的に生成されるため、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例外が発生しました。明らかに、私はそれを作成しようとしているので、キーはありません。

私はこれを間違った方法で行っていますか?キーを更新するのではなく、キーを作成するためにこれを行う別の方法はありますか?そして、許可が固執しないときに、ある種の競合状態が発生していますか?

4

3 に答える 3

11

上記のコードが機能しなかった理由はまだ完全にはわかりませんが、キーを作成するための別の (または新しい?) 構文を見つけました。操作の順序にも影響があるようです。これは私が思いついたものです。

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
于 2011-12-28T16:22:22.637 に答える
4

これは私も噛みつきました。boto のset_contents_from_string()方法は明らかにキーの ACL を非公開に設定し、既存の ACL をオーバーライドします。

したがってset_acl('public-read')、 に続けて を実行するset_contents_from_string()と、'public-read'がオーバーライドされます。

于 2014-05-01T15:30:13.450 に答える
2

ポリシー キーワード arg を使用して、ACL を一度に設定できました。

k.set_contents_from_stream(buff, policy='public-read')
于 2014-05-22T06:04:45.913 に答える