2016-02-10 52 views
5

为了让用户my-user能够访问名为my-bucket的Amazon S3存储桶,我的IAM策略应该是什么样子?使用Rails和Paperclip为s3创建简单Amazon IAM策略

目前,我有以下的政策分配给my-user

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": ["s3:ListBucket"], 
     "Resource": ["arn:aws:s3:::my-bucket"] 
    }, 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "s3:PutObject", 
     "s3:GetObject", 
     "s3:DeleteObject" 
     ], 
     "Resource": ["arn:aws:s3:::my-bucket/*"] 
    } 
    ] 
} 

我得到了下面的链接,从 “样品1” 这一政策:

http://blogs.aws.amazon.com/security/post/Tx3VRSWZ6B3SHAV/Writing-IAM-Policies-How-to-grant-access-to-an-Amazon-S3-bucket

在我production.rb文件,我已经实施了配置设置来告诉回形针使用S3:

config.paperclip_defaults = { 
    :storage => :s3, 
    :s3_credentials => { 
    :bucket => 'my-bucket', 
    :access_key_id => ENV['AWS_ACCESS_KEY_ID'], 
    :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] 
    } 
} 

当我尝试使用我的应用上传照片时,我收到一个AWS::S3::Errors::AccessDenied异常。

奇怪的是,如果我加载了轨道控制台,并运行下面的代码手动上传文件,它工作正常:

s3 = AWS::S3.new(access_key_id: ENV['AWS_ACCESS_KEY_ID'], secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']) 
bucket = s3.buckets['my-bucket'] 
obj = bucket.objects['new_file'] 
obj.write(Pathname.new('/path/to/file')) 

这正确地将文件上传到我的S3桶。我很困惑,为什么我明确有权以这种方式上传文件,但是当我尝试通过具有相同凭据的回形针进行操作时,我得到了拒绝权限的错误。

更令人困惑的是,当我将AdministratorAccess策略分配给my-user时,回形针能够成功上载文件。

任何想法如何解决这个问题?

回答

8

的解决方案是这里:https://stackoverflow.com/a/19185045/736864

当纸夹文件上载到S3,它也试图设置文件是公开可见的,这意味着用户需要被给予访问设置权限。将​​权限添加到我的IAM策略中解决了问题。