はじめに
実践! ソフトウェア開発というテーマで色々記事を書いていきます。今回は、Beyond the Twelve-Factor AppとThe Twelve-Factor Appを学び、それを踏まえて、クラウド開発を行うために何を実践していくのが良いかという記事をシリーズで書いていきたいと思います。
The Twelve-Factor Appとは
wikiから引用すると、2011年、サービスプラットフォーム企業であるHerokuの開発者により提案されたソフトウェア開発の方法論です。内容に関してはWebで公開されており日本語訳が存在します。原文より、方法論のコンセプト部分をそのまま引用します。
現代では、ソフトウェアは一般にサービスとして提供され、Webアプリケーション や Software as a Service と呼ばれる。
Twelve-Factor Appは、次のようなSoftware as a Serviceを作り上げるための方法論である。・セットアップ自動化のために 宣言的な フォーマットを使い、プロジェクトに新しく加わった開発者が要する時間とコストを最小化する。
・下層のOSへの 依存関係を明確化 し、実行環境間での 移植性を最大化 する。/
・モダンな クラウドプラットフォーム 上への デプロイ に適しており、サーバー管理やシステム管理を不要なものにする。
・開発環境と本番環境の 差異を最小限 にし、アジリティを最大化する 継続的デプロイ を可能にする。
・ツール、アーキテクチャ、開発プラクティスを大幅に変更することなく スケールアップ できる。Twelve-Factorの方法論は、どのようなプログラミング言語で書かれたアプリケーションにでも適用できる。
また、どのようなバックエンドサービス(データベース、メッセージキュー、メモリキャッシュなど)の組み合わせを使っていても適用できる。
そして、以下が12のファクターになります。
The Twelve Factors
I. コードベース - バージョン管理されている1つのコードベースと複数のデプロイ
II. 依存関係 - 依存関係を明示的に宣言し分離する
III. 設定 - 設定を環境変数に格納する
IV. バックエンドサービス - バックエンドサービスをアタッチされたリソースとして扱う
V. ビルド、リリース、実行 - ビルド、リリース、実行の3つのステージを厳密に分離する
VI. プロセス - アプリケーションを1つもしくは複数のステートレスなプロセスとして実行する
VII. ポートバインディング - ポートバインディングを通してサービスを公開する
VIII. 並行性 - プロセスモデルによってスケールアウトする
IX. 廃棄容易性 - 高速な起動とグレースフルシャットダウンで堅牢性を最大化する
X. 開発/本番一致 - 開発、ステージング、本番環境をできるだけ一致させた状態を保つ
XI. ログ - ログをイベントストリームとして扱う
XII. 管理プロセス - 管理タスクを1回限りのプロセスとして実行する
抽象的なのでわかりにくいと思いますが、非常に重要なことが書かれています。文章量も大したことないですし、日本語訳されているのでまずは目を通してみてください。また、解説記事も色々ありますのでそちらを見ていただくとよいかと思います。
Beyond the Twelve-Factor Appとは
Pivotal社のKevin Hoffman氏がThe Twelve Factors Appをベースにクラウド開発の最近のトレンドを取り込んで3つの定義を追加してアップデートしたソフトウェア開発論です。ここから原文がダウンロードして入手できます。こちらは残念ながら日本語訳がありませんし、ほどほどのボリュームがあります。
そして、以下が12+3のファクターになります。2,14,15の3ファクターが新規に増えたものになり、残りはオリジナルの12ファクターと同等のものになります。
- One codebase, one application
- API first
- Dependency management
- Design, build, release, and run
- Configuration, credentials, and code
- Logs
- Disposability
- Backing services
- Environment parity
- Administrative processes
- Port binding
- Stateless processes
- Concurrency
- Telemetry
- Authentication and authorization
目次
Beyondの15ファクターを15回に分けて連載風に進めていきたいと思います。タイトルの前者がBeyond、後者がオリジナルの定義になります。それぞれのファクターに関しての解説と実践するにはどういったことをするべきなのかをまとめていきます。
(1)1つのコードベース、1つのアプリケーション / コードベース - バージョン管理されている1つのコードベースと複数のデプロイ
(2)APIファースト
(3)依存関係管理 / 依存関係 - 依存関係を明示的に宣言し分離する
(4)設計、ビルド、リリース、実行 / ビルド、リリース、実行 - ビルド、リリース、実行の3つのステージを厳密に分離する
(5)構成、クレデンシャル、およびコード / 設定 - 設定を環境変数に格納する
(6)ログ / ログ - ログをイベントストリームとして扱う
(7)廃棄容易性 / 廃棄容易性 - 高速な起動とグレースフルシャットダウンで堅牢性を最大化する
(8)バックエンドサービス / バックエンドサービス - バックエンドサービスをアタッチされたリソースとして扱う
(9)環境パーティー / 開発/本番一致 - 開発、ステージング、本番環境をできるだけ一致させた状態を保つ
(10)管理プロセス/ 管理プロセス - 管理タスクを1回限りのプロセスとして実行する
(11)ポートバインディング / ポートバインディング - ポートバインディングを通してサービスを公開する
(12)ステートレスプロセス / プロセス - アプリケーションを1つもしくは複数のステートレスなプロセスとして実行する
(13)並行性/ 並行性 - プロセスモデルによってスケールアウトする
(14)テレメトリー
(15)認証と認可