在.bashrc中的环境变量存储Amazon S3的凭据使Rails应用程序失败
-
20-09-2019 - |
题
我开发使用回形针存储在Amazon S3上的东西一个Rails应用程序。 该应用程序托管在Heroku上。 我开发Ubuntu的业报。
这是我将要描述的问题在发展中出现(在我的本地)和生产(在Heroku上)。
传递S3 creds至纸夹的标准方法是通过将它们在配置/ s3.yml像这样:
access_key_id: 12345678
secret_access_key: 903490409fdf09fshsfdoif/43432
当我这样做,一切都运行得很好。但是,这使得它很难分享我与别人的代码,以便Heroku的建议的替代方法 - 的http://文档。 heroku.com/config-vars 。
他们提醒,你应该把你S3_KEY和S3_SECRET到你的.bashrc像这样:
S3_KEY=12345678
export S3_KEY
S3_SECRET=903490409fdf09fshsfdoif/43432
export S3_SECRET
然后,他们建议你创建的config /初始化/ 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错误消失和导轨控制台抛出出现在find_credentials方法结束时的错误消息:即“凭证不是路径,文件,或散列”
所以我难倒。我意识到,这可能是在Heroku的家伙(我是谁究竟要在,希望他们能解此链接通过电子邮件发送给)一个问题,它也可能在thoughtbot的杜兹的问题。
正如我在开始时说,我的应用程序正常工作时,我把我的坚持密钥和密码进入配置/ s3.yml的标准方法,但我宁愿因为它使事物的方式更容易使用Heroku的建议方法对我来说,这意味着我可以存储我的公开GitHub的网页上我的回购为他人而无需编写任何客户使用合并司机的Git让我的API密钥了公共领域。
我试图在等/ bash.bashrc粘附的ENV变量以及〜/ .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的文档说,一些用户不得不做这种方式。感谢虽然一次。
其他提示
重命名文件config/initializers/s3.yml
到config/initializers/s3.rb
,并给它一个尝试。
下面是你的问题:
:bucket => ENV['S3_BUCKET'],
需要为
:bucket => <%= ENV['S3_BUCKET'] %>,
即。该分配不被解释。