最近我开始使用Michael Hartl的Ruby on Rails Tutorial学习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 Forbiddenrn"
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,如果有人能帮我解决这个问题,那就太好了。
我仍然没有明确的解决方案。我必须面对两个问题...
区域"us-east-1">是错误的;期望"us-east-2",我通过添加此行来修复此错误
:region => ENV['S3_REGION']
在我的 carrier_wave.rb 文件中,然后..
heroku config:set S3_REGION=<bucket region>
我还创建了一个新存储桶、新 IAM 用户,并向用户授予了管理员访问权限
- 接下来 解决此问题后,我收到类似...
AccessDenied
在 heroku 日志中,我不知道为什么即使在为存储桶设置了所有正确的策略并向 IAM 用户添加完全访问权限后,我也被拒绝访问,最后,我能够通过转到我的 s3 存储桶 -> 权限 -> 公有访问设置 -> 编辑 -> 然后取消选中选项......
- 阻止新的公共 ACL 和上传公共对象(推荐)
- 删除通过公共 ACL 授予的公有访问权限(推荐)
我知道这可以让公众访问我的存储桶,但现在,我只有这个选项来让它工作,(这是一个爱好项目,所以公共访问对我来说无关紧要)。
但是,如果有人想出更好的解决方案,请告诉我...