Amazon GameLift ServersとMomento Topicsでリアルタイムマッチメイキングを試してみた
こんにちは、ゲームソリューション部のsoraです。
今回は、Amazon GameLift ServersとMomento Topicsを使ってマルチプレイヤーゲームのマッチメイキングからゲームサーバー接続までの一連の流れを試してみたので、その内容を記事にします。
構成
今回構築したのは以下の構成です。
検証用のFlutterアプリをインストールした端末2台から、Amazon GameLift Serversに対してマッチリクエストをして、マッチングしてゲームサーバーへ接続するところまでを行います。
クライアントからゲームサーバーへの接続情報のやり取りに、Momento Topicsを使用します。

Amazon GameLift FlexMatchで、プレイヤーをプールに追加して条件に合う相手を探します。
マッチが成立したら、GameLift Queueを経由してゲームサーバーを起動します。(すでに存在する場合は割り当て)
Momento Topicsを使って、クライアントにゲームサーバーの接続情報を通知して、クライアントからゲームサーバーへ直接接続します。
- マッチメイキング: Amazon GameLift FlexMatch
- リアルタイム通知: Momento Topics
- ゲームサーバー: Go(Amazon GameLift Servers SDK 5.0)
- クライアント: Flutterアプリ(iOS/Android)
構築
AWS
基本的にAWSリソースはTerraformで構築しました。
ただし、以下のFlexMatch関連のリソースはTerraform対応していなかったため、手動で作成しました。
- FlexMatch ルールセット:マッチングのルールセット
- FlexMatch 設定:マッチメイキングの設定
FlexMatchのルールセットでは、マッチングに必要なプレイヤー数や条件を定義します。
今回は2人でマッチする最もシンプルな設定にしました。


マッチメイキング設定では、使用するルールセットの指定や、マッチ成立後にゲームサーバーを起動するためのGameLift Queueとの紐付けを行います。
また、マッチメイキングのタイムアウト時間や、マッチ成立後の通知先(今回はLambda関数)などの設定もここで行います。

ゲームサーバーをビルドして、Amazon GameLift Serversにアップロードします。
ゲームサーバーは、Amazon GameLift Servers SDK for Goを使用して実装しました。
SDKが最新じゃなかったのか、Amazon Linux 2023で作成していなくて警告が出ていますが、今回は無視します。

Amazon GameLift Servers周りのその他のリソースは、Terraformで構築しましたが、以下に作成されていることも確認できました。


Momento
Momento Topicsを使用するものの、Topicsを使うためにCacheが必要なので、Momento Cacheを作成します。


Topicsは事前に作成するものではないため、事前に作成するリソースはCacheのみです。
Lambdaからトークン発行するために、MomentoのAPIキーは事前に準備しておく必要があります。
セキュリティ面を考慮して、クライアント側にはMomentoのAPIキーを持たせません。
動作確認
Flutterアプリを起動して、MatchmakingのStart Matchボタンを押すとマッチングが開始して、マッチングが完了するとMatchedに変わります。
その後、Game ConnectionのConnectボタンを押すとゲームサーバーへ接続します。
接続先のユーザーもゲームサーバーへ接続して、pingボタンを押すと、Other playersとして接続先のユーザーIDが表示されていることが確認できました。
接続先のユーザーのキャプチャは掲載していませんが、表示されている値から、2人のプレイヤーが同じゲームサーバーに接続し、お互いの存在を認識できていることが確認できました。

動作確認後に、DynamoDBを見てみると、2ユーザーに対して同じマッチIDが割り振られていて、接続が成功のステータスで登録されていることがわかります。

Amazon GameLift Serversのマッチングのメトリクスは以下のような項目を確認することができます。

最後に
今回は、Amazon GameLift ServersとMomento Topicsを使ってマルチプレイヤーゲームのマッチメイキングからゲームサーバー接続までの一連の流れを試してみました。
どなたかの参考になると幸いです。







