Genvidの技術スタック

# はじめに: Genvid SDKについて
Genvidは、動画ストリーミングとブラウザを介したインタラクティブな体験を組み合わせた「大規模インタラクティブ・ライブ・イベント」（Massive Interactive Live Events）を実現するSDKです。
https://www.genvidtech.com/ja/mile%E3%81%A8%E3%81%AF%EF%BC%9F/

ゲーム技術をベースに、リアルタイムで進行する動画番組に対して、動画視聴者が能動的に参加できるシステムを提供します。
動画番組内のキャラクターが次に何をするかを投票で決めたり、ミニゲームをプレイしてポイントをため、特定のキャラクターを応援するなどの活動を経て、物語が変化していきます。
MILEは、Unityを使いFacebook上で配信されている「Rival Peak」と、Unreal Engine 4を使った「Project Raven」があります。

『RIVAL PEAK』が示す次世代の視聴者参加型デジタルエンタテインメント
https://news.yahoo.co.jp/byline/onokenji/20210326-00229353

Genvid SDKの導入については、Genvidディベロッパーサイトの日本語マニュアルからご確認ください。
https://www.genvidtech.com/for-developers/

今回はGenvid SDK for Unityを使っていますが、Unreal Engineでも利用可能です。

# この記事について
Genvidは上記のような「インタラクティブ・ストリーミング」を実現するSDKですが、普段ゲーム開発でUnity / Unreal Engine をメインに使っている方にとって触れる機会が比較的少ないwebサイド技術が多く盛り込まれています。
マニュアルの手順を追えばサンプルの実行が可能ですが、実際にコンテンツを開発するとなると中身の知識が必要です。
こうした背景から、Genvidの仕組みを実現している中身は何なのか？について関連技術をもってまとめたページが欲しくなったので作りました。
個人的にPCローカルでの実行は何度もやっていますが、クラウドサーバー環境はいまちょうどやっている途中だったりするので、途中途中で更新も入ります。

# HashiCorp関連
Genvidはクラウドサーバー上で動作するソフトウェアです。
「Genvid-bastion」と呼ばれるシステムでコントロールを行い、「Genvid-Cluster」と呼ばれるゲームインスタンス毎のクラスタが実行されます。このクラスタはローカル実行とクラウドサーバー上実行があります。

これらの実行を管理するために、HashiCorp社が提供するクラウド管理ツール郡を採用しています。Genvid SDKをインストールし、手順に従って環境をセットアップすると自動で立ち上がります。
Terraform, Nomad, Vault, Consulを使用しています。

## Terraform
クラウド上のリソース(サーバー等)を動的に構築・管理するツールです。
Genvidでは、Amazon Web Services、Microsoft AzureでGenvid-Clusterを構築する際に使用します。
「ネットワーク構成をコードで実装できる」ことが強みと特徴であり、GUIを介さずにインフラ設定ができます。
Genvidのサンプルでは自動的にクラウドデプロイまでやってくれますが、裏側でTerraformが働いているわけです。

##Nomad
Nomadは、クラウド上のリソースのなかで、複数のサーバーサービスやタスクを実行・管理・スケジューリングするソフトウェアです。
物理的な1台のサーバーの中でOSごと仮想的な実行環境を用意するのが「仮想マシン」です。
実行OSは共通でありつつ、サーバーの中で複数の独立した環境内であるかのようにサービスを動作させる技術が「コンテナ」と呼ばれます。
そのコンテナを管理するシステムが「コンテナオーケストレーション」です。Nomadは、このサービスにあたります。

Nomadは各コンテナの管理とスケジューリング機能を提供します。コンテナ以外にもスタンドアロンアプリケーションも管理対象で、Genvidではゲーム開発環境からビルドされたexeファイルを使用するため、Nomadに管理させています。

サンプルプロジェクトでは、Genvid Clusterでは3つのタスクが実行されます。Service, ゲームインスタンス, Webです。
これらのタスクを実行する設定については、「ジョブテンプレート」を定義しています。

### Serviceタスク
Disco, LeafなどのGenvid固有のサービスを実行するタスクです。
Genvidインストールフォルダの\cloud-services\templatesにあります。
Genvid SDKの「load-config-sdk」でロードされる内容です。

### Webタスク
Webブラウザ上で描画されるオーバーレイ要素をホスティングするサーバーです。
Twitch Overlayを視聴者が利用する場合は、オーバーレイに重ねる画像や文字などの情報をここから取得します。

### ゲームインスタンスタスク
Genvid SDKを含んだゲームexeです。サンプルでは「unity」「Unreal」「game」などの名前になっています。

##Consul
「サービスディスカバリ」と呼ばれるジャンルのソフトウェアです。
Nomadのようなコンテナオーケストレーションシステムによってクラウド上に構築されたサービスを監視し、各サービスがネットワーク上でどこにあるかを特定し、IPアドレス・ポート番号のリストを作ります。
これによって、動的に変化するサーバー・コンテナ・仮想環境において、サービスが相互に接続しやすくなります。
また、同時にプロセスが正常に動作しているかを確認し、障害検知もできます。

##Vault
シークレット管理ソフトウェア。暗号化されたKey-Value Storeを持ち、トークン、パスワード、証明書、API キーなどの秘密情報を管理します。
Genvidではポート番号情報やconfig, ジョブテンプレートのディレクトリ情報などの格納に使われています。

```
genvid-bastion env
```
コマンドで、今vaultでどんな情報が管理されているか確認できます。

# Genvid固有サービス

Serviceとして立ち上がるサービス郡を説明します。

## Leaf
Genvid Streamとして動画と同期したゲームデータをWebソケットサーバーを介して提供するサービスです。

https://www.genvidtech.com/doc/ja/SDK-1.32.0/development_guide/interaction_development/backend_integration.html?highlight=genvid%20leaf

Genvidにおいては動画のタイムコードと同期したデータを配信できますが、その情報を提供しているのがLeafです。

接続URLを取得するために、後述のDiscoにAPI経由でリクエストを送ります。

## Disco
Discoはクライアント側で情報を取得するためのHTTP API を提供します。

https://www.genvidtech.com/doc/ja/SDK-1.32.0/reference/web_sdk/webservice/discod-api.html

## GVEncode
動画エンコードサービスです。

## Genvid 設定ファイル
Genvid固有の動作情報を記述するスキーマです。
構成はHashiCorp Configuration Language (HCL)で記述します。

たとえば動画ストリームのエンコード設定を指定したり、webサーバーのタスクを定義します。

# 参考にしたページ
https://eng-blog.iij.ad.jp/archives/7399#nomad%e3%83%bbnomad%e3%83%bbnomad
https://business.ntt-east.co.jp/content/cloudsolution/column-try-11.html
https://medium.com/hashicorp-engineering/nomad-kubernetes-%E3%81%AA%E3%81%AB%E3%81%8C%E9%81%95%E3%81%86%E3%81%AE-a3b1caf81d05
https://qiita.com/zembutsu/items/1e4424314a0ad98bcc40
https://tech.pepabo.com/2018/09/06/vault-workshop/
https://thinkit.co.jp/story/2015/08/24/6343
https://cybersecurity-jp.com/column/34930