Twelve-Factor App
クラウドネイティブなアプリケーションを構築するための 12 の設計原則
設計原則クラウド
Twelve-Factor App とは
Twelve-Factor App は、Heroku の共同創業者 Adam Wiggins が 2011 年に公開した、クラウド上で動作する SaaS アプリケーションを構築するための 12 の設計原則である。特定の言語やフレームワークに依存せず、あらゆるクラウドプラットフォームに適用できる普遍的な原則として広く参照されている。
12 の原則
- コードベース: バージョン管理される 1 つのコードベースから、複数の環境にデプロイする
- 依存関係: 依存関係を明示的に宣言し、分離する (package.json, requirements.txt)
- 設定: 設定を環境変数に格納する。コードに設定をハードコードしない
- バッキングサービス: データベースやキューなどの外部サービスを、アタッチされたリソースとして扱う
- ビルド、リリース、実行: ビルド、リリース、実行の 3 ステージを厳密に分離する
- プロセス: アプリケーションをステートレスなプロセスとして実行する
- ポートバインディング: ポートバインディングによってサービスを公開する
- 並行性: プロセスモデルによってスケールアウトする
- 廃棄容易性: 高速な起動とグレースフルシャットダウンで堅牢性を最大化する
- 開発/本番一致: 開発、ステージング、本番をできるだけ一致させる
- ログ: ログをイベントストリームとして扱う
- 管理プロセス: 管理タスクを 1 回限りのプロセスとして実行する
現代のクラウドネイティブとの関係
Twelve-Factor App は 2011 年の原則だが、その思想は現代のクラウドネイティブアーキテクチャの基盤となっている。
- 原則 3 (設定) → Kubernetes の ConfigMap / Secret、Lambda の環境変数
- 原則 4 (バッキングサービス) → マネージドサービス (RDS, DynamoDB, SQS) の活用
- 原則 6 (ステートレスプロセス) → Lambda のステートレス実行モデル
- 原則 8 (並行性) → コンテナのオートスケーリング、Lambda の同時実行
- 原則 9 (廃棄容易性) → コンテナの高速起動、Lambda のコールドスタート最適化
実務での適用
すべての原則を厳密に適用する必要はなく、プロジェクトの状況に応じて優先度をつける。特に重要なのは以下の 4 つだ。
- 原則 3 (設定の外部化): 環境ごとの設定をコードから分離する。最も基本的で効果が高い
- 原則 6 (ステートレス): スケーラビリティと障害耐性の基盤
- 原則 10 (開発/本番一致): 「開発環境では動くのに本番で動かない」問題の防止
- 原則 11 (ログのストリーム化): CloudWatch Logs や Datadog への集約を前提とした設計
Beyond the Twelve Factors
Kevin Hoffman が「Beyond the Twelve-Factor App」で、原則を 15 に拡張している。API ファースト、テレメトリ (監視)、認証・認可の 3 原則が追加されており、現代のマイクロサービス開発により適した内容になっている。
Twelve-Factor App の公式サイト (12factor.net) で原則が定義されている。クラウドネイティブアプリケーションの設計書籍で、実践的な適用方法が解説されている。
体系的に学ぶなら関連書籍を参照してほしい。