ruby-on-rails – 在.bashrc环境变量中存储Amazon S3凭据会导致Rails应用程序失败

我正在开发一个使用回形针在Amazon S3上存储东西的rails应用程序.
该应用程序托管在Heroku上.
我正在开发Ubuntu Karmic.

我将要描述的问题发生在开发(在我的localhost上)和生产(在Heroku上).

将S3信用卡传递给回形针的标准方法是将它们放入config / s3.yml中,如下所示:

access_key_id: 12345678
secret_access_key: 903490409fdf09fshsfdoif/43432

当我这样做时,一切正常.但是这使得我很难与其他人分享我的代码,因此Heroku提出了另一种方法http://docs.heroku.com/config-vars.

他们建议您将S3_KEY和S3_SECRET放入.bashrc中,如下所示:

S3_KEY=12345678
export S3_KEY
S3_SECRET=903490409fdf09fshsfdoif/43432
export S3_SECRET

然后他们建议您创建config / initializers / s3.yml(注意稍微不同的路径)并将以下内容放入该文件中:

AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],:secret_access_key => ENV['S3_SECRET']
)

但是,当我这样做时,回形针会抛出一个摇摆器并吐出以下错误信息:

undefined method `stringify_keys' for #<String:0xb6d6c3f4>

/vendor/plugins/paperclip/lib/paperclip/storage.rb:176:in `parse_credentials'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:138:in `extended'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:137:in `instance_eval'
/vendor/plugins/paperclip/lib/paperclip/storage.rb:137:in `extended'

.... other stuff

很明显,这一切都在storage.rb模块中开始.单步执行堆栈跟踪:

标记了第176行的parse_credentials方法 – 这是代码显示调用

def parse_credentials creds
  creds = find_credentials(creds).stringify_keys
  (creds[RAILS_ENV] || creds).symbolize_keys
end

parse_credentials方法尝试调用一个方法find_credentials,这就是我认为问题所在.下面是find_credentials的代码

def find_credentials creds
    case creds
    when File
      YAML::load(ERB.new(File.read(creds.path)).result)
    when String
      YAML::load(ERB.new(File.read(creds)).result)
    when Hash
      creds
    else
      raise ArgumentError,"Credentials are not a path,file,or hash."
    end
end

我无法看到find_credentials方法如何配备读取.bashrc文件中的值.它有两种情况可以从YAML读取,另一种情况是在寻找散列.

我的模型引用了这样的凭证:

has_attached_file :photo,(some code removed)
                :s3_credentials => "#{RAILS_ROOT}/config/initializers/s3.yml",

如果我从模型中删除:s3_credentials哈希,则stringify_keys错误消失,rails控制台会抛出find_credentials方法末尾出现的错误消息:即“凭据不是路径,文件或散列”.

所以我很难过.我意识到这对于Heroku的人来说可能是一个问题(我实际上是通过电子邮件发送这个链接,希望他们可以回复它),这也可能是思想机器人的问题.

正如我在开始时所说的那样,当我采用标准方法将我的密钥和秘密粘贴到config / s3.yml中时,我的应用程序正常工作,但我更喜欢使用Heroku建议的方法,因为它使我的方式变得更容易这意味着我可以将我的repo存储在我的公共github页面上,供其他人使用,而无需在Git中编写任何客户合并驱动程序,以保持我的api密钥不在公共领域之外.

我已经尝试将ENV变量粘贴在etc / bash.bashrc以及〜/ .bashrc中,重新启动后,我仍然遇到同样的问题.问题出现在开发机器和Heroku上.我已经确保将我的配置变量也推送到Heroku.

解决方法

经过多次搜索,我找到了答案 – http://tammersaleh.com/posts/managing-heroku-environment-variables-for-local-development

诀窍是完全删除S3.rb文件,只需参考模型中的ENV变量,如下所示:

has_attached_file :photo,#...
                  :storage        => :s3,:bucket         => ENV['S3_BUCKET'],:s3_credentials => { :access_key_id     => ENV['S3_KEY'],:secret_access_key => ENV['S3_SECRET'] }

无论如何,大卫,谢谢你的建议.我不知道你是否想更新Heroku文档,说有些用户不得不这样做.再次感谢.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...