マイクロサービスレインボー ルンパス

1. はじめに

最終更新日: 2021 年 5 月 6 日

マイクロサービス Rainbow Rumpus

動きまわってふざけて他人に雪玉を投げる雪合戦をしたことがありますか?まだの場合はぜひお試しください。しかし今では、物理的に攻撃されるリスクを負うことなく、ネットワーク アクセス可能な小規模なサービス(マイクロサービス)を構築できます。このサービスは、他のマイクロサービスとの壮大な戦いに参加し、雪玉ではなく虹を投げかけます。

よくある疑問点しかし、マイクロサービスがどのようにしてどうすればよいでしょうかマイクロサービスはネットワーク リクエスト(通常は HTTP 経由)を受信してレスポンスを返します。「アリーナ マネージャー」がいるがマイクロサービスにアリーナの現在の状態を送信し、マイクロサービスから処理内容を指定するコマンドが返されます。

もちろん、目標は成功です。その過程で、Google Cloud でのマイクロサービスの構築とデプロイについて学びます。

仕組み

必要なテクノロジー(または Go、Java、Kotlin、Scala、NodeJS、Python のスターターの中から選択)を使用してマイクロサービスを構築し、Google Cloud にデプロイします。デプロイが完了したら、マイクロサービスの URL を Google に知らせていただければ、アリーナに追加します。

アリーナには特定のバトルのすべてのプレーヤーが参加します。レインボー ルンパスには専用のアリーナがあります。各プレーヤーは、他のプレーヤーに向かって動き回って虹を投げるマイクロサービスを表します。

1 秒に 1 回、アリーナ マネージャーがマイクロサービスを呼び出して現在のアリーナの状態(プレーヤーがいる場所)を送信し、マイクロサービスが処理内容のコマンドを返します。アリーナでは、前に進んだり、左右に曲がったり、虹を投げたりできます。虹は、プレイヤーが向いている方向に最大 3 つのスペースを移動します。虹が「当たる」場合一方のプレーヤーは得点となり、打ったプレーヤーは失点となります。アリーナのサイズは、現在のプレーヤー数に合わせて自動調整されます。

過去のアリーナは次のようになります。

20628e6bd442bd11.png

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 の出力を示しています。

d88e40430706a32b.png

マイクロサービスが機能していることを確認する

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

FLRT のいずれかのレスポンス文字列が表示されます。

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

変更を行うための詳しい手順が表示されます。

f910c9ef7b51c406.png

サンプル プロジェクトが開いているエディタが表示された 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 を使用して、プロジェクトをローカルで作業できます。

  1. [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
  1. [Cloud Shell で] マシンに zip ファイルをダウンロードします。
cloudshell download-file cloudbowl-sample.zip
  1. [マシン上] ファイルを解凍して、ファイルを変更内容をテストする
  2. [マシンに] gcloud CLI をインストールします
  3. [マシンで操作] Google Cloud にログインします。
gcloud auth login
  1. [マシン上] 環境変数 PROJECT_IDSAMPLE を Cloud Shell と同じ値に設定します。
  2. [マシン上] Cloud Build を使用してコンテナを(ルート プロジェクト ディレクトリから)ビルドします。
gcloud alpha builds submit . \
  --pack=image=gcr.io/$PROJECT_ID/$SAMPLE \
  --project=$PROJECT_ID
  1. [マシン上で] 新しいコンテナをデプロイします。
gcloud run deploy $SAMPLE \
  --project=$PROJECT_ID \
  --platform=managed \
  --region=us-central1 \
  --image=gcr.io/$PROJECT_ID/$SAMPLE \
  --allow-unauthenticated

7. 継続的デリバリー

SCM を設定する

マイクロサービスでチームと共同作業できるように GitHub を設定します。

  1. GitHub にログインする
  2. 新しいリポジトリを作成する
  3. ローカルマシンで作業している場合は、git コマンドライン インターフェース(CLI)または GitHub デスクトップ GUI アプリケーション(Windows または Mac)を使用できます。Cloud Shell を使用する場合は、git CLI を使用する必要があります。マイクロサービスのコードを GitHub で取得するには、CLI または GitHub Desktop の手順に沿って操作します。

Git CLI を使用してコードを push する

  1. 個人用アクセス トークンを使用した git over https の手順に沿って操作します。
  2. [repo] を選択します。スコープ
  3. 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"
  1. GitHub の組織とリポジトリの環境変数を設定する(https://github.com/ORG/REPO
export GITHUB_ORG=YOUR_GITHUB_ORG
export GITHUB_REPO=YOUR_GITHUB_REPO
  1. コードを新しいリポジトリに 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
  1. 変更を行ったら、変更を commit して GitHub に push できます。
git add .
git status
git diff --staged
git commit -am "my changes"
git push

GitHub デスクトップでコードを push する

  1. 前述の「ローカルでの開発」の手順でコードをダウンロードします。ラボ
  2. GitHub Desktop をインストールして起動し、ログインする
  3. 新しく作成したリポジトリのクローンを作成する

cf7f38c7c86a91cd.png

  1. ファイル エクスプローラを開き、プロジェクトを新しいリポジトリにコピーします
  2. 変更を commit する

5f3c1552e30ad7c5.png

  1. メインブランチを GitHub に公開する

Cloud Run 継続的デプロイの設定

GitHub の SCM 設定を使用して継続的デリバリーを設定できます。これにより、新しい commit が main ブランチに push されるたびに Cloud Build が自動的に変更のビルドとデプロイを行うようになります。デプロイ前にテストを実行する継続的インテグレーションを追加することもできますが、すぐに使用できるサンプルにはテストが含まれていないため、このステップは演習として残されています。

  1. Cloud コンソールで、Cloud Run サービスに移動します。
  2. [SET UP CONTINUOUS DEPLOYMENT] をクリックします。ボタン
  3. GitHub で認証し、microserivce のリポジトリを選択する

a3b5692f178869bc.png

  1. GitHub リポジトリを選択し、ブランチを ^main$ に設定します。

338f1c00f33d2f65.png

  1. Buildpack を使用するようにビルドタイプを設定する
  2. [保存] をクリックして継続的デプロイを設定します。

8. オブザーバビリティ

物事はうまくいきません。オブザーバビリティにより、このような状況が発生するタイミングを把握し、その理由を診断できます。指標には、サービスの健全性と使用状況に関するデータが示されます。ログには、Google のサービスから出力された、手動で計測された情報が表示されています。アラートを使用すると、何か問題が発生した場合に通知を受け取ることができます。それぞれを詳しく見ていきましょう

指標

  1. Cloud Run サービスのリストでサービスを見つけます。
  2. サービスの名前をクリックして、指標ダッシュボードに移動します。

8491b8ec6bc5b4db.png

  1. 指標の メニューをクリックし、[Metrics Explorer で表示する] を選択します。
  2. リソースの指標、フィルタ、グループ化などのオプションを変更できるようになりました。たとえば、すべてのサービスの平均サービス レイテンシを表示できます。

f0d666d8f4221d45.png

ログ

サービスからの STDOUT 出力は Google Cloud Logging システムに送信されます。Cloud Run サービス管理ページから、次のような基本的なログビューにアクセスできます。

40058a82c9299cff.png

Cloud Run のログでは、重大度でフィルタしたり、ログをフィルタしたりできます。柔軟性を高めるには、186fdb0e6d39a6ca.png をクリックしてください。

アラート

  1. サービスのヘルスチェック URL を作成します。
  2. Spring Boot の場合は、次の依存関係を追加するだけです。
org.springframework.boot:spring-boot-starter-actuator
  1. src/main/resources/application.properties を作成または更新し、ディスク容量のチェックを無効にします。
management.health.diskspace.enabled=false
  1. プロトコル、ホスト名、パスを指定して、稼働時間のアラートを作成します。Spring Boot の場合、パスは /actuator/health です。
  2. アラートをテストする

6948d13b263bf573.png

  1. アラートを作成する

9. 完了

これで、他のマイクロサービスと競合するマイクロサービスを正常にビルドし、デプロイできました。それでは始めましょう。

リファレンス ドキュメント