これは約36時間の解決策を探していますので、私は質問を複製したり、私はS3で保存したファイルを操作し、S3で新しいバージョンを 'public-read' aclで置き換えなければならないWebアプリケーションを構築しています。その後、別のページで更新されたファイルを表示することができます。アプリはamazon EC2サーバー上に存在し、amazon S3バケットに接続します。botoとdjangoを使用してS3でファイルのアクセス権を設定できません
私はこれを行うには、django、celery、およびbotoを使用しています。セロリのタスクを設定して、自分のビューから情報を取得し、処理して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(名前)だけでいくつかの変換のものを行います。だから、これはファイルのパーミッションが 'public-read'でないことを除いて、ほとんどすべての点で機能します。私が想定しているすべてのAWS認証情報とバケット名は、S3との間でファイルをプッシュ/プルできるため、環境から正しくインポートされています。
大きな混乱を招く部分は、私のEC2サーバーのvenvまたは最初にインストールされたPythonからPython環境を開くと、上に示したすべてのコマンドを実行すると、動作します。私は問題なく許可を変更することができます。タスクが実行されても、セロリのログにエラーがスローされないので、実際にはエラーが発生しているとは思われません。変更する予定のものを変更しないだけです。私が試してみました
もの:
- 私は、このような
k.set_contents_from_filename(file,policy='public-read')
またはk.make_public()
または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環境からは問題ありませんが、そのインスタンスで実行されているコードでは問題ありません。私は検索して検索していて、うまくいきました提案を見つけることができませんでした。おそらく有用な別の情報です(ただし問題によっては無関係かもしれません)。私は、上記の同様のコマンドを実行して私のビューでS3に接続しようとすると、エラーを返します:
"ハンドラは認証準備ができていません1ハンドラがチェックされました。['HmacAuthV1Handler']資格情報を確認してください。「
これらのコマンドが自分のタスクで実行されても動作しますが(誤ったアクセスキーや秘密のアクセスキーなどと思われますが、
私は最近、このインスタンスを設定して、おそらくboto、セロリ、djangoなどのほとんどのバージョンが新しくなっていると思いますが、私はこれを正しくインポートしていると思います。質問に答えるためにもっと情報が必要な場合は教えてください。何が起こっているのか本当に分かりません。
ありがとうございます事前に
質問がたくさんあります^)具体的には、あなたのキーにACLを設定するには、k.set_contents_from_filename(file、policy = 'public-read')を実行してください。これにより、別の操作ではなく、ファイルの書き込み時にACLを設定できます。 – garnaat
こんにちはガーネット、おかげで、提案。 「私が試したこと」のセクションでは、キーを「パブリック・リード」に設定するためにすべてのバリアントを実行しようとしていたことを述べました。あなたが提案したのは私が試したものです。間違いなく良い提案ですが、まだ動作しません。本当に私を混乱させるのは、Python環境からバリアントが動作することです。また、tasks.pyのコードからは動作しません。提案していただきありがとうございます! – barragan