Twelve-Factor App とぅえるぶふぁくたーあっぷ
簡単に言うとこんな感じ!
クラウドで動くWebアプリを「うまく作るための12のルール」みたいなもの。環境依存をなくして、スケールしやすく、壊れにくいアプリを作るためのベストプラクティス集だよ!
Twelve-Factor Appとは
Twelve-Factor App(12ファクターアプリ)とは、SaaS(Software as a Service)アプリケーションをクラウドで適切に運用するための12の設計原則です。Herokuの共同創業者Adam Wiggins氏が2012年に体系化しました。特定の言語やフレームワークに依存せず、モダンなWebアプリケーション全般に適用できる普遍的な指針として世界中で参照されています。
この原則を守ることで、開発環境と本番環境の差異をなくし、デプロイを自動化しやすく、スケールアウトが容易で、クラウドプラットフォームに移植可能なアプリケーションが作れます。
12の原則
| # | 原則名 | 内容 |
|---|---|---|
| 1 | コードベース | 1コードベース・複数デプロイ(gitリポジトリ1つ) |
| 2 | 依存関係 | 依存を明示的に宣言し分離する(npm, pipで管理) |
| 3 | 設定 | 設定を環境変数に格納する(コードに埋め込まない) |
| 4 | バックエンドサービス | DBやキャッシュをアタッチされたリソースとして扱う |
| 5 | ビルド・リリース・実行 | 3ステージを厳密に分離する |
| 6 | プロセス | アプリをステートレスな1つ以上のプロセスとして実行 |
| 7 | ポートバインディング | ポートにバインドしてサービスを公開する |
| 8 | 並行性 | プロセスモデルでスケールアウトする |
| 9 | 廃棄容易性 | 高速起動・グレースフルシャットダウン |
| 10 | 開発/本番一致 | 開発・ステージング・本番を極力同じに保つ |
| 11 | ログ | ログをイベントストリームとして扱う(ファイルに書かない) |
| 12 | 管理プロセス | 管理タスクは一時的なプロセスとして実行する |
特に重要な原則の解説
III. 設定(Config)
パスワード・APIキー・DB接続文字列などをコードに直書きするのはNG。環境変数で渡すことで、同じコードを開発・本番で使い回せます。
# NG: コードに直書き
DB_URL = "postgres://user:pass@prod-server/db"
# OK: 環境変数から取得
DB_URL = os.environ["DATABASE_URL"]
VI. プロセス(Processes)
アプリはステートレス(メモリ内にセッション情報などを持たない)に設計します。スケールアウト(プロセスを増やす)したとき、どのプロセスがリクエストを受けても同じ動作ができます。
歴史と背景
HerokuはPaaS(Platform as a Service)の草分けとして、数千のアプリケーションを運用する中で共通する問題パターンを発見しました。それをAdam Wiggins氏が12の原則として整理したのが2012年のことです。当初はHerokuユーザー向けのガイドでしたが、DockerやKubernetesの台頭とともに「コンテナで動くアプリに最適な設計指針」として再評価され、現在ではクラウドネイティブ設計の基礎として広く引用されています。
関連用語
- セルベースアーキテクチャ — クラウドネイティブ設計の延長線
- マイクロサービス — 12ファクターの原則と親和性が高い
- コンテナ — 12ファクターを実現する主要技術