微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 使用Paperclip和IAM策略将文件上传到Amazon时,访问被拒绝

我无法使用S3 IAM策略获取使用Paperclip的上传.我甚至有直接的jQuery上传问题(没有Paperclip).我的方案如下,我有一个应用程序将有很多网站.每个网站都有自己的桶,只能访问自己的桶,没有人. IAM Example Policies文档正是在“示例:允许每个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配置在桶上,当然,它会被锁定在以后:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>

以下是我的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:
最终解决方

这是我最终的基于this article的IAM政策:

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

和我更新的纸夹设置:

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

用户名包含在Paperclip路径中很重要.我假设亚马逊会从凭据中推断出,但事实并非如此.

解决方法

因为您正在尝试为上传的对象设置权限,还需要向IAM用户提供s3:PutObjectAcl权限.

原文地址:https://www.jb51.cc/ruby/265930.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐