credentials.yml.enc
rails credentials:editすると以下のファイルが作られる
config/credentials.yml.enc:暗号化されたcredentialsファイル
config/master.key:復号するためのマスターキー
最近のRailsであればrails newしたときに自動的に作られる このconfig/credentials.yml.encは環境共通のcredentialsファイルになる
config/master.keyか環境変数RAILS_MASTER_KEYにマスターキーをセットすると復号できる
マスターキーがセットされていれば、復号はRails起動時に透過的に行われる
たとえばYAMLにfoo: barと書くと、Rails.application.credentials.fooで'bar'を得られる
Rails.application.credentials[:foo]でもよい
マスターキーが存在しない場合、復号されないだけでとくにエラーは出ない
このとき、Rails.application.credentials.fooはnilを返す
nilを返すので、それ以下の階層にアクセスしようとするとNoMethodErrorになる
環境によってcredentialsがあったりなかったりする前提ならHash#digを使うとよさそう
config.require_master_key = trueを設定することで、マスターキーがセットされていないときはRailsを起動しないようにできる
config/environments/development.rbに上の設定を記述して起動しようとするとこうなる
code:sh
❯ rails c
Missing encryption key to decrypt file with. Ask your team for your master key and write it to /path/to/sample_app/config/master.key or put it in the ENV'RAILS_MASTER_KEY'. 初期状態のconfig/environments/production.rbではコメントアウトされている。本番環境でcredentialsを利用するなら設定しておくと便利
rails credentials:editに-eオプションを渡して環境ごとに作ることもできる
rails credentials:edit -e developmentすると以下のファイルが作られる
config/credentials/development.yml.enc:development環境用のcredentialsファイル
config/credentials/development.key:development.yml.encを復号するためのマスターキー
各環境用のcredentialsとcredentials.yml.encが両方存在するとき、各環境用の方を優先して利用する
development.yml.encとcredentials.yml.encが両方復号されてマージされたりはしない
各環境用のcredentialsのマスターキーも、環境変数RAILS_MASTER_KEY経由で設定できる
各環境において利用されるcredentialsファイルはひとつだけ(上に書いたようにマージはされない)なので、環境変数はひとつだけでも問題ないってことかな
このYAMLはERBで前処理されないため、<%= %>を書いても無意味