📘

[Rails] 環境ごとに値を切り分けたい時のアプローチを比較する

に公開

比較表

環境変数 Rails Credentials configでの定数管理
機密情報を記載できる ⭕️ ⭕️ ✖️
デプロイせずに変更できる ⭕️ ✖️ ✖️
仕組み/設定方法のシンプルさ ⭕️ ✖️ ⭕️
修正時に必要な(デプロイ以外の)作業の少なさ ✖️ ✖️ ⭕️
変更履歴を管理できる ✖️ △(暗号化された状態で管理) ⭕️
他の開発者への共有が楽 ✖️ ⭕️ ⭕️
設定の階層化・ネスト ✖️ ⭕️ ⭕️
デフォルト値の設定 ✖️ ✖️ ⭕️
テスト中のモック(一時的な上書き) ⭕️ ✖️ ⭕️
その他 CI/CDツールにmaster.keyを渡す必要がある
configでの定数管理とは?

以下のような処理を書いて、同じ記述で環境ごとに別の定数を利用できるようにする仕組みのことを「configでの定数管理」と表現しました。実装方法はこれ以外にも色々あると思います。

config/initializers/safe_constants_loader.rb
require 'yaml'

class SafeConstants
  def self.load_constants
    constants_file = Rails.root.join('config', 'safe_constants.yml')

    if File.exist?(constants_file)
      constants = YAML.load_file(constants_file)
      env = Rails.env
      (constants[env] || {}).transform_keys(&:to_sym)
    else
      Rails.logger.warn "Safe constants file not found: #{constants_file}"
      {}
    end
  end

  def self.get(key)
    Rails.configuration.safe_constants[key]
  end
end

# Railsアプリケーションに定数を読み込み
Rails.configuration.safe_constants = SafeConstants.load_constants
config/safe_constants.yml
# 使用例: SafeConstants.get(:s3_bucket_name)
default: &default
  s3_bucket_name: "default-bucket"

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default
  s3_bucket_name: "production-bucket"

感想

個人的に、Rails Credentialsは複雑&制約が多いわりにメリットが少ない印象を受けました。

  • 「機密情報」「デプロイなしで切り替えたいデータ」は環境変数
  • それ以外はconfigでの定数管理

が無難かなあ。

Discussion