2013-09-30 4 views
5

これは約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環境を開くと、上に示したすべてのコマンドを実行すると、動作します。私は問題なく許可を変更することができます。タスクが実行されても、セロリのログにエラーがスローされないので、実際にはエラーが発生しているとは思われません。変更する予定のものを変更しないだけです。私が試してみました

もの:

  1. 私は、このようなk.set_contents_from_filename(file,policy='public-read')またはk.make_public()またはb.set_acl('public-read',out_name)などの権限機能の他のバージョンを使用しようとしましたが、それらのどれもどちらか働きました。
  2. バケットの権限を変更して、誰も権限を変更することが許可されていて、それでも機能しないと言っていました。
  3. 私は、以下これにバケットポリシーを変更しようとしましたが、それは何の効果行われません。最後に

    { "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などのほとんどのバージョンが新しくなっていると思いますが、私はこれを正しくインポートしていると思います。質問に答えるためにもっと情報が必要な場合は教えてください。何が起こっているのか本当に分かりません。

ありがとうございます事前に

+0

質問がたくさんあります^)具体的には、あなたのキーにACLを設定するには、k.set_contents_from_filename(file、policy = 'public-read')を実行してください。これにより、別の操作ではなく、ファイルの書き込み時にACLを設定できます。 – garnaat

+0

こんにちはガーネット、おかげで、提案。 「私が試したこと」のセクションでは、キーを「パブリック・リード」に設定するためにすべてのバリアントを実行しようとしていたことを述べました。あなたが提案したのは私が試したものです。間違いなく良い提案ですが、まだ動作しません。本当に私を混乱させるのは、Python環境からバリアントが動作することです。また、tasks.pyのコードからは動作しません。提案していただきありがとうございます! – barragan

答えて

7

私は約4日後に問題を自分で解決しました。答えは私の鼻の下にあったのです。だからこそ起こるかもしれない他の誰かのために、私は愚かさを暴露するでしょう。

私はセロリにとって非常に新しいです。私が気づいていなかったことは、セロリの仕事に変更を加えるたびに、あなたの労働者が変更を見て再開する必要があるということです。私が開発しているたびに私はいつも自分で働き始めたので、これは私にとっては決して問題ではありませんでしたが、最近デーモンとしてセロリを実行するように切り替えました。これは、セロリがずっと動いていた最初の変化でした。

私のコマンドが表示されるように、デーモンを再起動する必要があっただけです。それはすべて今働く。私は行ってセロリの文書の中の行を検索しようとしました、あるいは変更を加えたときにこれを行うことを覚えておくことについてのガイドを始めました。開発に役立つことができ

http://docs.celeryproject.org/en/latest/internals/reference/celery.worker.autoreload.html

:私はいくつかの他の回答を介してこれを見つけました。しかし、私はセクレタリーに新しい人に働きかけて、労働者を再開させる必要があることを知っていることを確かめるようにするという明確な行は見ていない。おそらくこれは明らかで、私はあまりにも新しいです。誰かがそれについての情報へのリンクがどこにあるかを知っていれば、それは誰かが将来それを読むことを望むかもしれないので、これを歓迎する投稿になるでしょう。みんなの時間を無駄にして申し訳ありません。

関連する問題