Rails: production環境のRailsコンソールではsandboxモードを指定しよう(翻訳)
開発者として雇われていると、自分が取り組んでいるアプリケーションのproduction環境で特権アクセスを与えられることがよくあります。こうした特権は、バグ修正で必要なこともあれば、他の部署の代わりにコマンドを実行するときに必要な場合もあります。
しかし、大いなる力には、自分の足を撃ち抜いてしまう力ももれなく付いてきます。たとえ意図していなくても、いとも簡単にユーザーのデータを破壊的に変更できてしまいます。
ありがたいことに、Railsは素晴らしい保護機能を提供してくれます。しかし、この保護機能を使うには明示的に指定する必要があります。
🔗 以下のようにするのではなく
Railsコンソールを以下のようにフラグなしで実行する。
$ heroku run rails console
🔗 以下のようにしよう
Railsコンソールを実行するときに--sandbox
フラグを指定する1。
$ heroku run rails console --sandbox
これで、ログインするときにRailsコンソールのIRBプロンプトで以下のメッセージが表示されます。
Loading development environment in sandbox (Rails 7.0.6)
Any modifications you make will be rolled back on exit
🔗 そうする理由
現実の顧客データを恒久的に破壊しないためにも、どうか私を信じてください。production環境(およびstaging環境であっても)にログインするときは、--sandbox
モードを指定する習慣をぜひ身に付けてください。
--sandbox
モードを指定しておけば、コンソールを終了したときにデータの変更はすべて元に戻されます。これにより、誤って重大な問題を引き起こさずに済みます。データのクエリ(つまり読み取り専用アクセス)を行うだけであれば、このモードを指定することで、うっかり何かを永久に壊してしまう心配がなくなります。
注意: Sidekiqなどでジョブをエンキューするコードや、メールを送信するコードを呼び出す場合、--sandbox
メカニズムではロールバックされません。どうぞ気をつけて!
🔗 そうしない理由があるとすれば
ユーザーデータを意図的に変更するためにproductionアプリケーションにログインする場合は、--sandbox
モードを避ける必要があるでしょう。ただし、それでも実際に変更をかける前には、変更内容を--sandbox
モードで必ずテストしておくことをおすすめします。
さらに、--sandbox
の実装方法が元で、通常のproductionトラフィックでテーブルの行やテーブル全体がロックされるリスクがあることも忘れてはいけません。
これは、--sandbox
モードがセッションの開始時にすべてをトランザクションとして扱い、ログアウト時にロールバックするようになっているためです。つまり、--sandbox
モードを指定しても問題が生じる可能性があるのです(指摘してくれたWillに感謝いたします)。
実際にproductionでデータを変更するときは、Railsコンソールを適当にこねくりまわすよりも、データを変更するコードをきちんと書いてテストを重ね、それをデプロイする方がずっと良い方法です。production環境でrails console
を実行することを怖いと思えるようになりましょう。
関連記事
-
編集部注:
--sandbox
フラグは-s
、rails console
はrails c
と短縮できるので、たとえばrails c -s
と簡潔に入力できます。 ↩
概要
元サイトの許諾を得て翻訳・公開いたします。
日本語タイトルは内容に即したものにしました。
参考: §2.3
bin/rails console
-- コマンドラインツール - Railsガイドなお、Rails 7.1からはproduction環境のRailsコンソールをデフォルトでsandboxモードにするコンフィグが使えるようになります。
参考: Add an option to start rails console in sandbox mode by default by shouichi · Pull Request #48984 · rails/rails