2011-12-21 3 views
6

Я экспериментировал с S3, и у них есть эта классная функция, где вы можете установить ACL на содержимое ведра с помощью политики ведра. Так, например, у вас может быть множество файлов с фактическим ACL в файле, установленном в приватный, но файл становится доступным для определенных пользователей/IP-адресов/рефереров через переопределяющую политику.Настройка владельца объектов в ведре S3

В моем случае у меня есть куча личного контента в ведре, но я хочу сделать файлы в определенном каталоге доступными для моего сайта (например, изображения). Итак, у меня есть что-то вроде этого:

{ 
    "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, у вас будут проблемы, потому что ваша политика ведра не будет применяться к эти файлы (кажется, что я считаю недосмотр амазонки, но я уверен, что есть веская причина, о которой я не думал)

Я использую рельсы, есть способ установить владельца объекта в ведро.

Редактировать

Я думаю, лучше вопрос может быть ...

Есть ли способ настроить амазонка ведра так относится ведро политика ко всем файлам, независимо от владельца.

ответ

2

Как оказалось, еще одно ограничение S3 заключается в том, что вы не можете изменить владельца объекта в ведре. Это приводит к тому, что политики в виде ковша бесполезны в таких ситуациях. Как работа, мне пришлось отказаться от использования ACL. Вы можете установить публичный ACL, используя рельсы AWS-SDK драгоценный камень, как это ..

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 

В тех случаях, когда вы не имеете контроля над пользователем, который создает контент, но вы все еще хотите это частный (например, при использовании некоторых марок веб-кодирования видео), вы можете добиться этого, скопировав файл после его создания (ваша учетная запись будет иметь копию), удалите старый, а затем скопируйте его обратно. Не идеальный, но он работает.

Смежные вопросы