2011-12-21 12 views
6

He estado experimentando con S3 y tienen esta característica genial en la que puede establecer ACL en el contenido de un depósito a través de una política de depósito. Entonces, por ejemplo, puede tener un grupo de archivos con la ACL real en el archivo establecido en privado, pero el archivo está disponible para ciertos usuarios/direcciones IP/referentes a través de la política principal.Configurando el propietario de los objetos en un cubo S3

En mi caso, tengo un montón de contenido privado en un cubo, pero quiero poner los archivos en un directorio particular disponible para mi sitio (por ejemplo, Imágenes). Así que tengo algo como esto:

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

Ahora tenemos algunos antecedentes que puedo llegar a la pregunta. Hace poco me encontré aquí:

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

Que las políticas de cubo sólo funcionan para archivos que son propiedad por el propietario del depósito. Entonces, por ejemplo, si los archivos terminaron en el cubo a través de un servicio externo como encoding.com o panda stream donde tienen su propio usuario en su depósito S3, va a tener problemas porque su política de depósito no se aplicará a estos archivos (que parece un descuido de Amazon, en mi opinión, pero estoy seguro de que hay una buena razón por la que no he pensado)

Estoy usando rieles, ¿hay alguna manera de configurar al propietario de un objeto? un balde.

Editar

supongo que una mejor pregunta podría ser ...

¿Hay una manera de configurar un depósito de Amazon por lo que se aplica la política de cubo para todos los archivos independientemente del propietario.

Respuesta

2

Como resulta que otra limitación de S3 es que parece que no puede cambiar el propietario de un objeto en una cubeta. Esto hace que las políticas de cubo sean bastante inútiles en situaciones como esta. Como solución alternativa, tuve que recurrir al uso de una ACL. Se puede establecer una ACL pública utilizando el SDK de rieles AWS-joya como esta ..

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 

En los casos en los que no tiene control sobre el usuario que crea el contenido, pero todavía lo quieren privada (por ejemplo, cuando usa algunas marcas de codificación de video basada en web), puede lograr esto copiando el archivo después de haberlo creado (su cuenta será propietaria de la copia), elimine el anterior y cópielo de nuevo. No es ideal, pero funciona.

Cuestiones relacionadas