1. はじめに
最終更新日: 2021 年 5 月 6 日
マイクロサービス Rainbow Rumpus
動きまわってふざけて他人に雪玉を投げる雪合戦をしたことがありますか?まだの場合はぜひお試しください。しかし今では、物理的に攻撃されるリスクを負うことなく、ネットワーク アクセス可能な小規模なサービス(マイクロサービス)を構築できます。このサービスは、他のマイクロサービスとの壮大な戦いに参加し、雪玉ではなく虹を投げかけます。
よくある疑問点しかし、マイクロサービスがどのようにしてどうすればよいでしょうかマイクロサービスはネットワーク リクエスト(通常は HTTP 経由)を受信してレスポンスを返します。「アリーナ マネージャー」がいるがマイクロサービスにアリーナの現在の状態を送信し、マイクロサービスから処理内容を指定するコマンドが返されます。
もちろん、目標は成功です。その過程で、Google Cloud でのマイクロサービスの構築とデプロイについて学びます。
仕組み
必要なテクノロジー(または Go、Java、Kotlin、Scala、NodeJS、Python のスターターの中から選択)を使用してマイクロサービスを構築し、Google Cloud にデプロイします。デプロイが完了したら、マイクロサービスの URL を Google に知らせていただければ、アリーナに追加します。
アリーナには特定のバトルのすべてのプレーヤーが参加します。レインボー ルンパスには専用のアリーナがあります。各プレーヤーは、他のプレーヤーに向かって動き回って虹を投げるマイクロサービスを表します。
1 秒に 1 回、アリーナ マネージャーがマイクロサービスを呼び出して現在のアリーナの状態(プレーヤーがいる場所)を送信し、マイクロサービスが処理内容のコマンドを返します。アリーナでは、前に進んだり、左右に曲がったり、虹を投げたりできます。虹は、プレイヤーが向いている方向に最大 3 つのスペースを移動します。虹が「当たる」場合一方のプレーヤーは得点となり、打ったプレーヤーは失点となります。アリーナのサイズは、現在のプレーヤー数に合わせて自動調整されます。
過去のアリーナは次のようになります。
Battle One アリーナの例
紛争環境
アリーナでは、複数のプレーヤーが競合するアクションを試みる可能性があります。たとえば、2 人のプレーヤーが同じスペースに移動しようとする場合があります。競合が発生した場合、レスポンス時間が最も短いマイクロサービスが優先されます。
戦いを観戦
実際のマイクロサービスの動作を確認するには、ライブ アリーナをご覧ください。
Battle API
Google のアリーナ マネージャーと連携するには、アリーナに参加するための特定の API をマイクロサービスで実装する必要があります。アリーナ マネージャーは、指定された URL に次の JSON 構造の HTTP POST でアリーナの状態を送信します。
{
"_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)と、次の動作を含むレスポンス本文を次のいずれかの大文字でエンコードしたものでなければなりません。
F <- move Forward
R <- turn Right
L <- turn Left
T <- Throw
これで操作は完了です。Cloud Run にマイクロサービスをデプロイする手順を説明します。Cloud Run は、マイクロサービスやその他のアプリケーションを実行するための Google Cloud サービスです。
2. Google Cloud にログインする
マイクロサービスを Cloud Run にデプロイするには、Google Cloud にログインする必要があります。アカウントにクレジットが適用されますので、クレジット カード情報を入力する必要はありません。通常、G Suite アカウントの代わりに個人アカウント(例: gmail.com)を使用すると問題は少なくなります。G Suite 管理者が、ユーザーが Google Cloud の特定の機能を使用できないことがあるためです。また、これから使用するウェブ コンソールは Chrome や Firefox では問題なく動作しますが、Safari では問題が発生する可能性があります。
3. マイクロサービスをデプロイする
一般公開でアクセスでき、Battle API に準拠している限り、任意のテクノロジーでマイクロサービスを構築してどこにでもデプロイできます。しかし、簡単にするために、サンプル サービスから始めて、Cloud Run にデプロイするお手伝いをします。
サンプルを選ぶ
手始めに利用できる Battle マイクロサービスのサンプルは数多くあります。
Kotlin とSpring Boot | ||
Kotlin とMicronaut | ||
Kotlin とQuarkus | ||
Java とSpring Boot | ||
Java とQuarkus | ||
Go | ||
Node.js とエクスプレス | ||
Python とフラスコ |
使用するサンプルが決まったら、[Deploy on Cloud Run] をクリックします。クリックします。これにより、Cloud Shell(クラウド内の仮想マシンに対するウェブベースのコンソール)が起動し、ソースのクローンが作成され、デプロイ可能なパッケージ(Docker コンテナ イメージ)に組み込まれます。このパッケージは Google Container Registry にアップロードされ、Cloud Run にデプロイされます。
プロンプトが表示されたら、us-central1
リージョンを指定します。
以下のスクリーンショットは、マイクロサービスのビルドとデプロイの Cloud Shell の出力を示しています。
マイクロサービスが機能していることを確認する
Cloud Shell で、新しくデプロイされたマイクロサービスに対してリクエストを送信できます。YOUR_SERVICE_URL
は、Cloud Shell 内の「Your application is now live here」行の後にあるサービスの URL に置き換えます。
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
変更をデプロイする準備ができたら、Cloud Shell で pack
コマンドを使用してプロジェクトをビルドします。このコマンドは、Buildpacks を使用してプロジェクト タイプを検出してコンパイルし、デプロイ可能なアーティファクト(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 デスクトップ GUI アプリケーション(Windows または Mac)を使用できます。Cloud Shell を使用する場合は、git CLI を使用する必要があります。マイクロサービスのコードを GitHub で取得するには、CLI または GitHub Desktop の手順に沿って操作します。
Git CLI を使用してコードを push する
- 個人用アクセス トークンを使用した git over https の手順に沿って操作します。
- [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 デスクトップでコードを push する
- 前述の「ローカルでの開発」の手順でコードをダウンロードします。ラボ
- GitHub Desktop をインストールして起動し、ログインする
- 新しく作成したリポジトリのクローンを作成する
- ファイル エクスプローラを開き、プロジェクトを新しいリポジトリにコピーします
- 変更を commit する
- メインブランチを GitHub に公開する
Cloud Run 継続的デプロイの設定
GitHub の SCM 設定を使用して継続的デリバリーを設定できます。これにより、新しい commit が main
ブランチに push されるたびに Cloud Build が自動的に変更のビルドとデプロイを行うようになります。デプロイ前にテストを実行する継続的インテグレーションを追加することもできますが、すぐに使用できるサンプルにはテストが含まれていないため、このステップは演習として残されています。
- Cloud コンソールで、Cloud Run サービスに移動します。
- [SET UP CONTINUOUS DEPLOYMENT] をクリックします。ボタン
- GitHub で認証し、microserivce のリポジトリを選択する
- GitHub リポジトリを選択し、ブランチを
^main$
に設定します。
- Buildpack を使用するようにビルドタイプを設定する
- [保存] をクリックして継続的デプロイを設定します。
8. オブザーバビリティ
物事はうまくいきません。オブザーバビリティにより、このような状況が発生するタイミングを把握し、その理由を診断できます。指標には、サービスの健全性と使用状況に関するデータが示されます。ログには、Google のサービスから出力された、手動で計測された情報が表示されています。アラートを使用すると、何か問題が発生した場合に通知を受け取ることができます。それぞれを詳しく見ていきましょう
指標
- 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. 完了
これで、他のマイクロサービスと競合するマイクロサービスを正常にビルドし、デプロイできました。それでは始めましょう。