2016-02-10 59 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策略中解決了問題。