XII. 管理プロセス

管理タスクを1回限りのプロセスとして実行する

プロセスフォーメーションは、アプリケーションが実行されたときにアプリケーションの通常の役割(Webリクエストの処理など)に使われるプロセス群である。それとは別に、開発者はしばしばアプリケーションのために1回限りの管理・メンテナンス用のタスクを実行したくなる。例えば:

  • データベースのマイグレーションを実行する。(例:Djangoにおける manage.py migrate やRailsにおける rake db:migrate
  • 任意のコードを実行したり、生のデータベースに対してアプリケーションのモデルを調査したりするために、コンソール(REPLシェルとも言われる)を実行する。多くの言語ではインタプリタを引数なしで実行する(例:pythonperl)ことでREPLを利用できるが、別のコマンドを用意している場合もある(例:Rubyでの irb や Railsでの rails console)。
  • アプリケーションのリポジトリにコミットされた1回限りのスクリプトを実行する(例:php scripts/fix_bad_records.php)。

1回限りの管理プロセスは、アプリケーションの通常の長時間実行されるプロセスと全く同じ環境で実行されるべきである。これらのプロセスは、あるリリースに対して実行され、そのリリースに対して実行されるすべてのプロセスと同じコードベース設定を使う。管理用のコードは、同期の問題を避けるためにアプリケーションコードと一緒にデプロイされるべきである。

同じ依存関係分離技術をすべてのプロセスタイプに利用するべきである。例えば、もしRubyのWebプロセスがコマンド bundle exec thin start を使うのであれば、データベースのマイグレーションには bundle exec rake db:migrate を使うべきである。同様に、Virtualenvを使っているPythonプログラムは、仮想環境内の bin/python をTornado Webサーバーとすべての manage.py 管理プロセスの両方で利用するべきである。

Twelve-Factorは細かい設定なしですぐに使えるREPLシェルを提供する言語を強く好む。1回限りのスクリプトを実行するのが簡単になるからである。ローカルデプロイでは、開発者は1回限りの管理プロセスを、アプリケーションをチェックアウトしたディレクトリの中でシェルコマンドで直接起動する。本番デプロイでは、開発者はSSHやデプロイの実行環境が提供する他のリモートコマンド実行方法を使ってそのようなプロセスを実行する。