アーキテクチャパターン

Twelve-Factor App とぅえるぶふぁくたーあっぷ

Twelve-Factor AppクラウドネイティブSaaS12の原則Heroku
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ユーザー向けのガイドでしたが、DockerKubernetesの台頭とともに「コンテナで動くアプリに最適な設計指針」として再評価され、現在ではクラウドネイティブ設計の基礎として広く引用されています。


関連用語