2014-01-06 10 views
8

最近、s3cmd toolを使用して、数千のPaperlclip添付ファイルをローカルストレージからAmazon S3に移動しました。私がこれを達成した方法の詳細はhereですが、要約すると、次のコマンドを使用してすべての古い添付ファイルを移行しました。403 s3cmdツールを使用してAmazon S3にアップロードされたペーパークリップ添付ファイルのアクセス

s3cmd sync my-app/public/system/ s3://mybucket 

新しいS3バケットを使用するようにコードベースを更新しました。接続をテストしたところすべて正常です。実際には、私のアプリケーションを通してリモートS3バケツに新しい添付ファイルをアップロードし、問題を表示/ダウンロードすることができます。しかし、PaperclipとS3が互いに同期していないようだが、私がs3バケツに移動した添付ファイル(以下の画像がぼやけている)は、私が試してみると、応用。同じバケットにアップロードされた新しい添付ファイルはうまく読み込まれます。

permission denied for old attachments migrated to s3

私は次のように構成されたIAMグループのセットアップ持っている:私は接続がうまく確立言うつもりです、私はS3に新しい添付ファイルをアップロードすることができるという事実から判断する

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": "s3:*", 
     "Resource": "arn:aws:s3:::mybucket/*" 
    } 
    ] 
} 

を。私は私のバケットに私のアプリケーションを通してバケットにアクセスするものとは異なるIAMユーザアカウントを介して接続するためにs3cmdをセットアップすると信じています。許可の問題かもしれませんか?もしそうなら、上記のアクセス権をどのようにして変更して、それらのファイルにアクセス権を与えることができますか?

私はaws-sdkを使用して、ペーパークリップとS3を統合しています。

編集:私は、私は自分のアプリケーションで使用するものではなく、管理キーを使用してファイルをアップロードしたとして、それは所有権の問題だったかもしれないと思った 。バケツをパージし、アプリケーションが使用していたのと同じキーを使用するように構成した後、s3cmdを再同期しました。しかし、私は同じ結果に出会った。

EDIT2: 私は自分のアプリケーションのための私の生産コンソールに入ると、手動で私のバケットと相互作用することにより、&接続、さらに私のアクセス許可を確認することができます。すべてが正常に動作しています。つまり、ブラウザが403秒間に返すファイルを取得できます。

> s3 = AWS::S3.new 
=> <AWS::S3> 
> bucket = s3.buckets['mybucket'] 
=> #<AWS::S3::Bucket:mybucket> 
> bucket.exists? 
=> true 
> image = bucket.objects["SomeFolder/SomeImage.jpg"] 
=> <AWS::S3::S3Object:SomeFolder/SomeImage.jpg> 
> puts image.read 
=> ǃ���^�D��턣�����=m������f ... machine code 
+0

私がS3管理コンソールに入り、手動でバックセット内の画像に移動し、ダウンロード権限を 'Everyone'に与えると、私はもはや403を取得しません。結局のところ、権限の問題のように見えますが、誰でも素早い修正を知っていますか?私は上記の私の方針がこれをカバーしていると思っていたが、私はそうは思わない。 – Noz

+0

ポリシーは良好に見えます。問題のユーザーはこのポリシーを添付したグループのメンバーですか?ポリシーがグループに関連付けられているかどうか。あなたが本質的にしたことは、必ずしも良いことではないかもしれないあなたのバケツを公開しました。 – Rico

+0

ええ、ユーザーはそのグループの一部です。私のバケツを公開したのはどういう意味ですか? – Noz

答えて

14

あなたのS3バケットポリシーは、パブリックユーザーからのパブリックリードアクセスを適切に許可していないようです。以下のような何か試してみてください:

{ 
    "Version": "2008-10-17", 
    "Statement": [ 
    { 
     "Sid": "AllowPublicRead", 
     "Effect": "Allow", 
     "Principal": { 
     "AWS": "*" 
     }, 
     "Action": [ 
     "s3:GetObject" 
     ], 
     "Resource": [ 
     "arn:aws:s3:::my-brand-new-bucket/*" 
     ] 
    } 
    ] 
} 

を、あなたが手動でパブリック読み取りアクセス許可を適用すると、パブリックユーザーとして、これらのファイルにアクセスすることができるという事実は、あなたのバケットポリシーが正しく読み取りアクセスを許可されていません確認します。

パブリックS3 URLを使用してファイルにアクセスすると、認証されたユーザーは存在しません。

+1

Aha!ここで私はこれらのURLを注意深く見て、 'AccessKey'や' Signature' ... dohはありません! [こちら](https://github.com/thoughtbot/paperclip/wiki/Restricting-Access-to-Objects-Stored-on-Amazon-S3)Github WikiのPaperclip repoでは、認証済みの要求。 – Noz

+0

これは、OPポリシーに「追加」または「代わりに」なるはずですか?また、「プリンシパルはポリシーに許可されていません」というエラーメッセージが表示されます。 – Jeff

+0

提供されたポリシーで十分です。 https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-2を参照してください。 – jwadsack

関連する問題