figaroで環境変数を設定したRailsアプリをAWSで運用する際のバグについて

以前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を使っている方で環境変数が設定できない場合には,使ってみてください.