无法上传到已部署应用的AWS S3存储桶

时间:2017-02-02 17:33:53

标签: ruby-on-rails ruby amazon-web-services heroku

我正在编写一个Ruby on Rails Web应用程序,其功能需要将图像上传到AWS。在本地运行应用程序时,我能够上传到AWS就好了。但是当我部署到Heroku时遇到了问题。

当我尝试上传图片时出现错误。我的日志显示:

Aws::S3::Errors::AccessDenied (Access Denied) 

config / environments / production.rb:

config.paperclip_defaults = {
   :storage => :s3,
   :s3_region => ENV.fetch('AWS_REGION'),
   :bucket => ENV.fetch('AWS_BUCKET'),
   :s3_credentials => {:access_key_id => ENV.fetch('AWS_ACCESS_KEY_ID'),
                    :secret_access_key => ENV.fetch('AWS_SECRET_ACCESS_KEY')}
}

我做过的其他事情:

  • 创建IAM用户

  • 使用heroku config:set foo=bar

  • 将IAM用户的凭据上传到heroku
  • 修改IAM用户的权限以包含AmazonS3FullAccess

  • 添加Bucket政策

     {
        "Version": "2012-10-17",
        "Statement": [
      {
        "Sid": "AllowFileUpload",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::[**id**]:user/user-heroku"
        },
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::clothes-swapper/*",
            "arn:aws:s3:::clothes-swapper"
            ]
       }
       ]
     }
    

2 个答案:

答案 0 :(得分:0)

在您的存储桶的“权限”选项卡中检查您的CORS配置。我有一个类似的问题,并更新此修复它。使用原始和方法更新CORSRule,与enter image description here

下面完全相同

答案 1 :(得分:0)

原来这是一个简单的问题。所有凭据都应该在:s3_credentials哈希

config.paperclip_defaults = {
:storage => :s3,
:s3_credentials => {
                      :bucket => ENV.fetch('AWS_BUCKET'),
                      :access_key_id => ENV.fetch('AWS_ACCESS_KEY_ID'),
                      :secret_access_key => ENV.fetch('AWS_SECRET_ACCESS_KEY'),
                      :s3_region => ENV.fetch('AWS_REGION'),
                    }
}

我还删除并在亚马逊上创建了新的访问密钥。这也可以解决这个问题。