Twelve-Factor App#
Webアプリ開発のベスト・プラクティスとされる方法論
The Twelve Factors
コードベース(codebase)
バージョン管理されている1つのコードベースと複数のデプロイ
codebaseはroot commitを共有する単一か複数のリポジトリのこと → コードベースは1つ、デプロイ(prd, stg, dev, …)は複数
依存関係(dependencies)
依存関係を明示的に宣言し分離する
依存関係の宣言マニフェスト:RubyのGemfileやPythonのPipなど
依存関係の分離:Rubyの
bundle exec
や Pythonのvenv
設定(config)
ここでの「設定」はデプロイ(開発、本番など)間で異なりうるもののことを指す。例えばDB・S3などの認証情報、ホスト名など。
Twelve-Factor Appでは設定は環境変数に格納する。
バックエンドサービス(backing service)
バックエンドサービス(データストア、メッセージキューイングなど)をローカルで自らが管理するサービスと区別せず、アタッチされたリソースとして扱う
ビルド、リリース、実行(build, release, run)
ビルド、リリース、実行の3つのステージを厳密に分離する
プロセス(processes)
アプリケーションを1つもしくは複数のステートレスなプロセスとして実行する
永続化が必要なデータは、ステートフルなバックエンドサービス(典型的にはDB)に格納する
ポートバインディング(port binding)
ポートバインディングを通してサービスを公開する
並行性(concurrency)
プロセスモデルによってスケールアウトする
廃棄容易性(disposability)
高速な起動とグレースフルシャットダウンで堅牢性を最大化する
グレースフルシャットダウン:サービスポートのリッスンを中止し(従って新しいリクエストを拒み)、処理中のリクエストが終了するまで待ち、シャットダウンする。ダウンタイムが最小限になる
開発/本番一致(dev/prod parity)
開発、ステージング、本番環境をできるだけ一致させた状態を保つ
ログ(logs)
ログをイベントストリームとして扱う
管理プロセス(admin processes)
管理タスクを1回限りのプロセスとして実行する
管理タスク:Railsの
rails db:migrate
などのメンテナンス用のコマンドなどこれはアプリを提供するときのプロセスと同じコードベース上で1回限り実行されるべきである
参考#
-
まだ読めてないがBeyond twelve-factor appというセクションもある