Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

HerokuのRails 7.1を7.2に更新するときに用心すべき非推奨警告(翻訳)

概要

元サイトの許諾を得て翻訳・公開いたします。

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?)

何がまずかったのでしょうか?(where's the poop?)

原因は、Herokuが開発者より賢く振る舞おうとしていたことでした。
残念なことに、HerokuでSECRET_KEY_BASE環境変数を削除すると、ランダムな新しい値で再生成されてしまっていたのです#1143)。

ランダム生成された新しい値のせいで、この値に依存していた外部端末などが軒並み動かなくなってしまいました。

🔗 まとめ

要点を以下にまとめます。

気をつけるべき状況:

  • "Rails.application.secrets is deprecated in favor of Rails.application.credentials and will be removed in Rails 7.2"という非推奨警告に沿って作業している
  • そのRailsをHerokuで動かしている
  • Heroku Buildpacksを使っている

上に該当する人は、credentialsとHerokuコンフィグ変数にあるSECRET_KEY_BASEを消さずに残しておくこと。少なくともHeroku側には残しておくこと。

さもないと...エラーも出さずに厄介なエラーを踏んでしまい、頭を抱えることになるでしょう。

関連記事

現代のRailsで不要になったgem 5+1選(翻訳)

Rails: new_framework_defaultsの設定が反映されるタイミングを無邪気に信じてはいけない(翻訳)


  1. 訳注: ユーザー側のcookieが一斉に無効になると、それに依存していたセッションが切れたりログインが解除されたりするなどの問題が多数発生することになります。 

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。