【问题标题】:Cannot configure image hosting to aws s3 in rails app无法在 rails 应用程序中将图像托管配置为 aws s3
【发布时间】:2019-09-09 10:40:13
【问题描述】:

最近我开始使用 Michael Hartl 的 Ruby on Rails 教程学习 Rails。我已完成教程,但未能为用户的微博配置图片上传到 s3。

我已经配置了 carrier_wave.rb 文件,我已经在 aws 中创建了一个 IAM 用户和一个 s3 存储桶,并将一个策略附加到 IAM 用户以访问我的存储桶。似乎没有任何工作我总是得到一个

"Excon::Error::Forbidden (Expected(200) <=> Actual(403 Forbidden)
2019-04-19T04:52:31.446436+00:00 app[web.1]: excon.error.response" 

尝试在生产环境中上传图片时出错

Heroku 日志 -(我已将日志中的 heroku 应用和 s3 存储桶名称替换为我的 heroku 应用、s3 存储桶名称)

[fog][WARNING] fog: followed redirect to <s3 bucker name>.amazonaws.com,         connecting to the matching region will be more performant
2019-04-19T04:52:31.444385+00:00 heroku[router]: at=info method=POST path="/microposts" host=<my heroku app> request_id=e5749cd5-ba34-40fe-bfc7-86c7ce5e6a6a fwd="103.217.242.189" dyno=web.1 connect=1ms service=11246ms status=500 bytes=1891 protocol=https
2019-04-19T04:52:31.445127+00:00 app[web.1]: D, [2019-04-19T04:52:31.445032 #12] DEBUG -- : [e5749cd5-ba34-40fe-bfc7-86c7ce5e6a6a]    (1.2ms)  ROLLBACK
2019-04-19T04:52:31.445581+00:00 app[web.1]: I, [2019-04-19T04:52:31.445526 #12]  INFO -- : [e5749cd5-ba34-40fe-bfc7-86c7ce5e6a6a] Completed 500 Internal Server Error in 890ms (ActiveRecord: 37.4ms)
2019-04-19T04:52:31.446356+00:00 app[web.1]: F, [2019-04-19T04:52:31.446303 #12] FATAL -- : [e5749cd5-ba34-40fe-bfc7-86c7ce5e6a6a]
2019-04-19T04:52:31.446434+00:00 app[web.1]: F, [2019-04-19T04:52:31.446363 #12] FATAL -- : [e5749cd5-ba34-40fe-bfc7-86c7ce5e6a6a] Excon::Error::Forbidden (Expected(200) <=> Actual(403 Forbidden)
2019-04-19T04:52:31.446436+00:00 app[web.1]: excon.error.response
2019-04-19T04:52:31.446447+00:00 app[web.1]: :body          => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>

后面是我的 aws 访问密钥和大量数字 (StringToSignBytes) 那么……

2019-04-19T04:52:31.446448+00:00 app[web.1]: :cookies       => [
2019-04-19T04:52:31.446450+00:00 app[web.1]: ]
2019-04-19T04:52:31.446451+00:00 app[web.1]: :headers       => {
2019-04-19T04:52:31.446453+00:00 app[web.1]: "Connection"       => "close"
2019-04-19T04:52:31.446454+00:00 app[web.1]: "Content-Type"     => "application/xml"
2019-04-19T04:52:31.446455+00:00 app[web.1]: "Date"             => "Fri, 19 Apr 2019 04:52:31 GMT"
2019-04-19T04:52:31.446456+00:00 app[web.1]: "Server"           => "AmazonS3"
2019-04-19T04:52:31.446458+00:00 app[web.1]: "x-amz-id-2"       => "G/1U7/WV0h0AAXFPT19ncBYBI7NzwvOKTSMAXyC8DcW7+xTTPfkGALbc+6yRP2MqlUa2x7KMyZc="
2019-04-19T04:52:31.446459+00:00 app[web.1]: "x-amz-request-id" => "B98BDE6CED402707"
2019-04-19T04:52:31.446460+00:00 app[web.1]: }
2019-04-19T04:52:31.446461+00:00 app[web.1]: :host          => "<s3 bucket name>.s3.us-east-2.amazonaws.com"
2019-04-19T04:52:31.446463+00:00 app[web.1]: :local_address => "172.18.241.110"
2019-04-19T04:52:31.446464+00:00 app[web.1]: :local_port    => 42310
2019-04-19T04:52:31.446465+00:00 app[web.1]: :path          => "/uploads/micropost/picture/16/IMG_20190307_111228.jpg"
2019-04-19T04:52:31.446466+00:00 app[web.1]: :port          => 443
2019-04-19T04:52:31.446467+00:00 app[web.1]: :reason_phrase => "Forbidden"
2019-04-19T04:52:31.446468+00:00 app[web.1]: :remote_ip     => "52.219.104.8"
2019-04-19T04:52:31.446469+00:00 app[web.1]: :status        => 403
2019-04-19T04:52:31.446471+00:00 app[web.1]: :status_line   => "HTTP/1.1 403 Forbidden\r\n"
2019-04-19T04:52:31.446472+00:00 app[web.1]: ):
2019-04-19T04:52:31.446475+00:00 app[web.1]: F, [2019-04-19T04:52:31.446437 #12] FATAL -- : [e5749cd5-ba34-40fe-bfc7-86c7ce5e6a6a]
2019-04-19T04:52:31.446512+00:00 app[web.1]: F, [2019-04-19T04:52:31.446476 #12] FATAL -- : [e5749cd5-ba34-40fe-bfc7-86c7ce5e6a6a] app/controllers/microposts_controller.rb:11:in `create'

s3 IAM 用户政策

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::<my s3 bucket>*",
                "arn:aws:s3:::<my s3 bucket>/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        }
    ]
} 

载波.rb

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'],
      :aws_secret_access_key => ENV['S3_SECRET_KEY'],

    }
    config.fog_directory     =  ENV['S3_BUCKET']
  end
end

我已经使用...设置了访问密钥、密钥和存储桶

$ heroku config:set S3_ACCESS_KEY= <access key> 
$ heroku config:set S3_SECRET_KEY= <secret key> 
$ heroku config:set S3_BUCKET= <bucket name>

我的宝石文件

source 'https://rubygems.org'              # Get all ruby gems here

gem 'rails',                   '5.1.6'     
gem 'bcrypt',                  '3.1.12'    
gem 'faker',                   '1.7.3'    
gem 'carrierwave',             '1.2.2'    
gem 'mini_magick',             '4.7.0'    
gem 'will_paginate',           '3.1.6'     

gem 'bootstrap-will_paginate', '1.0.0'    
gem 'puma',                    '3.9.1'     
gem 'sass-rails',              '5.0.6'     
gem 'uglifier',                '3.2.0'    
gem 'coffee-rails',            '4.2.2'   
gem 'jquery-rails',            '4.3.1'     
gem 'turbolinks',              '5.0.1'    
gem 'jbuilder',                '2.7.0'     
gem 'bootstrap-sass',          '3.3.7'     

group :development, :test do
  gem 'sqlite3', '1.3.13'                  
  gem 'byebug',  '9.0.6', platform: :mri   
end

group :development do
  gem 'web-console',           '3.5.1'     
  gem 'listen',                '3.1.5'     
  gem 'spring',                '2.0.2'     
  gem 'spring-watcher-listen', '2.0.1'     
end

group :test do
  gem 'rails-controller-testing', '1.0.2'  
  gem 'minitest',                 '5.10.3' 
  gem 'minitest-reporters',       '1.1.14' 
  gem 'guard',                    '2.14.1' 
  gem 'guard-minitest',           '2.4.6'  
end

group :production do
  gem 'pg',  '0.20.0'                     
  gem 'fog', '1.42'                       


end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]             

我已经尝试更改 s3 存储桶区域,我的存储桶位于默认区域,并且我已经在 heroku 中验证了我的配置变量,S3_ACCESS_KEY、S3_SECRET_KEY、S3_BUCKET 设置正确且 S3_REGION=us-east-2。

这是我第一次使用aws,如果有人可以帮助我解决这个问题,那就太好了。

【问题讨论】:

标签: ruby-on-rails amazon-s3 carrierwave amazon-iam


【解决方案1】:

我仍然没有明确的解决方案。我必须面对两个问题...

  1. 区域“us-east-1”是错误的;期待'us-east-2',我通过添加这一行修复了这个错误

    :region                => ENV['S3_REGION']
    

    在我的 carrier_wave.rb 文件中,然后..

    heroku config:set S3_REGION=<bucket region>
    

我还创建了一个新存储桶、新 IAM 用户并授予该用户 AdministratorAccess 权限

  1. 接下来,在解决了这个问题后,我得到了一个错误,比如...

AccessDenied

在 heroku 日志中,我不知道为什么即使在为存储桶设置了所有正确的策略并为 IAM 用户添加了完全访问权限之后,我也被拒绝访问,最后,我能够通过访问我的s3 存储桶 -> 权限 -> 公共访问设置 -> 编辑 -> 然后取消选中选项...

  • 阻止新的公共 ACL 和上传公共对象(推荐)
  • 删除通过公共 ACL 授予的公共访问权限(推荐)

我知道这可以让公众访问我的存储桶,但目前我只有这个选项可以让它工作(这是一个爱好项目,所以公众访问对我来说并不重要)。

但如果有人提出更好的解决方案,请告诉我...

【讨论】:

    猜你喜欢
    • 2018-05-22
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2016-02-03
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    相关资源
    最近更新 更多