尝试设置 Amazon 的 S3 存储桶:403 Forbidden error & setting permissions

Trying to set up Amazon's S3 bucket: 403 Forbidden error & setting permissions

我正在关注 Hartl 的 railstutorial.org,已经到达 11.4.4: Image upload in production。我做了什么:

权限: 教程指导"grant read and write permission to the user created in the previous step"。但是,在存储桶的 'Permissons' 下未提及新用户名。我只能在每个人、经过身份验证的用户、日志传送、我和亚马逊似乎根据我的名字 + 数字创建的用户名之间进行选择。我已经通过选择 Authenticated users 并选中 Upload/Delete 和 View 权限(而不是选择 List 和 Edit 权限)的框来尝试它。我还通过选择 Everyone 进行了尝试,并选中了所有四个框。结果是一样的。

初始化程序 carrier_wave.rb 设置为以下代码。我已将 region: 'eu-west-1' 添加到初始化程序(我从 here 得到的想法)以删除消息 connecting to the matching region will be more performant.

if Rails.env.production?
  CarrierWave.configure do |config|
    config.fog_credentials = {
      # Configuration for Amazon S3
      :provider              => 'AWS',
      :aws_access_key_id     => ENV['S3_ACCESS_KEY'],           # Set these key's using heroku config:set S3_ACCESS_KEY=<access key>
      :aws_secret_access_key => ENV['S3_SECRET_KEY'],
      :region                => 'eu-west-1'
    }
    config.fog_directory     =  ENV['S3_BUCKET']
  end
end

错误: 在生产环境中使用上传器上传图片时,出现错误 We're sorry, but something went wrong. Heroku 服务器日志显示:

app[web.1]:   SQL (1.7ms)  UPDATE "users" SET "avatar" = , "updated_at" =  WHERE "users"."id" =   [["avatar", "animaatjes.png.gif"], ["updated_at", "2015-05-20 12:37:56.683858"], ["id", 18]]
heroku[router]: at=info method=POST path="/users/18" host=xxx.herokuapp.com request_id=xxx-7f9f-4580-89ba-xxx fwd="xx.xxx.xx.xxx" dyno=web.1 connect=0ms service=3461ms status=500 bytes=1714
app[web.1]: Completed 500 Internal Server Error in 3317ms (ActiveRecord: 13.0ms)
app[web.1]:    (1.4ms)  ROLLBACK
app[web.1]: Excon::Errors::Forbidden (Expected(200) <=> Actual(403 Forbidden)
app[web.1]: excon.error.response
app[web.1]:   :body          => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>F8xxxD89</RequestId><HostId>MdB5iSMgxxx1vqE+Q=</HostId></Error>"
app[web.1]:   :headers       => {
app[web.1]:     "Connection"       => "close"
app[web.1]:     "Content-Type"     => "application/xml"
app[web.1]:     "Date"             => "Wed, 20 May 2015 12:37:57 GMT"
app[web.1]:     "Server"           => "AmazonS3"
app[web.1]:     "x-amz-id-2"       => "MdB5iSMg***K1vqdP+E+Q="
app[web.1]:     "x-amz-request-id" => "F80A**C58"
app[web.1]:   }
app[web.1]:   :local_address => "***.**.**.**"
app[web.1]:   :local_port    => *****
app[web.1]:   :reason_phrase => "Forbidden"
app[web.1]:   :remote_ip     => "**.***.***.***"
app[web.1]:   :status        => 403
app[web.1]:   :status_line   => "HTTP/1.1 403 Forbidden\r\n"
app[web.1]:   app/controllers/users_controller.rb:46:in 'update'
app[web.1]: Completed 500 Internal Server Error in 6151ms (ActiveRecord: 60.7ms) 

我做错了什么?我好像跟权限有关系?


更新: 原因原来是授予用户的策略。如果我授予用户标准 AmazonS3FullAccess,那么它就可以工作。它不适用于 AmazonS3ReadOnlyAccess,因为那时用户无法保存新图像。在我的应用中,用户基本上只需要2个权限:上传自己的头像和阅读头像。 使用 AmazonS3FullAccess 安全还是我应该编写自己的自定义策略?

我尝试了下面的自定义策略,它应该赋予应用程序读写权限(采用自 here),但仍然会产生 403 Forbidden 错误。

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

问题的根源确实是权限问题。有必要编写自定义策略并在存储桶上设置 CORS 配置。对于想要实现本章 rails 教程的任何未来用户,请参阅 以获取必要的代码。

我遇到了同样的问题,亚马逊改变了他们的布局,所以现在创建用户策略与以前有点不同。因此,一旦您创建了一个策略,请记住将该策略附加到相关用户,否则您将收到 403 禁止错误

在我的例子中 s3:PutObjectAcl 是缺少的权限

我遇到了教程中的两个问题 -

查看你的 heroku 日志 -

禁止

套接字错误

我花了一天的时间试图解决这个问题,我基本上重新回到了基础,重新创建了一个新的 IAM 用户和一个新的 s3 存储桶,但这次将 REGION 保留为美国标准——我能找到的唯一 s3 权限因为政策是完全访问 - 没有别的 - 所以附加

还要在 heroku 上重新输入和确认 ENV 变量,以及从教程中复制和粘贴 carrier_wave.rb - 一定要确定。)

第一次我在摆弄并且不确定该怎么做所以我可能会点击一些不同的东西 - 添加组和权限,查看错误的东西 - 有时重置并逐步完成所有事情,特别是在探索 AWS 和 IMS 和 s3 之后第一次。

有趣的是,在 heroku 中,他们指示将存储桶区域设置为美国标准,并且 post 警告 - 请务必在与您的应用程序相同的区域创建存储桶,以利用 AWS 的免费区域内数据传输速率。

在这里阅读 heroku 到 s3 配置的好文章 -> https://devcenter.heroku.com/articles/s3

要启用 S3 文件上传,我必须:

  • 指定我的地区(美国西部)
  • 创建 IAM 用户
  • 添加将用户指定为委托人的存储桶策略
{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AllowFileUpload",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::XXXXXXX:user/instaswan"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::instaswan-dev",
                "arn:aws:s3:::instaswan-dev/*"
            ]
        }
    ]
}

确保同时包含顶级资源和“/*”资源,并包含您需要的任何其他 "Action" 属性。

如果使用 IAM 用户配置您的存储桶,您可能会缺少设置 IAM 策略的步骤。

转到 IAM 控制台,select 您的用户,转到 permissions tab,单击 attach policy 按钮并添加 administrator access

之后错误应该消失,您可以毫无问题地上传文件 ;)

我遇到了同样的问题。尝试了许多解决方案,包括 S3@FullAccess、创建用户、编写自定义策略。如果有人遇到问题,请检查存储桶权限。转到 bucketname > Permissions > Public Access Settings,然后将两个 ACL 设置从 True 更改为 False。