使用Paperclip和IAM策略将文件上载到Amazon时拒绝访问

我无法使用S3 IAM策略使用Paperclip上传。 我甚至遇到直接jQuery上传的问题(没有Paperclip)。 我的方案如下,我有一个应用程序,将有许多网站。 每个站点都有自己的桶,应该只能访问自己的桶,没有其他人的桶。 IAM示例策略文档在“示例:允许每个IAM用户访问存储桶中的文件夹”下准确说明了我想要执行的操作。 我为应用程序设置了一个IAM组,并且该组中每个站点都有一个用户。 这些IAM用户属于该组。 该小组的政策如下:

{ "Version":"2012-10-17", "Statement":[{ "Effect":"Allow", "Action":[ "s3:PutObject", "s3:GetObject", "s3:GetObjectVersion", "s3:DeleteObject", "s3:DeleteObjectVersion" ], "Resource":"arn:aws:s3:::my-app/${aws:username}/*" } ] } 

这是我在存储桶上的CORS配置,当然开发时它会被锁定:

    * GET POST PUT *   

这是我的Paperclip设置:

 has_attached_file :background_image, storage: :s3, s3_credentials: { access_key_id: "xxx", secret_access_key: "xxx" }, bucket: "my-app", s3_permissions: "public-read", path: "/background_images/:id/:filename" 

我以前一直在使用直接在策略上的策略,它确实有效,但是当我进入具有许多“站点”的生产环境时,它不像我需要的那样灵活。 据我所知,我已完全遵循文档,但我所做的任何事情都会导致“访问被拒绝”。 此时我甚至不确定我的问题是我的IAM策略还是我的Paperclip配置。

编辑:澄清。

编辑2:最终解决方案

以下是基于本文的最终IAM策略:

 { "Version":"2012-10-17", "Statement": [ { "Sid": "AllowUserToSeeBucketListInTheConsole", "Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"], "Effect": "Allow", "Resource": ["arn:aws:s3:::*"] }, { "Sid": "AllowRootAndHomeListingOfCompanyBucket", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::my-app"], "Condition":{"StringEquals":{"s3:prefix":["","home/"],"s3:delimiter":["/"]}} }, { "Sid": "AllowListingOfUserFolder", "Action": ["s3:ListBucket"], "Effect": "Allow", "Resource": ["arn:aws:s3:::estimator-app"], "Condition":{"StringLike":{"s3:prefix":["home/${aws:username}/*"]}} }, { "Sid": "AllowAllS3ActionsInUserFolder", "Effect": "Allow", "Action": ["s3:*"], "Resource": ["arn:aws:s3:::my-app/home/${aws:username}/*"] } ] } 

我更新的Paperclip设置:

 has_attached_file :background_image, storage: :s3, s3_credentials: { access_key_id: "xxx", secret_access_key: "xxx" }, bucket: "estimator-app", s3_permissions: "public-read", path: "/home/my_s3_username/background_images/:id/:filename" 

在Paperclip路径中包含用户名非常重要。 我假设亚马逊会从凭证推断出这一点,但事实并非如此。

因为您尝试为上载的对象设置权限,所以还需要为IAM用户提供s3:PutObjectAcl权限。