1

我的应用程序.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

我启动我的网络服务器并在我的 customers_controller 中检查连接:

Rails.logger.info("S3 service connected? " + AWS::S3::Base.connected?.to_s)

日志说它已连接:

S3 service connected? true

所以我知道以下内容:

我的环境变量是正确的。我的初始化程序和 yml 文件是正确的。宝石很好

那么我在控制器中做这样简单的事情:

@documents = Service.buckets()

我重新加载页面,我们开始:

AWS::S3::InvalidAccessKeyId in CustomersController#edit

The AWS Access Key Id you provided does not exist in our records.

踢球者——

当我将我的密钥和访问密钥以纯文本形式打印到 application.rb 文件中时(去掉 s3_credentials.yml 文件,只需将密钥放入 application.rb 文件中的适当行 - 我不会收到错误消息.

为什么使用带有 aws-s3 gem 的环境变量在使用 API 方法时会失败,但加载得很好?钥匙不能同时好坏。如果键错了,它根本不会连接,对吗?

4

2 回答 2

1

下班后我发现,我正在使用的 aws-s3 gem 版本中存在一些固有的问题。时期。除了修复宝石之外没有其他解决方案,而且我没有时间走那么远。我检查了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

注意:上面的 <%= %> 语法没有空格。通常我用空格格式化它。这对某些人来说可能听起来很疯狂,但如果你在标签和里面的值之间放置空格,你会从亚马逊那里得到一个错误,说一些关于只需要一个空格的疯狂东西。这让我发疯了。前导或尾随空格无关紧要!但确实如此。我把空间拿出来——开始工作。叫我疯子。我花了几个小时来解决这个问题,所以你不必这样做!

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 配置:设置 AWS_ACCESS_KEY_ID=YOUR_KEY_GOES_HERE AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY_GOES_HERE

如果您使用的是 Windows,则无法为您做任何事情。

于 2013-10-10T06:42:45.053 回答
0

你是对的,如果钥匙错了,它永远不会起作用。您是否尝试过确保S3_CREDENTIALS['access_key_id']ENV['AWS_ACCESS_KEY_ID']包含您认为它们包含的内容?我的第一个猜测是,由于在加载文件之前您没有将 yaml 文件作为 erb 处理,因此S3_CREDENTIALS['access_key_id']最终包含 (未解释) 的文字字符串。<%=ENV['AWS_ACCESS_KEY_ID']%>

于 2013-10-10T05:37:06.637 回答