環境変数を管理できるGem「figaro」を使ってみる

こんにちは!kossyです!



今回は環境変数を管理できるGem「figaro」を個人開発アプリに導入してみたので、備忘録としてブログに残してみたいと思います。




偉大なる本家レポジトリ

github.com



環境
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の再起動時に読み直されるとのことなので、余計なトラブルに見舞われずに済みそうです。

参考にさせていただいたサイト

素晴らしいコンテンツの提供、誠にありがとうございます。

Dotenvはproductionで使わないほうがよいのではという話の続き - なんかかきたい