我的application.rb:
S3_CREDENTIALS = YAML.load(File.read(File.expand_path(Rails.root.join("config","s3_credentials.yml"))))["production"]
# AWS::S3::Base.establish_connection! S3_CREDENTIALS['connection']
AWS::S3::Base.establish_connection!(
:access_key_id => S3_CREDENTIALS['access_key_id'],
:secret_access_key => S3_CREDENTIALS['secret_access_key'],
:persistent => true, # from http://www.ruby-forum.com/topic/110842
s3_credentials.yml:
production: &defaults
access_key_id: <%=ENV['AWS_ACCESS_KEY_ID']%>
secret_access_key: <%=ENV['AWS_SECRET_ACCESS_KEY']%>
persistent: true
我启动了我的Web服务器,在我的customers_controller中,我检查了连接:
Rails.logger.info("S3 service connected? " + AWS::S3::Base.connected?.to_s)
日志显示它已连接:
S3 service connected? true
所以我知道以下内容:
我的env变量是正确的。 我的初始化程序和yml文件是正确的。 宝石很好
然后我在控制器中执行这样简单的操作:
@documents = Service.buckets()
我重新加载页面,然后我们开始:
AWS::S3::InvalidAccessKeyId in CustomersController#edit
The AWS Access Key Id you provided does not exist in our records.
THE KICKER -
当我打印我的密钥并以明文形式访问密钥到application.rb文件中时(摆脱s3_credentials.yml文件,只需将密钥放入application.rb文件中的相应行 - 我不会得到错误。
为什么使用带有aws-s3 gem的环境变量会使用API方法失败但加载得很好?钥匙不能同时好坏。如果钥匙错误,它根本不会连接,对吗?
答案 0 :(得分:1)
我在下班后发现的是,我正在使用的aws-s3宝石版本中存在固有的东西。期。除了修复宝石之外没有解决方案,我没有时间去那么远。我检查了源和何时到connection.rb模块,找到它调用键的位置。它使用自己的extract_keys!方法,然后戳了一会儿我放弃了。
我最终使用了aws-sdk gem。 Config与aws-s3有点不同,但是相同的ENV vars现在都在运行。
我向aws-s3 gem的所有者提交了一个请求来查看。但我不知道宝石有多活跃。
当你需要的只是对S3东西的一些简单访问时,aws-sdk是过度的,但无论如何。它有效。以下是一些配置,以防有人在将来发现它有用:
aws.yml:
development: &defaults
access_key_id: <%=ENV['AWS_ACCESS_KEY_ID']%>
secret_access_key: <%=ENV['AWS_SECRET_ACCESS_KEY']%>
persistent: true
# bucket: YOUR BUCKET
max_file_size: 10485760
acl: public-read
注意:&lt;%=%&gt;上面的语法没有空格。通常我用空格格式化它。对于某些人来说这可能听起来很疯狂,但是如果你在标签和里面的值之间放置空格,你将会从亚马逊那里得到一个错误,说一些只需要一个空间的疯狂东西。这让我疯了。领先或尾随空间应该无关紧要!但确实如此。我把空间拿出来 - 开始工作了。叫我疯了。我花了几个小时与你争斗,所以你不必这样做!
application.rb(部分):
# Establish a base connection to Amazon S3
S3_CREDENTIALS = YAML.load(File.read(File.expand_path(Rails.root.join("config","aws.yml"))))["development"]
AWS.config(
:access_key_id => S3_CREDENTIALS['access_key_id'],
:secret_access_key => S3_CREDENTIALS['secret_access_key'],
)
当然,将AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY导出到您的环境中。
在Mac上,只需'导出AWS_ACCESS_KEY_ID = YOUR_KEY_GOES_HERE AWS_SECRET_ACCESS_KEY = YOUR_SECRET_KEY_GOES_HERE'并点击返回。
Heroku是:
heroku config:设置AWS_ACCESS_KEY_ID = YOUR_KEY_GOES_HERE AWS_SECRET_ACCESS_KEY = YOUR_SECRET_KEY_GOES_HERE
如果您使用的是Windows,则无法为您做任何事情。
答案 1 :(得分:0)
如果密钥错误,它是不对的。您是否尝试确保S3_CREDENTIALS['access_key_id']
和ENV['AWS_ACCESS_KEY_ID']
包含您认为包含的内容?我的第一个猜测是S3_CREDENTIALS['access_key_id']
最终包含文字字符串<%=ENV['AWS_ACCESS_KEY_ID']%>
(未解释),因为您在加载文件之前没有将yaml文件作为erb处理。