1. はじめに
最終更新日: 2021 年 5 月 6 日
マイクロサービス Rainbow Rumpus
雪合戦で、動き回りながら他の人に雪玉を投げつけたことはありますか?まだお試しでない方は、ぜひお試しください。しかし、今では物理的に叩かれるリスクを冒す代わりに、他のマイクロサービスとの壮大な戦いに参加する小さなネットワーク アクセス可能なサービス(マイクロサービス)を構築し、雪玉の代わりに虹を投げることができます。
よくある疑問点しかし、マイクロサービスはどのようにして他のマイクロサービスに虹を「スロー」するのでしょうか?マイクロサービスは、ネットワーク リクエスト(通常は HTTP 経由)を受信してレスポンスを返すことができます。「アリーナ マネージャー」がマイクロサービスにアリーナの現在の状態を送信し、マイクロサービスが実行するコマンドで応答します。
もちろん、目標は勝利ですが、その過程で Google Cloud でマイクロサービスを構築してデプロイする方法を学びます。
仕組み
任意のテクノロジーを使用してマイクロサービスを構築し(Go、Java、Kotlin、Scala、NodeJS、Python のスターターから選択することもできます)、Google Cloud にマイクロサービスをデプロイします。デプロイが完了したら、マイクロサービスの URL をお知らせください。その URL をアリーナに追加します。
アリーナには、特定のバトルに参加するすべてのプレーヤーが含まれます。Rainbow Rumpus には独自のアリーナがあります。各プレーヤーは、動き回って他のプレーヤーに虹を投げるマイクロサービスを表します。
アリーナ マネージャーは 1 秒に 1 回程度マイクロサービスを呼び出し、現在のアリーナの状態(プレーヤーの位置)を送信します。マイクロサービスは、実行するコマンドで応答します。アリーナでは、前進、左折、右折、虹の投射が可能です。虹は、プレイヤーが向いている方向に最大 3 マス移動します。虹が別のプレーヤーに当たると、投げたプレーヤーは 1 ポイントを獲得し、当たったプレーヤーは 1 ポイントを失います。アリーナのサイズは、現在のプレーヤー数に合わせて自動調整されます。
過去のアリーナは次のように表示されます。

バトル 1 のアリーナの例
Revolving Conflicts
アリーナでは、複数のプレーヤーが競合するアクションを実行しようとする可能性があります。たとえば、2 人のプレーヤーが同じマスに移動しようとする場合があります。競合が発生した場合、応答時間が最も短いマイクロサービスが優先されます。
バトルを観戦する
マイクロサービスの戦績を確認するには、ライブ アリーナをご覧ください。
Battle API
アリーナ マネージャーと連携するには、マイクロサービスで特定 API を実装してアリーナに参加する必要があります。アリーナ マネージャーは、次の JSON 構造で、HTTP POST を使用して現在の状態をユーザーが指定した URL に送信します。
{
"_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 にログインする必要があります。アカウントにクレジットが適用されるため、クレジット カードを入力する必要はありません。通常、G Suite アカウントではなく個人用アカウント(gmail.com など)を使用する方が問題が少ないです。G Suite 管理者がユーザーによる特定の 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 を指定するアリーナで [参加] をクリックします。
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
コンテナ イメージが作成されたので、docker コマンド(Cloud Shell 内)を使用して、コンテナ イメージを 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 で] サンプルを圧縮します。
# 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$に設定します。

- Buildpacks を使用するビルドタイプを設定する
- [保存] をクリックして、継続的デプロイを設定します。
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. 完了
お疲れさまでした。これで、他のマイクロサービスと対戦できるマイクロサービスをビルドしてデプロイできました。それでは始めましょう。