モダンWebアプリケーション開発で重要な「The Twelve-Factor App」の概要

The Twelve-Factor Appとは、Webアプリケーションの開発において、モダンなWebアプリケーションとはどうあるべきか、の12個の要素についてのベストプラクティスをまとめたものです。
今回は、そのThe Twelve-Factor Appについてまとめてみました。


 コードベース

  • 1つのリポジトリから複数のアプリケーションが作られるということは、密結合である可能性が高く、拡張性が低下してしまう 
  • 複数のリポジトリから1つのアプリケーションが作られるということは、ビルドやデプロイの手順が複雑化してしまう
したがって、ソースコードとアプリケーションは1対1の関係にするようにする。

依存関係

  • システムツール(例:curl)はアプリケーションのデプロイ先となる環境に常にインストールされているとは限らない
  • 新たな開発者のセットアップにコストがかかってしまう
したがって、常に使用するライブラリは依存設定ファイルで管理し、システムツール等はアプリケーションに含めるなどし、アプリケーションだけで完結するようにする。

設定

  • 設定をコードに含めると、環境ごとにビルドが必要になってしまう
  • 設定を設定ファイルで行うと、環境ごとい設定ファイルが必要になってしまい、スケールしにくくなってしまう
  • バージョン管理システムに設定ファイルがあると、情報漏洩につながってしまう
したがって、設定はコードや設定ファイルに含めるのではなく、環境変数で設定するようにする。

バックエンドサービス

  • 設定をコードに含めると、設定の変更が必要になった時にビルドが必要になってしまう
  • 設定をコードに含めると、サービスインスタンスが停止した際、別のインスタンスにすぐ接続できなくなってしまう
したがって、DBや外部サービスは、コードを修正しなくても変更できるように環境変数に接続先や接続情報を定義するようにする。

ビルド・リリース・実行

  • 環境ごとにビルドを行ったり、実行中のソースコードを修正するとオペミスによって障害を引き起こす可能性がある
  • テスト済みのソースコードをビルドし、そのままリリース・実行すれば、障害を引き起こす可能性が極めて少なくなる
したがって、コード修正時は、ビルド・リリース・実行の順で行うようにする。

プロセス

  • インスタンスは仮想サーバのスケールイン・スケールアウトで増減するため、永続的に存在するものではない
したがって、プロセスはステートレスなものにし、サーバ内のインスタンスやセッション、或いはファイルでステータスを持たないようにする。
もし、永続的にステータスを管理する必要がある場合は、DB等に持つようにする。

ポートバインディング

  • 環境ごとによるサーバの設定を必要としないようにする
  • 自アプリケーションを、別のサービスのバックエンドとして容易に提供できるようにする
これらを満たすために、アプリケーション内にサーバを組み込み、サーバ単位ではなくポート単位でサービスを公開できるようにする。
つまり、サーバ無しでもアプリケーションだけで実行できるようにしておく。

並行性

  • 垂直スケール(メモリやCPUの増強)の場合、マシンの再起動が必要となってしまう
  • マシン再起動によってダウンタイムが発生してしまう
したがって、垂直スケールではなく水平スケールで性能向上させるようにする。

廃棄容易性

  • プロセスの起動が遅いとスケールが容易でなくなってしまう
したがって、プロセスの起動と停止は高速に行えるような構成にする。
停止前には、リクエストの受付停止、処理中リクエストの待機、DB接続やI/Oクローズなど、各リソースの廃棄(グレースフル)を行うようにする。

開発/本番一致

  • 時間のギャップは、開発からデプロイを数時間で行えることが望ましい
  • 人材のギャップは、開発者が運用も行えることが望ましい
  • ツールのギャップは、ローカル、開発環境、本番環境でそれぞれツールが異ならないようにしなくてはいけない
したがって、各環境のギャップは最小限になるようにする。

ログ

  • スケールイン時に、仮想サーバそのものがなくなる可能性がある
したがって、ログはファイルではなく標準出力に出力させ、ツールで1箇所に集約するようにする。

管理プロセス

  • 手動で管理を実行するとオペミスを引き起こす可能性がある
したがって、管理プロセスはアプリケーションの初期化処理として実行させるようにする。

このブログの人気の投稿

無料で使えるWeb版ホワイトボード「Google Jamboard」の使い方おさらい

GitLabで、認証なしにPrivateリポジトリのコードをgit cloneさせる方法

モンテカルロ法によるゲーム戦略の進化