当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在.bashrc环境变量中存储AmazonS3凭据会导致Rails应用程序失败》经验,为你挑选了1个好方法。

我正在开发一个使用回形针在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']
)

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

undefined method `stringify_keys' for #

/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.



1> stephenmurdo..:

经过多次搜索,我找到了答案 - 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文档,说有些用户不得不这样做.再次感谢.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有