HerokuのRails 7.1を7.2に更新するときに用心すべき非推奨警告(翻訳)
最近、ある顧客のRailsを7.0から7.1にアップグレードし、これについてはスムーズに完了しました。Rails 7.1にアップグレードしてみると、ありがたいことに新しい非推奨警告がいろいろ表示されたので、非推奨警告に圧倒される前に問題をつぶしておくことに決めました。しかし、ここで何とも厄介な問題を踏んでしまいました...
🔗 どんな厄介な問題だったか
いえ、アプリケーションがクラッシュしたわけでもなければ、凶悪なバイキングが斧を投げるように500エラーを連発してきたわけでもありません。
でもその方がまだましだったでしょう。「何もエラーを発せずに失敗する」という最悪の形だったのです。
元はと言えば、以下の非推奨警告が始まりでした。
[DEPRECATION] DEPRECATION WARNING: `Rails.application.secrets` is deprecated
in favor of `Rails.application.credentials` and will be removed in Rails 7.2.
警告に従って、secrets(秘密情報)と暗号化済みsecretsをcredentialsファイルに移行しました。
secret_key_base
もcredentialsファイルに移行しました。Rails 5.2でcredentialsが導入されて以来、この秘密情報のデフォルトの置き場所はここになっていたからです。
ENV["SECRET_KEY_BASE"]
の値を削除してcredentialsに移行し、Rails.application.credentials.secret_key_base
を呼び出して値が正しく設定されていることも確認しました。
このとき、Rails.application.secret_key_base
を呼び出すことでもsecret_key_baseを取得できることがわかりました。
以下のコードをご覧ください。
def secret_key_base
if Rails.env.development? || Rails.env.test?
secrets.secret_key_base ||= generate_development_secret
else
validate_secret_key_base(
ENV["SECRET_KEY_BASE"] || credentials.secret_key_base || secrets.secret_key_base
)
end
end
ここで期待する振る舞いは以下のとおりです。
ENV
を削除した- つまり、今後値はcredentialsから取得されるはず
そうなるはずですよね?しかし実際は...
何もエラーを発せずに失敗し、大事なcookieが全部無効になってしまったのです1。さてここで問題です、何がまずかったのでしょうか?
何がまずかったのでしょうか?(where's the poop?)
原因は、Herokuが開発者より賢く振る舞おうとしていたことでした。
残念なことに、HerokuでSECRET_KEY_BASE
環境変数を削除すると、ランダムな新しい値で再生成されてしまっていたのです(#1143)。
ランダム生成された新しい値のせいで、この値に依存していた外部端末などが軒並み動かなくなってしまいました。
🔗 まとめ
要点を以下にまとめます。
気をつけるべき状況:
- "
Rails.application.secrets
is deprecated in favor ofRails.application.credentials
and will be removed in Rails 7.2"という非推奨警告に沿って作業している - そのRailsをHerokuで動かしている
- Heroku Buildpacksを使っている
上に該当する人は、credentialsとHerokuコンフィグ変数にあるSECRET_KEY_BASE
を消さずに残しておくこと。少なくともHeroku側には残しておくこと。
さもないと...エラーも出さずに厄介なエラーを踏んでしまい、頭を抱えることになるでしょう。
関連記事
Rails: new_framework_defaultsの設定が反映されるタイミングを無邪気に信じてはいけない(翻訳)
- 訳注: ユーザー側のcookieが一斉に無効になると、それに依存していたセッションが切れたりログインが解除されたりするなどの問題が多数発生することになります。 ↩
概要
元サイトの許諾を得て翻訳・公開いたします。