2011-12-21 37 views
6

Tôi đã thử nghiệm với S3 và chúng có tính năng tuyệt vời này, nơi bạn có thể đặt ACL trên nội dung của một nhóm thông qua chính sách nhóm. Vì vậy, ví dụ bạn có thể có một loạt các tệp với ACL thực tế trên tệp được đặt thành riêng tư nhưng tệp được cung cấp cho một số người dùng/địa chỉ ip/liên kết giới thiệu nhất định thông qua chính sách ghi đè.Đặt chủ sở hữu của các đối tượng trong một thùng S3

Trong trường hợp của tôi, tôi có nhiều nội dung riêng tư trong một nhóm nhưng tôi muốn tạo tệp trong một thư mục cụ thể có sẵn cho trang web của mình (ví dụ: Hình ảnh). Vì vậy, tôi có một cái gì đó như thế này:

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

Bây giờ chúng tôi có một số nền tôi có thể nhận được câu hỏi. Gần đây tôi phát hiện ra ở đây:

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

Đó chính sách xô chỉ làm việc cho các tập tin được sở hữu bởi chủ sở hữu xô. Vì vậy, ví dụ nếu các tệp kết thúc trong nhóm thông qua một số dịch vụ bên ngoài như encoding.com hoặc dòng gấu trúc nơi chúng có người dùng riêng trên nhóm S3 của bạn, bạn sẽ gặp sự cố vì chính sách nhóm của bạn sẽ không được áp dụng cho những tệp này (có vẻ như một sự giám sát của amazon theo ý kiến ​​của tôi nhưng tôi chắc chắn có một lý do chính đáng mà tôi không nghĩ đến)

Tôi đang sử dụng đường ray, có cách nào để đặt chủ sở hữu của một đối tượng trong một cái xô.

Sửa

Tôi đoán một câu hỏi tốt hơn có thể là ...

Có cách nào để thiết lập một xô amazon nên áp dụng chính sách xô đến tất cả các file không phân biệt chủ sở hữu.

Trả lời

2

Vì hóa ra một hạn chế khác của S3 là bạn dường như không thể thay đổi chủ sở hữu của một đối tượng trong một thùng. Điều này làm cho chính sách nhóm trở nên vô dụng trong các tình huống như thế này. Là một công việc xung quanh, tôi đã phải quay trở lại bằng cách sử dụng một ACL. Bạn có thể đặt một ACL công cộng sử dụng đường ray AWS-SDK đá quý như thế này ..

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 

Trong trường hợp bạn không có quyền kiểm soát người dùng tạo ra nội dung nhưng bạn vẫn muốn nó tin (ví dụ, khi sử dụng một số thương hiệu mã hóa video dựa trên web), bạn có thể đạt được điều này bằng cách sao chép tệp sau khi tệp được tạo (tài khoản của bạn sẽ sở hữu bản sao), xóa bản sao cũ và sau đó sao chép lại. Không lý tưởng nhưng nó hoạt động.

Các vấn đề liên quan