このチュートリアルは、モノリス(またはモノリシック アプリ)をモジュールに分割し、モジュールをコンテナ化して、コンテナ イメージを Google Kubernetes Engine(GKE)クラスタにデプロイする方法を示す一連のチュートリアルの最初のパートです。こうした用語について理解していなくても心配ありません。これらの意味については、このシリーズを進めていくうちに理解できます。
この学習プログラムは、次のチュートリアルで構成されています。
- 概要
- モノリスについて(このチュートリアル)
- モノリスをモジュール化する
- モジュラー型のアプリをコンテナ化できるように準備する
- モジュラー型のアプリをコンテナ化する
- アプリを GKE クラスタにデプロイする
このチュートリアルでは、次のステップでモノリスについて学習します。
- ローカルマシンでアプリを設定する。
- ブラウザで機能を試す。
- コードを確認する
モノリスとは
Cymbal Books のサンプル モノリスを起動して実行する前に、モノリスとは何かを理解しておく必要があります。
モノリスとは、すべてのコンポーネントが相互接続され、個別にスケーリングできないアプリです。たとえば、アプリのログインページにアクセスするユーザーが急増したときに、ログイン コンポーネントのみを個別にスケーリングすることはできません。代わりに、商品カタログや注文処理システムなど、関連性のないコンポーネントを含むアプリケーション全体をスケーリングする必要があります。
一方、アプリケーションが独立したモジュールに分割されていれば、リソースのニーズに応じて各モジュールを個別にスケーリングできます。モジュラー アプリを GKE クラスタでホストする場合、GKE でスケーリングを自動化することも可能です。
「モノリシック」という用語は、コードの構成が悪いことを意味するものではありません。モノリスは構造化されており、そのコンポーネントはコードの個別の領域に実装できます。これらのコンポーネントを個別に実行またはスケーリングできないことがモノリスの特徴です。
費用
このチュートリアルでは費用は発生しません。ただし、このシリーズの最後のチュートリアルの手順に沿って操作すると、Google Cloud アカウントに料金が発生します。費用が発生するのは、GKE を有効にして Cymbal Books アプリを GKE クラスタにデプロイしたときです。これらの費用には、料金ページで説明されている GKE のクラスタごとの料金と、Compute Engine VM の実行料金が含まれます。
不要な料金が発生しないように、このチュートリアルの完了後に GKE を無効にするか、プロジェクトを削除してください。
始める前に
このチュートリアルでは、ローカルマシンに Python バージョン 3.13 が必要です。マシンにインストールされている Python のバージョンを確認するには、次のコマンドを実行します。
python3 --version
Python のバージョンが 3.13 より前の場合は、公式の Python ウェブサイトから最新バージョンをダウンロードしてインストールします。
環境を設定する
このチュートリアル シリーズでは、アプリケーションのさまざまなバージョンをさまざまな場所で実行します。
- ローカルマシンのモノリシック バージョン
- ローカルマシンのモジュラー バージョン
- Cloud Shell でコンテナ化されたバージョン、次に GKE クラスタでコンテナ化されたバージョン
このセクションでは、モノリスを実行できる仮想環境をローカルマシンに設定します。
コードをダウンロードする
ローカルマシンでターミナルを開きます。
チュートリアルの GitHub リポジトリのクローンをローカルマシンに作成します。
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
フォルダ
kubernetes-engine-samples/quickstarts/monolith-to-microservices
には、monolith/
、modular/
、containerized/
の 3 つのフォルダが含まれています。このチュートリアルでは、monolith/
フォルダ内のファイルを中心に説明します。
仮想環境を作成して有効にする
仮想環境は、アプリを実行するための隔離されたスペースを提供します。これにより、アプリ用にインストールする必要がある Python ライブラリが、システム上の他の Python プロジェクトに干渉するのを防ぎます。
仮想環境を作成して有効にする手順は次のとおりです。
前のセクションで開いたターミナルで、マシンにクローンを作成したリポジトリの次のフォルダに移動します。
cd kubernetes-engine-samples/quickstarts/monolith-to-microservices
book-review-env
という仮想環境を作成します。python3 -m venv book-review-env
仮想環境の作成をおすすめします。仮想環境はアプリを分離して実行できる領域です。これにより、アプリの依存関係と構成が、システムの他のソフトウェアやライブラリと競合しないようになります。
オペレーティング システムのコマンドを使用して、仮想環境を有効にします。
macOS と Linux
source book-review-env/bin/activate
Windows
book-review-env\Scripts\activate
モノリスの Python 依存関係をインストールします。依存関係は、アプリが正常に機能するために依存する外部 Python ライブラリです。これらのライブラリは
requirements.txt
ファイルに記述されています。次のコマンドを実行すると、これらのライブラリがすべて仮想環境にインストールされます。pip install -r monolith/requirements.txt
ブラウザで Cymbal Books を実行して操作する
Cymbal Books は意図的にシンプルに作られたアプリで、次の機能を備えています。
- ライブラリ内のすべての書籍が表示されるホームページ。
- 書籍の詳細を表示するページ。
- 詳細ページにあるボタン。クリックすると書籍のレビューが表示されます。
- 書籍の表紙画像を表示する機能。
ホームページに 3 冊の本が表示され、それぞれの本に [View Details] ボタンが表示されます。
仮想環境がアクティブになり、アプリの依存関係がその環境にインストールされたら、次の手順でアプリを実行します。
ローカルマシンで、monolith ディレクトリに移動します。
cd monolith/
アプリを起動します。
python3 mono.py
ウェブブラウザを開き、アプリのホームページ(
http://127.0.0.1:8080
)にアクセスします。書籍の詳細ページに移動するには、[View Details] をクリックします。詳細ページには、書籍に関する詳細情報(著者や出版年など)が表示されます。
書籍のレビューのリストを表示するには、詳細ページで [Show Reviews] をクリックします。次の図は、『Zephyr's Timepiece』という書籍の詳細ページと最初のレビューを示しています。
/monolith
フォルダ内のファイルを確認する
/monolith
フォルダ内のファイルを確認してみましょう。
monolith/
├── mono.py
├── data/
│ ├── book-1.json
│ ├── book-2.json
│ ├── book-3.json
│ ├── reviews-1.json
│ ├── reviews-2.json
│ └── reviews-3.json
├── images/
│ ├── fungi_frontier.jpg
│ ├── melodic_mechanics.jpg
│ └── zephyrs_timepiece.jpg
├── static/
│ ├── styles_for_details.css
│ └── styles_for_home.css
└── templates/
├── book_details.html
└── home.html
主なフォルダとファイルは次のとおりです。
images/
フォルダには、アプリに表示される次の書籍の表紙画像が含まれています。fungi_frontier.jpg
melodic_mechanics.jpg
zephyrs_timepiece.jpg
data/
フォルダには次の JSON ファイルが含まれています。これらのファイルには、Cymbal Books ライブラリの 3 冊の書籍のレビューと、各書籍の詳細が含まれています。reviews-1.json
、reviews-2.json
、reviews-3.json
book-1.json
、book-2.json
、book-3.json
実際のアプリではデータベースがよく使用されますが、アプリのデータを JSON ファイルに保存すると、実装が簡単になります。Cymbal Book サンプルアプリでは、複雑なコードを処理する必要がないよう JSON ファイルを使用しています。このため、このチュートリアル シリーズの主な目標である、モノリスをモジュール化してコンテナ化する方法を学習することに集中できます。
次のフォルダは無視できます。これらのフォルダのファイルは、アプリのレイアウトやデザインにとって重要ですが、アプリのロジックには直接関係していません。
static/
: アプリのスタイルを定義する CSS ファイルが含まれています。templates/
: アプリのレイアウトとコンテンツを定義する HTML ファイルが含まれます。
Flask アプリケーションとしてモノリスについて
このチュートリアルで作成するモノリスは、ウェブ アプリケーションを構築するための Python ライブラリである Flask を使用して構築されています。ただし、Flask は同時実行をサポートしていないため、通常は本番環境で使用されません。同時実行をサポートしていないと、負荷が高い状況でパフォーマンスのボトルネックとなる可能性があります。Flask アプリケーションには、堅牢なエラー処理機能とスケーラビリティ機能もありません。
Cymbal Books アプリで Flask を使用しているのは、シンプルで設定が最小限で済み、モジュール化とコンテナ化のコンセプトを理解しやすいためです。Python を使用する本番環境のアプリケーションでは、FastAPI や Django など、Flask に代わる手段を検討してください。Java 用の Spring Boot や Node.js 用の Express.js など、他の言語に合わせて調整されたフレームワークを使用することもできます。これらのフレームワークでは、実際のアプリケーションの要件を満たすために、より優れた同時実行性、スケーラビリティ、プロダクション レディな機能を提供できます。
mono.py を調べる
モノリスのロジックはすべて mono.py
という 1 つのファイルに含まれています。このファイルで Flask アプリケーションを作成します。Flask アプリケーションはウェブサーバー内で実行され、エンドポイントと呼ばれる特定の URL をリッスンし、その URL に送信されたリクエストに応答します。ユーザーがウェブブラウザでアクセスするか、プログラムでリクエストを送信して、これらの URL のいずれかをリクエストすると、Flask は対応するコードを実行し、そのリクエストを処理します。
次のスクリーン キャプチャは、mono.py
ファイルを示しています。ボックスでハイライト表示されている部分がアプリのルートハンドラです。1 つのハンドラはユーザー向けのホームページを提供しますが、他のハンドラは主にモジュール間の通信に使用され、JSON 形式のデータや静的画像ファイルを配信します。これらのエンドポイントの詳細については、次のセクションで説明します。
スクリーン キャプチャで、ボックスでハイライト表示されている部分がアプリのルートハンドラです。ルートハンドラは次の 2 つの部分で構成されます。
- URL パターン(
/book/<id>/reviews
など)を定義する@app.route()
行。 - エンドポイントが呼び出されたときに実行される関数。
エンドポイントは、@app.route()
行で定義されたパターンに一致する URL です。
たとえば、ユーザーが書籍の詳細ページで [Show Reviews] をクリックすると、アプリは http://localhost:8080/book/1/reviews
にリクエストを送信します。書籍レビューのルートハンドラは、次の手順でこのリクエストに応答します。
- この URL がパターン
/book/<id>/reviews
と一致することを認識します。 - JSON ファイルから書籍 1 のレビューを取得します。
- これらのレビューを JSON 形式でフロントエンドに戻します。
書籍の詳細コンポーネントは、これらのレビューを人が読める形式でウェブページに表示します。Cymbal Books モノリスは、Flask という Python ライブラリを使用して、ルートハンドラの実装を簡素化しています。次のチュートリアルでモノリスをモジュラー アプリに変換する方法を学習する際に、Flask とルートハンドラが重要な役割を果たしていることを確認できます。
モノリスのエンドポイントがモジュール化に重要な理由
エンドポイントは、Cymbal Books アプリを含む Flask アプリケーションで重要な役割を果たします。ただし、エンドポイントの重要性はモノリシック設計にとどまりません。エンドポイントを理解することは、アプリを独立したモジュールに分割するために不可欠です。その理由は次のとおりです。
- コア機能: エンドポイントは、ページの表示やデータの取得など、アプリの主な機能を実装します。各機能は特定のエンドポイントに関連付けられています。
- モジュール化: エンドポイントは、アプリをより小さなモジュールに分割するための自然な境界線(つまり断層線)として機能します。次のチュートリアルで説明するように、アプリのモジュール バージョンの各モジュールは、独自のエンドポイントを持つ機能に対応しています。
- 通信: モジュール設計では、エンドポイントにより、自律的なモジュールが相互に通信できます。
mono.py
でエンドポイントがどのように実装されているかを理解することは、次のチュートリアルで Cymbal Books アプリを独立したモジュールにモジュール化するための基礎となります。
モノリスのルートハンドラをテストする
ブラウザで次のエンドポイントにアクセスして、各ルートハンドラが返すデータの種類を確認します。
- ホームページのルートハンドラ:
http://localhost:8080/
にアクセスして、書籍カタログを表示する完全な HTML ページを確認します。 - 書籍の詳細ルートハンドラ:
http://localhost:8080/book/1
にアクセスして、特定の書籍の詳細を示す HTML ページを表示します。このページは、書籍に関する JSON データをサーバーから取得し、HTML テンプレートを使用して人が読める形式で表示します。URL の ID 番号(1、2、3)を変更して、他の書籍の詳細を表示してみてください。 - 書籍のレビューのルートハンドラ:
http://localhost:8080/book/3/reviews
にアクセスして、書籍のレビューの JSON データを表示します。このデータは、『Melodic Mechanics』の詳細ページで [Show Reviews
] をクリックすると、読み取り可能な形式に処理されます。 - 画像ルートハンドラ:
http://localhost:8080/images/fungi_frontier.jpg
にアクセスして画像ファイルを表示します。ホームページと書籍の詳細ページは、書籍の表紙画像を表示するためにこのエンドポイントを呼び出します。
まとめ
このチュートリアルでは、モノリシックな Cymbal Books アプリを設定して実行しました。モノリスは Flask アプリケーションとして実装され、エンドポイントと呼ばれる特定の URL をリッスンし、それらの URL に送信されたリクエストに応答することがわかりました。
次のステップ
次のチュートリアル、モノリスをモジュール化するでは、モノリスを独立したモジュールに分割する方法を説明します。