Rails 6.0で環境ごとにcredentialsを準備するとconfig/credentials.yml.encは読み込まれない
Rails 6.0で導入されたmulti environment credentialsの挙動で少しハマったので、同じように困る方のために記録を残しておきます。
環境
Rails 6.0.3.4
最初に結論
デフォルトで存在するconfig/credentials.yml.enc
と、その環境用に準備したconfig/credentials/$environment.yml.enc
がある場合、config/credentials.yml.enc
は読み込まれず、config/credentials/$environment.yml.enc
だけが読み込まれます。
今回ハマった内容
Rails 6.0からは、環境ごとにcredentialsのファイルを分けられるようになりました。
Add support for multi environment credentials. · rails/rails
普段はbin/rails credentials:edit
で編集すると、記載した内容は暗号化されてconfig/credentials.yml.enc
に保存されます。
環境ごとにファイルを分ける場合は、例えばdevelopment
環境用のcredentialsファイルを用意するには次のようにします。
$ bin/rails credentials:edit --environment development
これでconfig/credentials/development.yml.enc
に設定が保存されます。
私は、config/credentials.yml.enc
とconfig/credentials/development.yml.enc
がある場合は、config/credentials/development.yml.enc
の設定が優先されるがconfig/credentials.yml.enc
での設定も使えるものだと思っておりました。
なので次のような設定をしていました。
# config/credentials.yml.enc common_setting_1: hogehoge
# config/credentials/development.yml.enc development_setting_1: fugafuga
しかしコンソールで確認してみると、
Rails.application.credentials.development_setting_1 => "fugafuga" Rails.application.credentials.common_setting_1 => nil
とconfig/credentials.yml.enc
の設定がうまく反映できておらず、何か設定が足りないのか、書き方が間違っているのか、、としばらく悩みました。
結局、config/credentials.yml.enc
とconfig/credentials/development.yml.enc
がある場合はconfig/credentials/development.yml.enc
だけが読み込まれるという仕様でした。
これについては、DHHさんは
There's no merging. If you're in the development environment, and config/credentials/development.yml.enc is found, then that'll be loaded. We won't even try to do anything with config/credentials.yml.enc. We won't try to merge some intersection of both files either. These are separate files and separate stores of credentials.
https://github.com/rails/rails/pull/33521#issuecomment-412382031
と2つのcredentialsファイルをマージはしない、とはっきりコメントされていました。
bin/rails credentials:help
でヘルプを見ると、
The
credentials
command supports passing an--environment
option to create an environment specific override. That override will take precedence over the globalconfig/credentials.yml.enc
file when running in that environment.
とあり、config/credentials/development.yml.enc
がconfig/credentials.yml.enc
より優先されることは分かったのですが、そもそもconfig/credentials.yml.enc
が読み込まれていない、というのは想定外でした。