Установка владельца объектов в корзине S3 - PullRequest
6 голосов
/ 21 декабря 2011

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

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

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

Наверное, лучше задать вопрос ...

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

1 Ответ

2 голосов
/ 26 декабря 2011

Как оказалось, еще одним ограничением S3 является то, что вы, похоже, не можете сменить владельца объекта в ведре. Это делает политику корзины довольно бесполезной в подобных ситуациях. Как обходной путь, я должен был использовать ACL. Вы можете установить общедоступный ACL-список, используя гем ras 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...