Twelve-Factor App

Contents

Twelve-Factor App#

Webアプリ開発のベスト・プラクティスとされる方法論

The Twelve Factors

  1. コードベース(codebase)

    • バージョン管理されている1つのコードベースと複数のデプロイ

    • codebaseはroot commitを共有する単一か複数のリポジトリのこと → コードベースは1つ、デプロイ(prd, stg, dev, …)は複数

  2. 依存関係(dependencies)

    • 依存関係を明示的に宣言し分離する

    • 依存関係の宣言マニフェスト:RubyのGemfileやPythonのPipなど

    • 依存関係の分離:Rubyの bundle exec や Pythonのvenv

  3. 設定(config)

    • ここでの「設定」はデプロイ(開発、本番など)間で異なりうるもののことを指す。例えばDB・S3などの認証情報、ホスト名など。

    • Twelve-Factor Appでは設定は環境変数に格納する。

  4. バックエンドサービス(backing service)

    • バックエンドサービス(データストア、メッセージキューイングなど)をローカルで自らが管理するサービスと区別せず、アタッチされたリソースとして扱う

  5. ビルド、リリース、実行(build, release, run)

    • ビルド、リリース、実行の3つのステージを厳密に分離する

  6. プロセス(processes)

    • アプリケーションを1つもしくは複数のステートレスなプロセスとして実行する

    • 永続化が必要なデータは、ステートフルなバックエンドサービス(典型的にはDB)に格納する

  7. ポートバインディング(port binding)

    • ポートバインディングを通してサービスを公開する

  8. 並行性(concurrency)

    • プロセスモデルによってスケールアウトする

  9. 廃棄容易性(disposability)

    • 高速な起動とグレースフルシャットダウンで堅牢性を最大化する

    • グレースフルシャットダウン:サービスポートのリッスンを中止し(従って新しいリクエストを拒み)、処理中のリクエストが終了するまで待ち、シャットダウンする。ダウンタイムが最小限になる

  10. 開発/本番一致(dev/prod parity)

    • 開発、ステージング、本番環境をできるだけ一致させた状態を保つ

  11. ログ(logs)

    • ログをイベントストリームとして扱う

  12. 管理プロセス(admin processes)

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

    • 管理タスク:Railsのrails db:migrateなどのメンテナンス用のコマンドなど

    • これはアプリを提供するときのプロセスと同じコードベース上で1回限り実行されるべきである

参考#