📘
[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