この記事は、Groove Xアドベントカレンダー2022 3日目の記事です。
こんばんは、GROOVE Xの junya です。
今回は LOVOT を支えるクラウドサービスについてご紹介します。
クラウドサービスの役割
生き物らしく振る舞えるよう、LOVOTの行動に関わる処理(画像認識・音声認識・意思決定など)はすべてLOVOTの内部で動いていて、実はLOVOT はクラウドが無くても動作するのですが、LOVOT をインターネットに繋ぐと、
といったことが出来るようになります。
クラウドのシステム構成
サービスのクラウド側の構成は以下の通りです。
GCP の Kubernetes クラスタ (GKE) 上に Go で書かれた十数個のアプリケーションがあり、「デバイス」「スマホアプリ」「オペレーター」「外部システム」の4種類のクライアント向けに API を提供しています。
サービス・クライアント間の通信
Kubernetes クラスタ上のサービス間は gRPC で通信し、外部のクライアントに対しては、grpc-gateway を用いて gRPC を REST に変換して API を提供しています。protobuf で API を定義することで、型の恩恵を受けられて開発しやすいです。
その他に、 Cloud Pub/Sub によってイベントを非同期で連携したり、機体とクラウドの間は MQTT で常時接続しています。
クライアント認証
スマホアプリや管理画面は Firebase で認証し、機体は秘密鍵をベースとした公開鍵認証で認証しています。Cloud KMS を用いて認証局も自前で実装しました。
メトリクス情報
機体のメトリクス情報は VictoriaMetrics に蓄積し、ハードウェアの診断や故障予測、サービスの改善に活かしています。
当初は Prometheus を利用していたのですが、スケーラビリティの問題から Victoria Metrics に移行しました。 なお、メトリクス情報のアップロードはユーザ設定でオプトアウト可能で、個人情報にあたる情報は収集していません。
開発プロセス
コードは github で管理し、CircleCI のパイプラインでテストやデプロイのパイプラインを組んでます。 master にマージすると、テストをしてから staging 環境にサービスがデプロイされ、社内の LOVOT やアプリから使われるようになります。 それを週1回くらいのペースで、本番環境にもデプロイしています。
なお、オーナーさん向けのスマホアプリを別にすると、クライアントのフロントエンドは主に React で実装し、App Engine にデプロイしています。
クラウドサービスで利用している技術スタック
まとめると、クラウドで利用している技術スタックはこんな感じです。
- マネージドサービス
- GKE Autopilot, AppEngine, Cloud Functions, Cloud Run, Pub/Sub, Cloud Storage, Datastore, Firestore, Spanner, IAP, Cloud Endpoints など
- 言語
- Go, JavaScript (React)
- 通信
- 開発ツール
- github, circleci
ロボット開発と言うと、馴染みがない方も多いかと思いますが、クラウド開発はモダンなアーキテクチャを踏襲しているつもりです。
絶賛仲間を募集中なので、ご興味ある方は是非、採用ページも覗いてみて下さい!