Twelve-Factor App

クラウドネイティブなアプリケーションを構築するための 12 の設計原則

設計原則クラウド

Twelve-Factor App とは

Twelve-Factor App は、Heroku の共同創業者 Adam Wiggins が 2011 年に公開した、クラウド上で動作する SaaS アプリケーションを構築するための 12 の設計原則である。特定の言語やフレームワークに依存せず、あらゆるクラウドプラットフォームに適用できる普遍的な原則として広く参照されている。

12 の原則

  1. コードベース: バージョン管理される 1 つのコードベースから、複数の環境にデプロイする
  2. 依存関係: 依存関係を明示的に宣言し、分離する (package.json, requirements.txt)
  3. 設定: 設定を環境変数に格納する。コードに設定をハードコードしない
  4. バッキングサービス: データベースやキューなどの外部サービスを、アタッチされたリソースとして扱う
  5. ビルド、リリース、実行: ビルド、リリース、実行の 3 ステージを厳密に分離する
  6. プロセス: アプリケーションをステートレスなプロセスとして実行する
  7. ポートバインディング: ポートバインディングによってサービスを公開する
  8. 並行性: プロセスモデルによってスケールアウトする
  9. 廃棄容易性: 高速な起動とグレースフルシャットダウンで堅牢性を最大化する
  10. 開発/本番一致: 開発、ステージング、本番をできるだけ一致させる
  11. ログ: ログをイベントストリームとして扱う
  12. 管理プロセス: 管理タスクを 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) で原則が定義されている。クラウドネイティブアプリケーションの設計書籍で、実践的な適用方法が解説されている。

体系的に学ぶなら関連書籍を参照してほしい。

関連用語