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

前端之家收集整理的这篇文章主要介绍了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.f2er.com/ruby/265930.html

猜你在找的Ruby相关文章