6

私は S3 を試してみましたが、バケット ポリシーを通じてバケットのコンテンツに ACL を設定できるこのクールな機能があります。したがって、たとえば、ファイルの実際の ACL が非公開に設定された一連のファイルを持つことができますが、上書きポリシーを通じて特定のユーザー / IP アドレス / リファラーがファイルを利用できるようになります。

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

{
    "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 stream などの外部サービスを介してファイルがバケットに格納され、S3 バケットに独自のユーザーが存在する場合、バケット ポリシーが適用されないため、問題が発生します。これらのファイル (私の意見では、これは Amazon による見落としのように思えますが、私が思いもよらなかった正当な理由があると確信しています)

私はレールを使用しています。オブジェクトの所有者をバケットに設定する方法はありますか。

編集

もっと良い質問があると思います...

所有者に関係なくすべてのファイルにバケット ポリシーを適用するように、Amazon バケットをセットアップする方法はありますか。

4

1 に答える 1

2

結局のところ、S3 の別の制限は、バケット内のオブジェクトの所有者を変更できないように見えることです。これにより、このような状況ではバケット ポリシーはほとんど役に立ちません。回避策として、ACL の使用に頼る必要がありました。次のように rails AWS-SDK gem を使用してパブリック 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

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

于 2011-12-26T07:48:33.440 に答える