以前Ruby on Railsの開発で便利な,rails_config + figaroの紹介をしていたかと思います.
http://h3poteto.hatenablog.com/entry/2014/04/12/232406
Railsでの開発における,環境変数の設定がラクにできるよということで,この組み合わせがすごく便利なのですが,
今日は,これで作成したアプリをAWSで動かした際に苦労したfigaroのバグについてです.
figaro
https://github.com/laserlemon/figaro
このGem非常に便利でよく使うのですが,development環境で環境変数をapplication.ymlから読み込めるということは,本番環境でもapplication.ymlを用意する必要があります.
(もしくは本番マシンの~/.bashrcなどに環境変数を設定しておかなければなりません)
AWS OpsWorksを使っていると,この辺の,production環境のみの設定項目はCustom JSONに記載するのが一般的ですよね.
そうしてopsworks-cookbooks(https://github.com/aws/opsworks-cookbooks)によって読み込まれて,本番環境に設定が反映されます.
そのため,figaroのgithubページにもその様式が書かれています.
しかし,どのバージョンなのかは特定できないのですが,figaroがバグを持っており,どうやら環境変数が反映されない場合があります.
現状,Rails4で,最新のfigaroを入れいている状態で起こります.
原因を探ってみたのですが,同様の症例報告がなく……俺も会社の先輩から「あるらしい」という不確定情報をもらっただけでした.
figaro側の解決策は,現段階では探れていません.
とりあえずアプリケーション側の対応策として,自分でapplication.ymlを強制的に上書きするタスクを書いてやる必要がありました.
deploy/before_restart.rbを以下のように用意します.
# -*- coding: utf-8 -*- Chef::Log.info("Running deploy/before_restart.rb...") current_release = release_path node[:deploy].each do |application, deploy| if deploy[:custom_env].present? custom_env = {}.tap do |h| deploy[:custom_env].sort.each do |key, val| h[key] = val end end file "#{current_release}/config/application.yml" do owner deploy[:user] group deploy[:group] mode 0660 action :create content YAML::dump(custom_env) end end end
これに従うと,Custom JSONは
{ "deploy":{ "#{アプリーケション名}":{ "custom_env":{ "KEY":"VALUE" } } } }
と書いてやることで,ENV["KEY"]に"VALUE"という値がセットされます.
タイミングはどこでもいいのですが,settings.ymlなどで使っている場合は,before_restartより前に実行した方が良いですね.
いずれ修正されるとは思うのですが,AWSで,なおかつfigaroを使っている方で環境変数が設定できない場合には,使ってみてください.