aws-s3 gem将在application.rb中连接,但在API方法的后续使用中失败

时间:2013-10-09 21:12:16

标签: ruby-on-rails ruby ruby-on-rails-3 amazon-web-services amazon-s3

我的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​​方法失败但加载得很好?钥匙不能同时好坏。如果钥匙错误,它根本不会连接,对吗?

2 个答案:

答案 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处理。