環境変数を管理できるGem「figaro」を使ってみる
こんにちは!kossyです!
今回は環境変数を管理できるGem「figaro」を個人開発アプリに導入してみたので、備忘録としてブログに残してみたいと思います。
偉大なる本家レポジトリ
環境
Ruby 2.6.8
Rails 6.0.4.1
docker-compose 1.27.0
導入
まずはGemfileを編集してbundle。
# Gemfile gem 'figaro' # terminal $ bundle
次に、以下のコマンドを実行します。
# terminal
$ bundle exec figaro install
create config/application.yml
append .gitignore
config配下にapplication.ymlというファイルが追加され、.gitigoreに当該ファイルが追加されました。
# config/application.yml # Add configuration values here, as shown below. # # pusher_app_id: "2954" # pusher_key: 7381a978f7dd7f9a1117 # pusher_secret: abdc3b896a0ffb85d373 # stripe_api_key: sk_test_2J0l093xOyW72XUYJHE4Dv2r # stripe_publishable_key: pk_test_ro9jV5SNwGb1yYlQfzG17LHK # # production: # stripe_api_key: sk_live_EeHnL644i6zo4Iyq4v1KdV9H # stripe_publishable_key: pk_live_9lcthxpSIHbGwmdO941O1XVU
使い方
application.ymlで定義した値は、ENVオブジェクトで参照できます。
# config/application.yml sendgrid_user_name: api_key sendgrid_api_key: AA.AAaaAaaaAA1aaa1a_AAAAaA.aaaAAAaAaAa1aa1AaAa1AaAaaaaAAAAaaaAaAAAaAAa sendgrid_domain: kossy-web-engineer@example.com # terminal $ rails c > ENV["sendgrid_user_name"] => "api_key" > ENV["sendgrid_api_key"] => "AA.AAaaAaaaAA1aaa1a_AAAAaA.aaaAAAaAaAa1aa1AaAa1AaAaaaaAAAAaaaAaAAAaAAa" > ENV["sendgrid_domain"] => "kossy-web-engineer@example.com"
ENVオブジェクトのkeyを指定することで値を取得することができました。
rails c は特にオプションを付与しないとデフォルトでdevelop環境で立ち上がるので、試しにtest環境で起動してみます。
# config/application.yml development: sendgrid_user_name: api_key sendgrid_api_key: AA.AAaaAaaaAA1aaa1a_AAAAaA.aaaAAAaAaAa1aa1AaAa1AaAaaaaAAAAaaaAaAAAaAAa sendgrid_domain: kossy-web-engineer@example.com test: sendgrid_user_name: test_api_key # 変更 sendgrid_api_key: AA.AAaaAaaaAA1aaa1a_AAAAaA.aaaAAAaAaAa1aa1AaAa1AaAaaaaAAAAaaaAaAAAaAAa sendgrid_domain: kossy-web-engineer@example.com # terminal $ RAILS_ENV=test rails c > Rails.env => "test" > ENV["sendgrid_user_name"] => "test_api_key"
test環境の場合はtest環境の値が返却されるのが確認できました。
応用的な使い方(その1)
githubのReadMeを読むと、Figaro.envでも値を参照できるようなので、試してみました。
# terminal $ rails c > Figaro.env.sendgrid_user_name => "api_key"
ENVオブジェクトを使わなくても環境変数の値を参照できました。
ただ、figaroではなく別の環境変数管理機能に移行するとなった場合に、修正箇所が増えてしまうので、個人的にはこの機能は使わないと思います。。。
応用的な使い方(その2)
config/figaro.rb で以下のように定義すると、application.ymlで定義されてないkeyがあった場合にアプリ起動時に例外を発生させることができます。
# config/initializers/figaro.rb Figaro.require_keys("sendgrid_user_name", "sendgrid_api_key", "sendgrid_domain", "sendgrid_config") # sendgrid_configというkeyは未定義 # terminal $ rails c /usr/local/bundle/gems/figaro-1.2.0/lib/figaro.rb:28:in `require_keys': Missing required configuration keys: ["sendgrid_config"] (Figaro::MissingKeys) from /app/config/initializers/figaro.rb:1:in `<main>'
Figaro::MissingKeysという例外がthrowされてコンソールの立ち上げに失敗しました。
応用的な使い方(その3)
これはfigaro独自の使い方ではなくymlの話になりますが、以下のように書くことで共通化したい値をまとめて設定することができます。
# config/application.yml default: &default sendgrid_domain: kossy-web-enginner development: <<: *default test: <<: *default # terminal $ rails c > ENV["sendgrid_domain"] => "kossy-web-enginner" > exit $ RAILS_ENV=test rails c > ENV["sendgrid_domain"] => "kossy-web-enginner"
まとめ
環境変数の管理をするGemはdotenvがありますが、dotenvを本番環境で使わない方がいいのではという意見もあります。
Dotenvはproductionで使わないほうがよいのではという話の続き - なんかかきたい
figaroの場合はunicornの再起動時に読み直されるとのことなので、余計なトラブルに見舞われずに済みそうです。