2011-12-21 19 views
6

私はS3を試していますが、バケツポリシーを通じてバケットのコンテンツにACLを設定することができるこのクールな機能があります。たとえば、プライベートに設定されたファイル上の実際のACLを持つファイルをたくさん用意することができますが、ファイルは特定のユーザー/ IPアドレス/参照元が優先ポリシーによって利用できるようになります。S3バケット内のオブジェクトのオーナーを設定する

私の場合、バケツにはプライベートなコンテンツがたくさんありますが、特定のディレクトリのファイルを自分のサイトで利用できるようにしたいとします(Imagesなど)。だから私はこのようなものを持っている:

{ 
    "Version": "2008-10-17", 
    "Id": "", 
    "Statement": [ 
     { 
      "Sid": "AddPerm", 
      "Effect": "Allow", 
      "Principal": { 
       "AWS": "*" 
      }, 
      "Action": "s3:GetObject", 
      "Resource": "arn:aws:s3:::content-racket-fm/uploaded/images/*" 
     } 
    ] 
} 

今私は質問に行くことができるいくつかの背景があります。私は最近、ここを発見:

https://forums.aws.amazon.com/thread.jspa?threadID=78294

そのバケットポリシーは唯一バケットの所有者が所有するをされているファイルのために働きます。たとえばバージョンのポリシーがencoding.comやpandaストリームのようないくつかの外部サービスを介してバケット内で終わった場合、バケツポリシーが適用されないため問題が発生しますこれらのファイル(私の考えではアマゾンの見落としのように思えますが、私が考えていない良い理由があると確信しています)

私はレールを使用しています。バケツ。

編集

私はより良い質問があるかもしれないと思う...

は、それは関係なく、所有者のすべてのファイルにバケットポリシーを適用アマゾンバケットよう設定する方法があります。

答えて

2

S3のもう一つの限界が判明したので、バケット内のオブジェクトの所有者を変更することはできないようです。これは、バケツポリシーをこのような状況ではかなり役に立たなくします。回避策として、ACLを使用して後退しなければなりませんでした。あなたはこのように、レールAWS-SDKの宝石を使用してパブリックACLを設定することができます。..

class AwsHelper 

    # This method can be used to set a public acl on any object. The parameter file_path 
    # will be the path to the file in the bucket minus the domain info, so if your full url was 
    # http://s3.amazonaws.com/<your-bucket>/images/image1.png, file path would be 
    # images/image1.png 
    def self.set_public_acl(file_path) 

    @bucket_path = ENV['S3_BUCKET'] 

    Rails.logger.warn "===> Loading S3" 
    s3 = AWS::S3.new 

    if(s3) 
     bucket = s3.buckets[@bucket_path] 

     if(bucket.exists?) 
     Rails.logger.warn "===> Bucket '#{@bucket_path}' FOUND" 

     key = bucket.objects[file_path] 

     if(key.exists?) 
      Rails.logger.warn "===> Key '#{file_path}' FOUND" 

      key.acl = :public_read 

      Rails.logger.warn "===> ACL Set to public read:" 
      key.acl.grants.each { |grant| Rails.logger.warn "grantee => #{grant.grantee.group_uri}, permission => #{grant.permission.name}"} 

      return key 
     end 
     end 
    end 
    end 

end 

あなたがコンテンツを作成するユーザーを制御できませんが、あなたはまだ、例えば(それはプライベートたい場合にはいくつかのブランドのウェブベースのビデオエンコーディングを使用している場合)は、ファイルを作成した後(そのアカウントはコピーを所有する)ファイルをコピーし、古いファイルを削除してからコピーすることで実現できます。理想的ではないが動作する。

関連する問題