このチュートリアルは、モノリス(またはモノリシック アプリ)をモジュールに分割し、モジュールをコンテナ化して、コンテナ イメージを 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 冊の本が表示され、それぞれの本に [詳細を表示] ボタンが表示されます。
仮想環境がアクティブになり、アプリの依存関係がその環境にインストールされたら、次の手順でアプリを実行します。
ローカルマシンで、monolith ディレクトリに移動します。
cd monolith/
アプリを起動します。
python3 mono.py
ウェブブラウザを開き、アプリのホームページ(
http://127.0.0.1:8080
)にアクセスします。書籍の詳細ページに移動するには、[詳細を表示] をクリックします。詳細ページには、書籍に関する詳細情報(著者や出版年など)が表示されます。
書籍のレビューのリストを表示するには、詳細ページで [レビューを表示] をクリックします。次の画像は、書籍 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 が同時実行をサポートしていないため、負荷が高い場合にパフォーマンスのボトルネックが発生する可能性があるためです。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 です。
たとえば、ユーザーが書籍の詳細ページで [レビューを表示] をクリックすると、アプリは 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 に送信されたリクエストに応答します。
次のステップ
次のチュートリアル モノリスをモジュール化するでは、モノリスを独立したモジュールに分割する方法について説明します。