読者です 読者をやめる 読者になる 読者になる

THE TWELVE-FACTOR APP

Heroku

THE TWELVE-FACTOR APP

Herokuが提唱する、「どんなプログラミング言語、どんなバックエンドを使用していても適用することが可能である、モダンなウェブアプリ構築のための方法論」

12factor.net

12-Factor Apps in Plain English - ClearlyTech

1. コードベース

すべてのソースコードGitHub等ソースコントロールシステムのひとつのリポジトリで管理する。コードベースは複数のデプロイ環境に耐えるようにする。

2. 依存関係

すべての依存関係を明示的に宣言し分離する。暗黙的な依存関係を使用してはならない。

コードがデプロイされるときには、すべてのライブラリが正しいバージョンがダウンロードされ、正しい場所に置かれるようにしなければならない。

CHEFPuppetといったツールにより、開発チームがマシン全体の設定を共有することが可能である。

3. 設定

設定はデプロイ環境ごとに、環境変数に格納し、コードから隔離する。ここでいう設定とは、認証情報などオープンにしてはならない情報のことである。

4. バックエンドサービス

コードを一切変更することなく、ローカルサービスとサードパーティサービスの切り替えを行うことができるようにする。バックエンドサービスは自由にデプロイにアタッチしたり、デプロイできるリソースとして扱われるべきある。

5. ビルド、リリース、実行

ビルド、リリース、実行の3つのステージを厳密に区別する。ビルドステージのエラーは開発者の目の前で起こることだが、実行ステージはそうはいかない。重大なエラー発生時には、サーバーの再起動等により自動的に再開されるようにして、なるべく可変部分を持たないシンプルな環境にしておくこと。

6. プロセス

プロセスはステートレスでなければならず、永続化する必要のあるデータは、ステートフルなデータストアといったバックエンドサービスに格納すべきである。メモリやディスクにキャッシュされたものが、将来的にリクエストやジョブにおいて利用できることを決して仮定してはならない。

7. ポートバインド

アプリは完全に自己完結し、Webサーバーのコンテナが実行環境に働きかけることを頼りにしてはならない。ポートにバインドすることでHTTPをサービスとして公開し、外界からのURLアクセスができるようにする。バックエンドアプリケーションをポートバインドし、そのURLをアプリのリソースとして格納すれば、あるアプリが他のアプリにとってのバックエンドサービスとなることができる。

8. 並行性

個々のワークロードの種類をプロセスタイプに割り当てることで、それぞれが独立して多様な処理が可能になる(並行性)。これにより、アプリの垂直のスケールが容易になる。

9. 廃棄性

アプリのプロセスは即座に起動・終了できなければならない。起動のプロセスをなるべくシンプルなものにしておくことで、リリース作業やスケールアップのアジリティが高くなり、本番デプロイにも簡単に対応できるようになる。また、プロセスは突然のクラッシュに対しても、強靭でなければならない。クラッシュ時に確実に復旧するようにして、その都度のクリーンナップ作業もなくすべきだ。

10. 開発/本番の一致

継続的デプロイしやすいように開発環境と本番環境のギャップを最小にする。それは次の3つに収縮される。

従来 Twelve-Factor App
デプロイの間隔 数週間 数時間
コードを書く人とデプロイする人 異なる 同じ
開発環境と本番環境 異なる 出来る限り同じ

本番環境ではより本格的で強靭なバックエンドサービスを使用するにもかかわらず、開発者はローカルな開発環境においてより軽量なものを使いたくなることがある。しかし、本番環境に限りなく近いローカル環境を作ることができる今では、開発/本番の一致と継続的なデプロイの利益に比べると、わざわざ開発と本番の間で異なるバックエンドサービスを使用する利益は少なく、互換性エラーを起こす可能性を内包するため、結果としてコストも高くつく。

11. ログ

アプリはログファイルに書き込んだり管理しようとするべきではない。代わりに、それぞれの実行中のプロセスはイベントストリームは標準出力にバッファリングせずに書き出す。開発者はこのストリームを見ることで、アプリの挙動を観察する。

最低限、New RelicAirBrakeを使用して、エラーログを記録すべきだ。また、PaperTrailSplunk Stormを使って、ログを送ることもできる。

12. 管理プロセス

悪いデータのクリーンナップ、集計するための分析の実行やA/Bテストの機能の切り替えなど、一過性のタスクを行うことがある。この時、ローカルのターミナルウィンドウやデータベースを直接更新することはせずに、本番環境で実行すること。

まとめ

幾つかは難解に思えるかもしれない。しかし、この12のFACTORが、モダンなアプリを堅牢かつ信頼たるものにしてくれる。