🎮

GameLift Anywhere で InitSDK できるまでの手順まとめ

2023/01/02に公開

取り急ぎ、メモとしてまとめておく
後日、内容を整理予定

ここでは、GameLift server API for C# を対象としています
バージョンは、5.0.0 です

追記(2022/01/03)
公式の Developer Guide に記載ありました。
https://docs.aws.amazon.com/gamelift/latest/developerguide/fleets-creating-anywhere.html
こちらのガイドでは、InitSDK の引数に ComputeName があるようですが、GameLift Server API for C# にある InitSDK の引数 ServerParameters のプロパティには ComputeName がありませんでした。
代わりに hostId が存在しています。
https://docs.aws.amazon.com/gamelift/latest/developerguide/integration-server-sdk5-csharp-datatypes.html#integration-server-sdk5-csharp-dataypes-serverparameters

手順

  1. こちらから GameLift Managed Servers SDK をダンロードする
  2. ダウンロードされた zip ファイルを解凍し、GameLift-CSharp-ServerSDK-5.0.0/src/GameLiftServerSDK/bin/Release にあるファイルを一式、ゲームサーバーのプロジェクトにコピーする(ここでは、libフォルダとする)
  3. .csprojファイルに下記内容を記載し、コピーした dll ファイルを認識できるようにする
<ItemGroup>
  <Reference Include="GameLiftServerSDK">
    <HintPath>lib\GameLiftServerSDK.dll</HintPath>
  </Reference>
  <Reference Include="log4net">
    <HintPath>lib\log4net.dll</HintPath>
  </Reference>
  <Reference Include="Newtonsoft.Json">
    <HintPath>lib\Newtonsoft.Json.dll</HintPath>
  </Reference>
  <Reference Include="Polly">
    <HintPath>lib\Polly.dll</HintPath>
  </Reference>
  <Reference Include="websocket-sharp">
    <HintPath>lib\websocket-sharp.dll</HintPath>
  </Reference>
</ItemGroup>
  1. カスタムロケーションを登録する
    ここでは、ロケーション名を custom-test としている
    ロケーション名は custom- を頭につけないと NG になる
    なんでも良いが、PC の名前とかの方がいいのかな
$ aws gamelift create-location --location-name custom-test

NG 例

$ aws gamelift create-location --location-name hogehoge

An error occurred (InvalidRequestException) when calling the CreateLocation operation: 1 validation error detected: Value 'hogehoge' at 'locationName' failed to satisfy constraint: Member must satisfy regular expression pattern: ^custom-[A-Za-z0-9\-]+
  1. ゲームサーバを起動するPCの情報を登録する
    グローバルIPアドレスが必要になるので、
$ curl ipecho.net/plain; echo 

とかで確認する。
確認できたら、PCの登録をする
ここでは、コンピュータ名を MacBookPro にしているが、なんでも良い
--location は先ほど作成したロケーション名を指定する

$ aws gamelift register-compute \  
    --compute-name MacBookPro \
    --fleet-id fleet-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
    --ip-address xxx.xxx.xxx.xxx \
    --location custom-test
  1. Authトークンを取得する
    GemeLift Anywhere では、期限付きのAuthトークンを用いるっぽい
    なので、期限が切れたらまた Auth トークンを取得する
    取得の仕方は次のとおり
$ aws gamelift get-compute-auth-token \
    --fleet-id fleet-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx \
    --compute-name MacBookPro

うまくいくと次の結果が得られる

{
    "FleetId": "fleet-e0d974c8-499d-4750-9ecf-56f65bc8dff6",
    "FleetArn": "arn:aws:gamelift:us-west-2:049037268605:fleet/fleet-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "ComputeName": "MacBookPro",
    "ComputeArn": "arn:aws:gamelift:us-west-2:xxxxxxx:compute/MacBookPro",
    "AuthToken": "1d6c4447-xxxx-xxxx-xxxx-xxxxxxxxxx",
    "ExpirationTimestamp": "2023-01-02T16:35:37+09:00"
}
  1. InitSDK にパラメータを渡す
    Auth トークンで取得した情報を InitSDK を実行するときに引数で渡す必要がある
    processId は多分なんでも良い
    ProcessId を固定すると、2回目以降の InitSDK は GameLift API Gateway との接続に失敗してしまう。
    なので、以下のリンクに記載されているような UUID を生成して、それを ProcessId に用いると良い。
    https://www.uuidgenerator.net/dev-corner/c-sharp
    hostId は ComputeName と同じでないとダメだった
Aws.GameLift.Server.ServerParameters serverParameters = new Aws.GameLift.Server.ServerParameters
{
        webSocketUrl = "wss://us-west-2.api.amazongamelift.com",
        processId = "process-xxxxxx-xxxx", // 生成した独自の UUID
        hostId = "MacBookPro",
	fleetId = "fleet-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
	authToken = "1d6c4447-xxxx-xxxx-xxxx-xxxxxxxxxx"
};
Aws.GameLift.GenericOutcome initSDKOutcome = GameLiftServerAPI.InitSDK(serverParameters);

これで、GameLift Anywhere が使える(はず)
Auth トークンは毎回取得するのは面倒なので、AWSSDK を使ってプログラム上から取得できると便利かも

以上!

Discussion