Amazon Chime SDK for JavaScript で Among Us Automuteとゲーム実況配信 その2
本記事は AWS Advent Calendar 2021 の 18 日目の記事です。
はじめに
今回は、Amazon Chime SDK for JavaScript(以降 Amazon Chime SDK と略す)を使って Among Us の Automute 機能+画面配信機能を作った話です。以前のブログでもご紹介したのですが、いくつか改良すべき点があったので、それについてお話しします。
ところで、ちょっとした宣伝ですが、弊社は日本企業で最初の Amazon Chime SDK のパートナーです。また、Amazon Chime SDK について AWS のサイト上でGuest ブログを執筆させていただいていたりもしています。今回の内容は(半分執筆者の趣味で)ゲームを題材としてますが、オンラインビデオを活用した真面目な(?)サービス開発の実績もございますので、興味を持たれましたらぜひ弊社にご相談いただければと思います。[1]
Among us と作成した機能について
(本節は以前のブログのおさらいです。)
Among Usについてはいろいろなところで解説がなされているので、ここでは詳細を説明しません。ざっくりとした概要だけ説明します。
Among us は宇宙人狼という異名がついている通り人狼ゲームの派生です。4人以上のユーザが参加し、Imposter と呼ばれる狼役のユーザと、Crew と呼ばれる村人役のユーザに別れてプレイします。Crew は誰が Imposter なのかわかりません。そんな中で Crew は宇宙船内に点在する宇宙船の修理などのタスク(ミニゲーム)をこなしていきます。一方で Imposter は Crew のふりをしながらそれを妨害し、Crew を殺害していきます。
Imposter が Crew の生存者を一定数まで減らすと Imposter の勝ちです。Crew は、生存者を減らされる前に全てのタスクを完遂するか、Imposter を見つけ出して宇宙船から追放すれば勝ちになります。Crew が Imposter を追放するには、生存しているプレイヤー全員を集めて Discussion を持ちかけて、Imposter を洗い出す必要があります。なお、Discussion 中しかプレイヤー間でコミュニケーションをとることはできません。
通常は Discussion はテキストチャットで行われるのですが、Imposter を追い詰めるには音声で Discussion したほうが緊迫感が出て面白いです(個人的な感想)。そういった要望に対して有志の方々が、ゲームと連動して Discussion 中だけボイスチャットを可能にするAutoMuteUsというソフトウェアを開発してくださっています。
また、当たり前ですが、通常は他のユーザの画面を見ることはできません。しかし、某 TV 番組でやっていたように、ゲームに参加してない人(観戦者)や殺害されてしまった Crew が他のユーザの画面を見てあーだ、こーだ言い合うのはなかなか楽しいと思います。例えば、youtube のこの動画のような感じ。
これらを参考に、Amazon Chime SDK を用いて、Discussion 中にボイスチャットをできるようにして、観戦者や殺害されてしまった Crew が他のユーザの画面を見ながらボイスチャットできるようにしたのが、以前のブログでご紹介した物になります。
課題と改善方針
実際にソフトウェアを公開して運用してみた結果、次のような課題が上がりました。
・導入、運用が難しい
・データ通信量が多い
以下、それぞれの説明と改善の方針を示します。
導入、運用の容易化
Amazon Chime SDK を用いるということで、以前のブログでご紹介した時点では、Amazon Chime をコントロールする API や DB など全てを AWS 上に構築するようにしていました。CDK を用いて一括で設定できるようにしてはいたのですが、AWS を使用した経験が少ない人にとってはまずは CDK とは何?というところから難しい状態でした。また、API Gateway や Lambda, DynamoDB, Cognito などいくつものサービスを使用しているので、CDK で設定を隠ぺいはしているものの IAM などアクセスポリシーの制御などかなり複雑な感じになっていました。また、 Amazon Chime 以外のサービスの利用料もかかってしまう状況でした。
今回 AWS を使用するのは Amazon Chime のみにして、その他を全て heroku にデプロイできるように変更します。heroku も、CDK と同様に、知らない人にとってはそれなりのハードルはありますが、heroku では良くも悪くも AWS ほど詳細な設定ができませんので、内部でどのようなサービスを使用しているかについて、ほとんど意識する必要がなくなります。また、同様にサービス間のアクセスポリシー制御もほぼ必要なく、heroku から Amazon Chime へのアクセスをできるようにしておけば良いです。さらに、今回のユースケースであれば、heroku は基本的には無料で利用可能です[2]。
上で少しふれたとおり、CDK を用いれば AWS のインフラをかなり詳細に設定できます。このため heroku にデプロイすることが必ずしも良いというわけではありません。しかし、今回のユースケースであれば、heroku にデプロイしても問題ないと判断しました。
データ通信量の制御
Among us では、最大 15 名までゲームに参加できます。Amazon Chime SDK では、ビデオ映像を 27 セッション(25 ビデオセッション+2 画面共有セッション)まで張ることができますので、セッション数的には余裕で全ユーザ分の画面を共有することができます。しかし、当然セッション数に応じてデータ転送量は増えてしまいます。一方で、観戦者も 15 画面を一度に見ることはほとんどないと思います。注目している1~2名のユーザの画面を見る程度ではないでしょうか。
以前のブログで紹介した段階では、全てのユーザの画面をタイル式に敷き詰めて表示するようにしていましたが、今回は表示したいユーザだけを選択して画面に表示できるように変更します。これにより、不要なデータ転送を削減します。
改善の実装のポイント
上記の改善の方針に従い、改善の実装のポイントを説明してきたいと思います。より詳細については、後述するリポジトリにてソースコードを公開してありますので、そちらを参照してください。
API や DB を heroku にデプロイ
もともと AWS 上で動いていた API や DB を heroku にデプロイしなおすためのポイントは次の二つかと思います。
(1)AWS でフルマネージドだったサービスを heroku 上のサービスとして作り変える
(2)heroku から Amazon Chime をコントロールするための権限設定
(1)については次の通りとなります。
Amazon Chime SDK を用いたアプリケーションでは、AWS のアクセスキーを隠蔽するためにサーバ側にアクセスキーを持たせて会議セッションを作成するのが望ましいです。セッション作成のリクエストを受け付けるために REST API を作成する必要がありますが、以前はこれを API Gateway + Lambda という構成で作成していました。heroku に移行するためには、nodejs を使う場合、例えば Express などを用いて置き換える必要があります。
Express を用いて REST API を作成する方法は、各所で説明されていますのでここでは説明しません。
また、heroku 上でデータを永続化するためには postgresql のアドオンなどを利用する必要があります。これについてもオフィシャルに記載されていますのでこちらを参照いただければと思います。
(2)については、次の通りとなります。
heroku から Amazon Chime の会議セッションを作成するために、heroku にアクセスキーを登録する必要があります。Amazon Chime SDK は今も高機能化が進んでおり、機能によって必要なポリシーが増減します。今回は基本的な機能しか用いませんので、AWS 管理ポリシーの AmazonChimeSDK を割り当てれば十分です。
このポリシーを割り当てたユーザのアクセスキーとシークレットアクセスキーを heroku の環境変数に設定します。
heroku config:set AWS_ACCESS_KEY_ID=<ACCESS KEY>
heroku config:set AWS_SECRET_ACCESS_KEY=<SECRET ACCESS KEY>
これにより、heroku から Amazon Chime のコントロールが可能になります。
表示するビデオ映像の選択
Amazon Chime SDK では最大 27 までの映像セッションを作成することができます。併せて、Amazon Chime SDK は各クライアントではこれらの映像データを部分的に受信拒否する機能を備えています。今回は、Among us の各ユーザをクリックすることで映像の受信可否を変更できるようにします。
映像データの受信可否の変更は、対象となるビデオタイル ID を指定して、次のようにして行うことができます。
await meetingSession.audioVideo.pauseVideoTile(videiTileId);
or
await meetingSession.audioVideo.unpauseVideoTile(videiTileId);
これにより、データ転送量をコントロールすることができます。
まとめ
以上、Amazon Chime SDK で実現する Amongus automute の改善についての説明でした。これにより、以前よりだいぶデプロイが簡単になり、ネットワーク環境にも優しくなったと思います。今回改善したソースコードは次のリポジトリで公開しています。デプロイ方法やツールの使用方法については、リポジトリの readme に記載してありますので、ぜひ一度使ってみてください。死後の世界はかなり盛り上がって楽しいと思います!!
Disclaimer
本ブログのソフトウェアの使用または使用不能により生じたいかなる直接損害・間接損害・波及的損害・結果的損害 または特別損害についても、一切責任を負いません。
Discussion