Rails6のMulti Environment CredentialsでMissing `secret_key_base`
とある案件でRailsを使っていて、ステージング環境を作った時のことです。
起動と当時に以下のようなエラーを吐いて停止してしまいました。
=> Booting Puma => Rails 7.0.4.2 application starting in staging => Run `bin/rails server --help` for more startup options Exiting /usr/local/bundle/gems/railties-7.0.4.2/lib/rails/application.rb:581:in `validate_secret_key_base': Missing `secret_key_base` for 'staging' environment, set this string with `bin/rails credentials:edit` (ArgumentError) from /usr/local/bundle/gems/railties-7.0.4.2/lib/rails/application.rb:419:in `secret_key_base'
この環境では、認証情報系を格納するcredentials.yml.encをRails6のMulti Environment Credentialsと呼ばれる方法で環境ごとに分けています。
さらにその上で各環境のmaster.keyに相当するキーファイルは格納せず、環境変数のRAILS_MASTER_KEYに環境ごとのキーを設定することで動作させています。
このエラーにあるsecret_key_baseは、credentials.yml.encの中には存在しますが、各環境ごとのCredentialsには記述していません。
その状態で開発環境(development)では動作していたので、親子関係で上位となるcredentials.yml.encから取得してきてくれているんだろうぐらいに思っていました。
よくよく考えるとmaster.keyを置くこともなく、環境変数にはdevelopment.keyの値しか渡していないのでcredentials.yml.encから値を取れるわけがないのです。
早速確認してみると、開発環境においてもやはりsecret_key_baseはnilが返ってきました
他の値、例えばDBのユーザー名はスクリーンショットの通り問題なく取得できています。
(開発環境とはいえroot使ってるのかよ!というのはさておき)
ということは、開発環境ではそもそもsecret_key_base自体が使われない??
あまり詳しくないのですが、このあたりの設定とかどこかにあったりするのでしょうか
では、エラーを解消するため、staging.yml.encにsecret_key_baseを設定してやることにします。
設定するキーは、
bundle exec rake secret
で取得します。
EDITOR=vim rails credentials:edit -e staging
でファイルを開き、他の項目と同様にsecret_key_baseを設定してあげて完了です。