LocalMultiplayerAgent をコンテナー モードで使用してゲーム サーバーを実行する方法
このチュートリアルでは、次の手順について説明します。- Wrapper サンプルを使用して [Linux/Windows] コンテナー ビルドを作成する
- MultiplayerSettings.json を構成する
- Docker のセットアップ
- LocalMultiplayerAgent を実行する
- ゲーム接続をテストする
[Linux/Windows] コンテナー ビルドを作成する
コンテナーに詳しくない場合は、Introduction to Container and Docker を参照してください。 ここでは、既存のサンプルを Windows または Linux コンテナーとしてパッケージ化する方法について学習します。プラットフォーム (Windows/Linux ベースのコンテナー) ごとに異なる設定を構成する必要があります。ここでは Wrapper サンプルを使用して詳細を説明します。Linux コンテナー ビルド
Linux コンテナーを使用して、Linux ビルド上で Wrapper と fakegame の実行可能ファイルを実行できます。この場合、Linux ビルドを作成する必要があります。 Wrapper の Linux ビルドを作成する方法については、Linux コンテナー イメージの作成方法 を参照してください。Windows コンテナー ビルド
LMA が Windows コンテナー ビルドを作成します。設定を正しく構成するだけで済みます (Windows コンテナー用の設定方法については後述します)。MultiplayerSettings.json を構成する
LMA ツールセットを展開したフォルダーに移動し、MultiplayerSettings.json ファイルを開きます。このファイルは、MPS 上のビルドをシミュレートするためのビルド構成モック ファイルです。 LMA MultiplayerSettings.json Generator を使用して JSON を作成することもできます。Generator は、オプションに基づいて JSON を作成するシンプルな Web ページです。Generator は LocalMultiplayerAgent/SettingsJsonGenerator の下にあります。 以下は、Wrapper サンプルをLinux コンテナー として実行する MultiplayerSettings.Json の例です。
Windows コンテナー の場合、コンテナーをビルドする必要はありません。LMA がゲーム サーバーを Windows コンテナーとしてパッケージ化します。ImageDetails フィールドに Windows コンテナー ベース イメージを指定し、LocalFilePath にワークステーション上のゲーム アセットの場所を設定するだけで済みます。
-
LocalFilePath- 事前に作成したゲーム サーバーのアセット zip ファイルへのローカル (ワークステーション上) のフル パスです (例: D:\gameassets.zip、JSON フォーマットのためバックスラッシュはエスケープが必要です)。このフィールドは Windows コンテナーで必須です。LMA がゲーム アセットを検索してコンテナーにパッケージ化するために必要となります。 -
PortMappingsList- これらは実行中にゲームで利用可能なポートです。NodePortはワークステーション上で開かれるポートで、GamePort にマッピングされます。GamePort.Numberはコンテナーで実行時にゲーム サーバーがバインドする必要のあるポートです。たとえば、ここでは fakegame.exe がリッスンするポート番号として 80 を設定しています。GamePort.Nameはゲーム サーバーで定義されている値と同じ値を設定してください。実行時に GSDK config を確認して GamePort.Name キーの値を確認できます。GamePort.Protocol- プロトコル タイプを指定します: TCP または UDP。
-
ForcePullFromAcrOnLinuxContainersOnWindows- Docker レジストリから Linux コンテナー イメージをプルし、ローカル レジストリからのプルを回避したい場合は true に設定します。ほとんどの場合、これは false に設定します。 -
ContainerStartParameters.ImageDetails- ゲーム サーバー イメージは、コンテナー レジストリで公開することも、ローカルでビルドすることもできます。Docker レジストリ (例: Azure レジストリ) から Linux コンテナー イメージをプルしたい場合は、ユーザー名とパスワードの値を設定し、ForcePullFromAcrOnLinuxContainersOnWindowsを true に設定する必要があります。Windows コンテナーの場合、ユーザー名とパスワードは不要です。 -
OutputFolder- 出力および構成ファイルが生成されるドライブまたはフォルダーへのパスです。ゲーム サーバーはこのパスの下に展開されるため、十分な空き容量があることを確認してください。指定しない場合、エージェント フォルダーが使用されます。 -
AgentListeningPort- LMA がゲーム サーバーと通信するためのポートです。任意の空きポートで動作します。既定値は 56001 です。56001 にバインドされている別のプロセスがある場合は、この値を変更するか、ポート 56001 上の他のプロセスを終了する必要があります。 -
ResourceLimits(省略可能) - 指定した場合、Docker が CPU/メモリ使用量を制限します。警告: サーバーが許可されたメモリを超えると、強制終了されます。ResourceLimits はコンテナー モードでのみ指定可能です。 -
SessionCookie(省略可能) - RequestMultiplayerServer API 呼び出しの一部としてゲーム サーバーに渡される任意のセッション Cookie です。MPS 上の実際のシナリオでは、接続確立後、サーバーは SessionCookie から対応するリソースを読み込むようクライアントに通知します。
Docker のセットアップ
「PlayFab」という名前の Docker ネットワークを作成し、LocalMultiplayerAgent と通信するためのファイアウォール ルールを追加する PowerShell スクリプトを実行します。- Linux コンテナーの場合は
SetupLinuxContainersOnWindows.ps1を実行します。
Windows コンテナーの場合はSetup.ps1を実行します。これにより、Microsoft/PlayFab-Multiplayer から PlayFab Docker イメージがプルされます。
スクリプトの初回実行時は、コンテナー イメージのダウンロードに数分かかる場合があります。このセットアップを正常に実行するには、インストールされているサードパーティ製アンチウイルス プログラムのファイアウォールを構成する必要がある場合があります。
LocalMultiplayerAgent を実行する
-
PowerShell ウィンドウで:
LocalMultiplayerAgent.exe が含まれる LMA のディレクトリに移動します。 -
Windows コンテナーの場合は
LocalMultiplayerAgent.exeを実行します。
Linux コンテナーの場合はLocalMultiplayerAgent.exe -lcowを実行します。
(lcow は Linux Containers On Windows の略です。) この時点で LMA は HTTP リスナーをセットアップし、コンテナーを実行します。
docker psコマンドを実行すると、マシン上で実行中のコンテナーを確認できます。
CurrentGameState - Initializing
(ゲーム サーバーが直接 GSDK::ReadyForPlayers を呼び出し、GSDK::Start を呼び出さない場合、これは表示されない場合があります。)CurrentGameState - StandingByCurrentGameState - ActiveCurrentGameState - Terminating
ゲームへの接続をテストする
LMA が CurrentGameState - Active を表示したら、IP アドレス 127.0.0.1 と、ゲーム サーバーがリッスンしている NodePort を使用してゲーム サーバーに接続できます。 Wrapper サンプルを使用している場合は、ブラウザーにhttp://127.0.0.1:56100/Hello というアドレスを入力して GET リクエストをテストできます。詳細については Wrapper サンプルを参照してください。
MultiplayerSettings.json の NumHeartBeatsForActivateResponse および NumHeartBeatsForTerminateResponse の値を更新することで、standing-by/active 状態の期間を調整することもできます。
トラブルシューティング
- コンテナー モードでゲーム サーバーが「Container … exited with exit code 1」などのエラーで即座に終了するが、プロセス モードでは問題なく動作する場合は、必要なすべての システム DLL がアセット パッケージに含まれていることを確認してください。
- すべてのログは、MultiplayerSettings.json ファイルで指定された
OutputFolder下に配置されます。LocalMultiplayerAgent は起動のたびに、タイムスタンプをフォルダー名とする新しいフォルダーを作成します。GSDK を通じて出力されたすべてのゲーム サーバー ログは GameLogs フォルダー内に配置されます。
ゲーム サーバーがコンテナー内で実行されている場合、追加のディレクトリ階層をたどる必要がある場合があります。 - GSDK はデバッグ ログを
OutputFolder下の GameLogs フォルダーに書き込みます。 これらのログは、ゲーム サーバーが出力するログと共に GameLogs フォルダー内に配置されます。 - ファイアウォール (Windows のものおよびその他のアンチウイルス) が、対象ポート上でのトラフィックを許可するように構成されていることを確認してください。
- 次のようなエラーが表示される場合:
Docker API responded with status code=InternalServerError, response={"message":"failed to create endpoint <container_name> on network playfab: hnsCall failed in Win32: The specified port already exists". It is likely there is already a container running on the specified port.これは、LocalMultiplayerAgent が予期せず終了した場合に発生する可能性があります。docker psコマンドで実行中のコンテナーを確認し、docker kill <container_name>で削除してください。 Failed to find network 'playfab'を含むエラーが表示される場合は、Setup.ps1 を再実行してみてください。
既知の制限事項
- デバッグ終了時にコンテナーが終了しない場合があります。この場合、管理者として次の PowerShell コマンドを実行してください。これらのコマンドは、LocalMultiplayerAgent によって起動されていないものを含め、すべてのコンテナーを停止して削除します。
