私はこれに対する解決策を約36時間見つけようとしてきたので、質問を重複させたり、明白なことを尋ねたりしないことを願っています. S3 に保存したファイルを操作し、「public-read」acl を使用して新しいバージョンを S3 に戻す必要がある Web アプリを構築しています。その後、別のページで更新されたファイルを表示できます。アプリは Amazon EC2 サーバー上に存在し、Amazon S3 バケットに接続します。
これを行うために、ジャンゴ、セロリ、およびボトを使用しています。ビューの 1 つから情報を取得して処理を実行し、新しいファイルを S3 にポストするセロリ タスクをセットアップしました。S3 から元のファイルを取得し、正常に操作して、S3 に再投稿できました。機能していないように見える唯一のことは、そのファイルのアクセス許可を変更することです。そのため、表示ページに移動する場合を除いてすべてが機能し、そのファイルにアクセスしようとすると 403 (禁止) エラーが発生します。
自分で S3 にアクセスし、そのファイルのアクセス許可を全員が読み取れるように変更すると、すべて機能します。先に進む前に、私のタスクで使用するコードは次のとおりです。
name = 'filename.blah'
conn = boto.connect_s3()
b = conn.get_bucket(settings.AWS_STORAGE_BUCKET_NAME)
grab_from_S3(name,b) # grab file from S3
out_name = conv(name)
send_to_S3(out_name,b)
そこにある機能は次のとおりです。
def grab_from_S3(file,bucket):
k = Key(bucket)
k.key = file
k.get_contents_to_filename(file)
def send_to_S3(file,bucket):
k = Key(bucket)
k.key = file
k.set_contents_from_filename(file)
k.set_acl('public-read')
そして conv(name) は、いくつかの変換を行うだけです。したがって、これは、ファイルのアクセス許可が「public-read」でないことを除いて、ほぼすべての方法で機能します。S3 との間でファイルをプッシュおよびプルできるため、AWS 資格情報とバケット名はすべて環境から適切にインポートされていると思います。
大きな紛らわしい部分は、EC2サーバーのvenvまたは最初にインストールされたpythonのいずれかからpython環境を開いて、上記のすべてのコマンドを実行すると、動作することです。問題なく権限を変更できます。また、タスクが実行されてもセロリログにエラーはスローされないため、タスクで実際にエラーが発生しているとは思いません。変えるべきものを変えていないだけです。
私が試したこと:
k.set_contents_from_filename(file,policy='public-read')
ork.make_public()
orなどの他のバージョンのアクセス許可機能を使用しようとしましb.set_acl('public-read',out_name)
たが、どれも機能しませんでした。- バケットのアクセス許可を変更して、誰もがアクセス許可を変更できるようにしましたが、それでも機能しませんでした。
バケット ポリシーを以下のように変更しようとしましたが、効果がありませんでした。
{ "Version": "2008-10-17", "Id": "whatever", "Statement": [ { "Sid": "whatever", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": [ "s3:PutObjectAcl", "s3:PutObject"], "Resource": [ "arn:aws:s3:::bucket_name", "arn:aws:s3:::bucket_name/*" ] } ] }
結局、私は本当に混乱しています。なぜなら、同じ EC2 インスタンス上の Python 環境からはこのすべてを問題なく実行できるように見えるのですが、そのインスタンスで実行されているコードからはそうではないからです。私は検索して検索しましたが、うまくいく提案を見つけることができませんでした。もう 1 つの有用な情報 (ただし、問題によっては無関係かもしれません) は、上記の同様のコマンドを実行してビューで S3 に接続しようとすると、エラーが返されることです。
「認証する準備ができているハンドラーがありませんでした。1 つのハンドラーがチェックされました。['HmacAuthV1Handler'] 資格情報を確認してください」
これらのコマンドが私のタスクで実行されたときに機能しますが(間違ったアクセスキーまたはシークレットアクセスキーか何かであると思いますが、他のすべてで機能します)。必要なbotoライブラリの一部のPythonコードで正しいインポートを行っていると思います。
最近、このインスタンスをセットアップしたので、ほぼ最新バージョンの boto、celery、django などがインストールされています。私はおそらく何かを忘れました。質問に答えるためにさらに情報が必要な場合はお知らせください。何が起こっているのか本当にわかりません。
事前に感謝します。