12-Factor アプリ:最新のプラクティスと Leapcell ガイド
The Twelve-Factor App は、堅牢でスケーラブル、かつ保守しやすい最新のウェブアプリケーションを構築するための方法論で、もともとは Heroku の開発者によって提唱されました。クラウドネイティブ時代におけるアプリ開発・運用の共通課題を解決するための体系的フレームワークを提供します。
12 の要素に従うことで、開発者は継続的デプロイ、高い移植性、スムーズなスケーリングに最適化されたアプリケーションを作成できます。
Leapcell は 12-Factor App の原則に基づいて設計されています。これらの原則に従うことで、Leapcell の機能を活用し、アプリケーションをより効率的に構築・デプロイできます。
このドキュメントは、古典的な 12 の要素を基に、Leapcell プラットフォーム上での現代的な解釈とベストプラクティスを補足するものです。
12-Factor の現代的解釈と Leapcell のプラクティス
TL;DR
| # | Factor | 概要 | Leapcell プラクティス |
|---|---|---|---|
| I | Codebase for One Service | 1 つのアプリにつき 1 リポジトリ、複数デプロイ | 1 リポジトリにつき 1 サービス; Git 履歴を明確化 |
| II | Declare Dependencies | 依存関係を明示的に宣言 | マニフェストファイル使用 + 必要に応じて build.sh でビルド統一 |
| III | Env as Config | 設定はコードから分離し環境変数で注入 | ローカルは .env 使用; プラットフォームが自動で環境変数注入 |
| IV | Backing Services | 外部サービスはプラガブルリソースとして扱う | /tmp 書き込み可サーバーレスサービス; PostgreSQL, Redis, オブジェクトストレージ提供 |
| V | Build, Release, Run | ビルド・リリース・実行を分離 | 本番ブランチでビルド・リリース自動トリガー; CI/CD ワークフロー |
| VI | Stateless Processes | プロセスはステートレスであるべき | ステートレス設計により水平スケーリングが可能 |
| VII | Port Binding | ポートにバインドしてサービスを提供 | 設定されたポートに外部トラフィックをルーティング |
| VIII | Concurrency | プロセスを追加してスケール | トラフィックに応じてサーバーレスインスタンス自動スケーリング |
| IX | Disposability | 高速起動・優雅なシャットダウン | 応答なしプロセスは SIGKILL 送信; アプリでクリーンアップ可能 |
| X | Dev/prod Parity | 開発・ステージング・本番をできる限り一致 | 同一コードベース; ブランチ + env.local で環境別設定 |
| XI | Logs | ログはイベントストリームとして扱う | 集中ログ管理; stdout にイベントストリーム出力 |
| XII | Admin Processes | 管理タスクはワンオフで実行 | ビルド中または手動実行; 事前開始コマンドは提供なし |
I. Codebase for One Service
1 つのコードベースでリビジョン管理し、複数のデプロイを行う。
アプリケーションのコードは単一リポジトリで管理する必要があります。複数の環境があっても同一コードベースから派生する必要があります。
Leapcell のデプロイモデルはこの原則に基づきます。「リポジトリごとに 1 サービス」を推奨しており、Git 履歴の明確化とプロジェクト管理の簡素化が可能です。
II. Declare Dependencies in a Manifest File
マニフェストで依存関係を明示する。
依存関係はマニフェスト (package.json, requirements.txt) に明示的に宣言し、適切な分離ツールで管理します。
依存関係管理はサービス移植性のために重要です。複雑なビルドの場合は
build.shを作成して手順を統一することを推奨します。
III. Env as Config
設定は環境に格納する。
設定 (DB URL, API キーなど) はコードから 分離し、環境変数で注入します。
ローカル開発では
.envを使用。Leapcell では設定済み環境変数が自動でランタイムに注入され、ローカルと本番の移行がスムーズです。
IV. Backing Services
バックエンドサービスはプラグ可能なリソースとして扱う。
ネットワーク経由で使用するサービスは URL や認証情報で接続します。
Leapcell のサーバーレスは
/tmp除き読み取り専用 FS。状態の外部化により高速動的スケジューリングが可能。PostgreSQL、Redis、オブジェクトストレージも提供。
V. Build, Release, Run
ビルド・リリース・実行を分離する。
リリースは不変で、容易にロールバック可能。CI/CD で自動化。
本番ブランチにコミットでビルド・リリース自動トリガー。最新コードを本番にデプロイ。
VI. Stateless Processes
アプリはステートレスプロセスで実行する。
永続化が必要なデータはバックエンドサービスに保存。
ステートレス設計により水平スケーリングが容易。Leapcell サーバーレスはこれをサポート。
VII. Port Binding
ポートバインドでサービス提供。
プラットフォームは設定ポートに外部トラフィックをルーティング。
VIII. Concurrency
水平スケーリングで負荷に対応。
トラフィックに応じてサーバーレスインスタンス自動スケーリング。
IX. Disposability
高速起動と優雅な終了で堅牢性向上。
応答なしプロセスは SIGKILL。アプリは必要なクリーンアップを処理可能。
X. Dev/prod Parity
開発・ステージング・本番をできる限り一致させる。
同一コードベース、ブランチ +
env.localで環境別設定。
XI. Logs
ログはイベントストリームとして扱う。
すべてのログは集中管理され、stdout に出力され分析可能。
XII. Admin Processes
管理タスクはワンオフで実行する。
Leapcell は事前開始コマンドなし。ビルド中または手動で実行可能。