1. はじめに
最終更新日: 2021 年 5 月 6 日
マイクロサービス レインボー ランパス
雪合戦をしたことはありますか?雪合戦では、雪玉を投げ合いながら遊びます。まだお試しでない場合は、ぜひお試しください。ただし、今では、物理的に殴られる危険を冒す代わりに、ネットワークにアクセス可能な小さなサービス(マイクロサービス)を構築して、他のマイクロサービスとの壮大な戦いに参加できます。このサービスは、雪玉ではなく虹を投げます。
よくある質問:では、マイクロサービスが他のマイクロサービスに「虹を投げる」方法を説明します。マイクロサービスは、(通常は HTTP 経由で)ネットワーク リクエストを受信し、レスポンスを返すことができます。「アリーナ マネージャー」がアリーナの現在の状態をマイクロサービスに送信し、マイクロサービスが、実行する操作を指定するコマンドで応答します。
もちろん、目標は優勝することですが、その過程で Google Cloud でマイクロサービスを構築してデプロイする方法を学ぶことができます。
仕組み
任意のテクノロジー(Go、Java、Kotlin、Scala、NodeJS、Python のいずれか)でマイクロサービスを構築し、Google Cloud にデプロイします。デプロイしたら、マイクロサービスの URL をお知らせください。Google がアリーナに追加します。
アリーナには、特定の戦闘のすべてのプレーヤーが含まれます。レインボー ランパスには独自のアリーナがあります。各プレーヤーは、移動して他のプレーヤーに虹を投げるマイクロサービスを表します。
アリーナ マネージャーは約 1 秒ごとにマイクロサービスを呼び出し、現在のアリーナの状態(プレーヤーの位置)を送信します。マイクロサービスは、何をすべきかについてのコマンドと応答します。アリーナでは、前進、左折、右折、レインボー投擲を行うことができます。プレイヤーが向いている方向に、虹が最大 3 マス移動します。レインボーボールが他のプレーヤーに「当たった」場合、投げたプレーヤーは 1 ポイントを獲得し、当たったプレーヤーは 1 ポイントを失います。アリーナのサイズは、現在のプレーヤー数に合わせて自動調整されます。
過去のアリーナは次のようになります。
バトル 1 のアリーナの例
繰り返される競合
アリーナでは、複数のプレーヤーが競合するアクションを実行しようとする可能性があります。たとえば、2 人のプレーヤーが同じ場所に移動しようとする場合があります。競合が発生した場合は、レスポンス時間が最短のマイクロサービスが優先されます。
試合の視聴
マイクロサービスのパフォーマンスを確認するには、ライブ アリーナをご覧ください。
Battle API
アリーナ マネージャーと連携するには、アリーナに参加するための特定の API をマイクロサービスに実装する必要があります。アリーナ マネージャーは、指定された URL に HTTP POST で現在のアリーナの状態を送信します。JSON の構造は次のとおりです。
{
"_links": {
"self": {
"href": "https://YOUR_SERVICE_URL"
}
},
"arena": {
"dims": [4,3], // width, height
"state": {
"https://A_PLAYERS_URL": {
"x": 0, // zero-based x position, where 0 = left
"y": 0, // zero-based y position, where 0 = top
"direction": "N", // N = North, W = West, S = South, E = East
"wasHit": false,
"score": 0
}
... // also you and the other players
}
}
}
HTTP レスポンスのステータス コードは 200(OK)で、レスポンスの本文には次の移動を示す 1 つの大文字文字がエンコードされている必要があります。
F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw
これで設定は完了です。マイクロサービスやその他のアプリケーションを実行するための Google Cloud サービスである Cloud Run にマイクロサービスをデプロイする手順について説明します。
2. Google Cloud にログインします。
Cloud Run にマイクロサービスをデプロイするには、Google Cloud にログインする必要があります。クレジットがアカウントに適用されます。クレジット カードの入力は必要ありません。通常、GSuite アカウントではなく個人アカウント(gmail.com など)を使用するほうが問題が少なくなります。これは、GSuite 管理者がユーザーが特定の Google Cloud 機能を使用できないようにすることがあるためです。また、使用するウェブ コンソールは Chrome や Firefox では問題なく動作しますが、Safari では問題が発生する可能性があります。
3. マイクロサービスのデプロイ
マイクロサービスは、公開されており、Battle API に準拠している限り、任意のテクノロジーで構築して任意の場所にデプロイできます。簡単にするために、サンプル サービスから開始して Cloud Run にデプロイします。
最初に使用するサンプルを選択する
出発点として利用できるバトル マイクロサービス サンプルは多数あります。
Kotlin と Spring Boot | ||
Kotlin と Micronaut | ||
Kotlin と Quarkus | ||
Java と Spring Boot | ||
Java と Quarkus | ||
Go | ||
Node.js と Express | ||
Python と Flask |
使用するサンプルを決めたら、上部の [Cloud Run にデプロイ] ボタンをクリックします。これにより、Cloud Shell(クラウド内の仮想マシンへのウェブベースのコンソール)が起動します。ここで、ソースがクローンを作成され、デプロイ可能なパッケージ(Docker コンテナ イメージ)にビルドされます。このイメージは Google Container Registry にアップロードされ、Cloud Run にデプロイされます。
プロンプトが表示されたら、us-central1
リージョンを指定します。
次のスクリーンショットは、マイクロサービスのビルドとデプロイの Cloud Shell 出力を示しています
マイクロサービスが機能することを確認する
Cloud Shell で、YOUR_SERVICE_URL
をサービスの URL(Cloud Shell の「Your application is now live here」行の後に表示されます)に置き換えて、新しくデプロイされたマイクロサービスにリクエストを送信できます。
curl -d '{ "_links": { "self": { "href": "https://foo.com" } }, "arena": { "dims": [4,3], "state": { "https://foo.com": { "x": 0, "y": 0, "direction": "N", "wasHit": false, "score": 0 } } } }' -H "Content-Type: application/json" -X POST -w "\n" \ https://YOUR_SERVICE_URL
F
、L
、R
、T
のいずれかのレスポンス文字列が表示されます。
4. アリーナへの参加をリクエストする
レインボー ランプスに参加するには、アリーナに参加する必要があります。rainbowrumpus.dev を開き、マイクロサービス URL を指定できるアリーナで [join] をクリックします。
5. 変更を加えてデプロイする
変更を加える前に、GCP プロジェクトと使用したサンプルに関する情報を Cloud Shell で設定する必要があります。まず、GCP プロジェクトを一覧表示します。
gcloud projects list
プロジェクトは 1 つだけである可能性が高いです。最初の列の PROJECT_ID
をコピーし、次のコマンドに貼り付けます(YOUR_PROJECT_ID
は実際のプロジェクト ID に置き換えます)。これにより、後続のコマンドで使用する環境変数を設定します。
export PROJECT_ID=YOUR_PROJECT_ID
次に、使用したサンプルの別の環境変数を設定して、後続のコマンドで正しいディレクトリとサービス名を指定できるようにします。
# Copy and paste ONLY ONE of these export SAMPLE=kotlin-micronaut export SAMPLE=kotlin-quarkus export SAMPLE=kotlin-springboot export SAMPLE=java-quarkus export SAMPLE=java-springboot export SAMPLE=go export SAMPLE=nodejs export SAMPLE=python
これで、Cloud Shell からマイクロサービスのソースを編集できるようになりました。Cloud Shell のウェブベースのエディタを開くには、次のコマンドを実行します。
cloudshell edit cloudbowl-microservice-game/samples/$SAMPLE/README.md
変更手順が表示されます。
サンプル プロジェクトが開いているエディタがある Cloud Shell
変更を保存したら、README.md
ファイルのコマンドを使用して Cloud Shell でアプリケーションを起動します。まず、Cloud Shell で正しいサンプル ディレクトリに移動します。
cd cloudbowl-microservice-game/samples/$SAMPLE
アプリケーションが実行されたら、新しい Cloud Shell タブを開き、curl を使用してサービスをテストします。
curl -d '{ "_links": { "self": { "href": "https://foo.com" } }, "arena": { "dims": [4,3], "state": { "https://foo.com": { "x": 0, "y": 0, "direction": "N", "wasHit": false, "score": 0 } } } }' -H "Content-Type: application/json" -X POST -w "\n" \ http://localhost:8080
変更をデプロイする準備ができたら、pack
コマンドを使用して Cloud Shell でプロジェクトをビルドします。このコマンドは、Buildpack を使用してプロジェクト タイプを検出し、コンパイルして、デプロイ可能なアーティファクト(Docker コンテナ イメージ)を作成します。
# Make sure you are in a Cloud Shell tab where you set the PROJECT_ID # and SAMPLE env vars. Otherwise, set them again. pack build gcr.io/$PROJECT_ID/$SAMPLE \ --path ~/cloudbowl-microservice-game/samples/$SAMPLE \ --builder gcr.io/buildpacks/builder
コンテナ イメージが作成されたので、Cloud Shell で docker コマンドを使用してコンテナ イメージを Google Container Registry に push し、Cloud Run からアクセスできるようにします。
docker push gcr.io/$PROJECT_ID/$SAMPLE
次に、新しいバージョンを Cloud Run にデプロイします。
gcloud run deploy $SAMPLE \ --project=$PROJECT_ID \ --platform=managed \ --region=us-central1 \ --image=gcr.io/$PROJECT_ID/$SAMPLE \ --allow-unauthenticated
これで、アリーナで新しいバージョンが使用されるようになります。
6. ローカルで開発する(省略可)
独自の IDE を使用してローカルでプロジェクトを操作する手順は次のとおりです。
- [Cloud Shell で] サンプルを ZIP 圧縮します。
# Make sure the SAMPLE env var is still set. If not, re-set it. cd ~/cloudbowl-microservice-game/samples zip -r cloudbowl-sample.zip $SAMPLE
- [Cloud Shell で] ZIP ファイルをマシンにダウンロードします。
cloudshell download-file cloudbowl-sample.zip
- [マシン上] ファイルを解凍して変更を加えてテストする
- [マシン上] gcloud CLI をインストールする
- [マシンで] Google Cloud にログインします。
gcloud auth login
- [マシン上] 環境変数
PROJECT_ID
とSAMPLE
を Cloud Shell と同じ値に設定します。 - [マシン上] Cloud Build を使用してコンテナをビルドします(ルート プロジェクト ディレクトリから)。
gcloud alpha builds submit . \ --pack=image=gcr.io/$PROJECT_ID/$SAMPLE \ --project=$PROJECT_ID
- [マシン上] 新しいコンテナをデプロイします。
gcloud run deploy $SAMPLE \ --project=$PROJECT_ID \ --platform=managed \ --region=us-central1 \ --image=gcr.io/$PROJECT_ID/$SAMPLE \ --allow-unauthenticated
7. 継続的デリバリー
SCM を設定する
GitHub を設定して、チームでマイクロサービスに共同で取り組めるようにします。
- GitHub にログインする
- 新しいリポジトリを作成する
- ローカルマシンで作業している場合は、git コマンドライン インターフェース(CLI)または GitHub Desktop GUI アプリケーション(Windows または Mac)を使用できます。Cloud Shell を使用している場合は、git CLI を使用する必要があります。GitHub でマイクロサービスのコードを取得するには、CLI または GitHub Desktop の手順に沿って操作します。
git CLI を使用してコードを push する
- 個人アクセス トークンを使用した HTTPS 経由の git の手順に沿って操作します。
- [repo] スコープを選択します。
- git を設定します。
git config --global credential.helper \ 'cache --timeout=172800' git config --global push.default current git config --global user.email "YOUR@EMAIL" git config --global user.name "YOUR NAME"
- GitHub 組織とリポジトリの環境変数を設定する(
https://github.com/ORG/REPO
)
export GITHUB_ORG=YOUR_GITHUB_ORG export GITHUB_REPO=YOUR_GITHUB_REPO
- コードを新しいリポジトリに push する
# Make sure the SAMPLE env var is still set. If not, re-set it. cd ~/cloudbowl-microservice-game/samples/$SAMPLE git init git add . git commit -m init git remote add origin https://github.com/$GITHUB_ORG/$GITHUB_REPO.git git branch -M main # This will now ask for your GitHub username & password # for the password use the personal access token git push -u origin main
- 変更を加えた後、変更を commit して GitHub に push できます。
git add . git status git diff --staged git commit -am "my changes" git push
GitHub Desktop でコードを push する
- 前の「ローカルで開発する」ラボの手順に沿ってコードをダウンロードします。
- GitHub Desktop をインストールして起動し、ログインします。
- 新しく作成したリポジトリのクローンを作成する
- ファイル エクスプローラを開き、プロジェクトを新しいリポジトリにコピーします。
- 変更を commit する
- メインブランチを GitHub に公開する
Cloud Run の継続的デプロイを設定する
GitHub で SCM を設定したので、新しい commit が main
ブランチに push されるたびに、Cloud Build が変更を自動的にビルドしてデプロイするように、継続的デリバリーを設定できます。デプロイ前にテストを実行する継続的インテグレーションも追加できますが、このステップは、デフォルトのサンプルにテストが含まれていないため、演習として残されています。
- Cloud コンソールで、Cloud Run サービスに移動します。
- [継続的デプロイの設定] ボタンをクリックします。
- GitHub で認証し、マイクロサービスのリポジトリを選択する
- GitHub リポジトリを選択し、ブランチを
^main$
に設定します。
- Buildpack を使用するように Build Type を設定する
- [保存] をクリックして、継続的デプロイを設定します。
8. オブザーバビリティ
物事はうまくいかないものです。オブザーバビリティにより、その発生を把握し、原因を診断できます。指標には、サービスの健全性と使用状況に関するデータが表示されます。ログには、サービスから出力された手動計測情報が表示されます。アラートを使用すると、問題が発生したときに通知を受け取ることができます。それぞれについて詳しく見ていきましょう。
指標
- Cloud Run サービスのリストでサービスを見つけます。
- サービスの名前をクリックして、指標ダッシュボードに移動します。
- 指標の [⋮] メニューをクリックし、[Metrics Explorer で表示] を選択します。
- リソース指標、フィルタ、グループ化などのオプションを変更できるようになりました。たとえば、すべてのサービスの平均サービス レイテンシを表示できます。
ログ
サービスの STDOUT 出力は Google Cloud Logging システムに送信されます。基本的なログビューには、Cloud Run サービスの管理ページからアクセスできます。
Cloud Run ログでは、重大度でログをフィルタできます。より柔軟に設定するには、 をクリックします。
アラート
- サービスのヘルスチェック URL を作成します。
- Spring Boot の場合は、次の依存関係を追加するだけです。
org.springframework.boot:spring-boot-starter-actuator
src/main/resources/application.properties
を作成または更新し、ディスク容量チェックを無効にします。
management.health.diskspace.enabled=false
- プロトコル、ホスト名、パスを指定して稼働時間アラートを作成します。Spring Boot の場合、パスは
/actuator/health
です。 - アラートをテストする
- アラートを作成する
9. 完了
これで、他のマイクロサービスと戦えるマイクロサービスを構築してデプロイできました。それでは始めましょう。