Agones on Amazon EKS で構築するマルチプレイゲームの専用ゲームサーバー

2024-10-03
デベロッパーのためのクラウド活用方法

Author : 鷲見 啓志

Agones on Amazon EKS で構築するマルチプレイゲームの専用ゲームサーバー

2024-10-03
デベロッパーのためのクラウド活用方法

Author : 鷲見 啓志

ゲーム開発者のみなさま ! こんにちは、Game Solutions Architect の鷲見 啓志です。

この記事をご覧になられているあなたはきっとマルチプレイゲームの構築に興味があるのではないかと思います。突然ですが、そんなあなたに質問です。

オンラインマルチプレイゲームの構築方法どのようなものがあるでしょうか ? すこし頭に思い浮かべてみてください。おそらくは以下に挙げる 3 つの方式のどれかが思い浮かんだのではないかと思います。

  1. Peer to Peer 型
    プレイヤー同士が互いに接続し通信する方式
  2. Listen Server 型
    プレイヤーの一人がホストとなって通信を仲介する方式
  3. 専用ゲームサーバー型
    専用のゲームサーバーを準備し、プレイヤーが用意されたサーバーに接続する方式


Peer to Peer 型や Listen Server 型の場合は、マルチプレイのための通信をプレイヤーのゲームクライアントが担うため、プレイヤーの通信環境などによっては安定してゲームをプレイすることができないといった事情があり、最近は専用ゲームサーバー型のマルチプレイゲームが注目を集めています。

そんな専用ゲームサーバー型のマルチプレイゲームを実現してくれる OSS のソフトウェアが「Agones」となります。Agones は Kubernetes ネイティブのオープンソースのゲームサーバーホスティングプラットフォームです。2018 年の 3 月に最初の v0.1 がリリースされたのち、現在もアップデートが定期的に行われており、2024 年 9 月 17 日現在では v1.43 がリリースされていいます。

Agones の特徴の一つは Kubernetes ネイティブであるということが挙げれらます。Kubernetes をベースに専用ゲームサーバーの構築を実現します。ゲームサーバーをコンテナ化して、Kubernetes 上でゲームサーバーを実行します。また、Kubernetes のリソース管理機能を活用して、専用ゲームサーバーの構築・デプロイ・スケーリングを実現します。

Kubernetes ネイティブということもあり、Kubernetes の利用が前提となりますが、幅広いツールやコミュニティなどのKubernetes のエコシステムをそのまま利用することができるというのも魅力の一つとなっています。

今回本記事では、この Agones について解説したのち、 Agones を Amazon EKS 上で動かすところまでご紹介してみたいと思います。

ゲーム開発者向けのその他の記事はこちら

選択
  • 選択
  • Amazon DynamoDB で作るサーバーレスなゲーム用アチーブメントマイクロサービス
  • AWS の知識ゼロから始める AWS GameKit
  • Amazon GameLift を使って「最短」でマルチプレイヤーゲームを作る
  • Amazon DynamoDB で作るサーバーレスなゲーム用フレンドマイクロサービス
  • Amazon GameSparks でインフラを意識せずにゲームのバックエンドサービスを開発しよう
  • 魔法で作る Amazon DynamoDB の 簡単ゲームインベントリ
  • レベル 1 から作るゲームのクエスト手帳
  • サーバーレスなゲームのギルド検索
  • 一緒に学び考える ! ゲームの AI/ML 活用
  • 3 ステップで始める AI モデル開発 ! 始める前に知っておくべきコト !
  • 実践 ! 機械学習でゲームの休眠ユーザーを予測してみよう
  • Amazon GameLift Anywhere でサクッとマルチプレイゲームを開発しよう
  • ゲーム分析を Amazon Aurora と Amazon Redshift の Zero-ETL 統合ではじめよう
  • Amazon Redshift を活用したゲームの行動ログ分析
  • Amazon QuickSight によるゲーム分析ダッシュボードの構築
  • 品質管理に生成 AI は使えるのか !? テキストチェックを生成 AI にやらせてみた
  • 生成 AI を用いたヘルプソリューションを作成する
  • 世界に 1 つだけの AI アシスタント作成 ~オリジナルにカスタマイズ
  • マルチモーダルな生成 AI 活用の入門編! - 画像認識と画像生成
  • Amazon S3 と Amazon CloudFront を活用したグローバル向けゲームビルドバイナリ共有環境の構築
  • Terraform を利用した Amazon EKS の構築
  • Amazon Bedrock でゲームの BGM を作ってみました !
  • Amazon EC2 ではじめる Unreal Engine Pixel Streaming 入門
  • Agones on Amazon EKS で構築するマルチプレイゲームの専用ゲームサーバー
  • AWS Summit Japan 2024 Game Industry Booth の舞台裏

このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 


Agones のコンポーネントのご紹介

Agones を AWS 上で動かす前に、Agones の構成要素について、それぞれ簡単にご紹介しておこうと思います。

Agones の リソースの全体像を表した図がこちらとなります。それぞれの要素についてご紹介していきます。

GameServer

Agones で一番メインとなるコンポーネントが GameServer で専用ゲームサーバーをモデル化するための中心的なリソースです。

GameServer を作成すると、Kubernetes クラスター内に Pod が作成されます。GameServer が作成されると Pod が公開されIP アドレス および ポート番号がプレイヤーに共有され、プレイヤーは直接 GameServer に接続してゲームをプレイします。

この GameServer は今どのような状態にあるのかを示す State とよばれるフィールドをもっています。プレイヤーに割り当てられている「Allocated」の状態か、割り当てに向けて待機している「Ready」の状態か、もしくはその他の状態かを把握できるようになっています。

GameServer の Pod が Schedule され、プレイヤーが利用する準備が完了したことを宣言したあと、State は Ready となります。クライアントから GameServer の割り当て要求があった場合、この Ready の GameServer が割り当てられます。ゲームサーバーの割り当てが行われると、State が Allocated に変更されます。プレイヤーに割り当てられて利用中の Allocated の GameServer は利用が終了するまで停止されることはありません。またプレイ終了後は Shutdown されゲームサーバーを終了します。このような状態遷移で処理が行われています。

Fleet

Fleet は GameServer の集合で、GameServer をまとめて管理する役割を持ったリソースです。Fleet を利用することで、個々の GameServer ではなく、グループとして全体で管理し、スケーリング・デプロイ・リソースの割り当てといったタスクを効率的に行うことができます。

たとえば、replica というフィールドの数値を変更することで、Fleet 内の GameServer の数を調整し、スケーリングすることができます。

Fleet Autoscaler

その名の通り Fleet のオートスケーリングの制御する役割のリソースです。バッファとしてもつ Ready の GameServer の数もしくは割合を指定し、その数が維持されるよう GameServer をスケールしていきます。

Agones Allocator と GameServerAllocation

Agones allocator はクライアントからの要求を受け取り、適切な GameServer を割り当て、接続情報をクライアントに返す役割と持ったサービスです。割り当て時には GameServer Allocation というリソースを作成して割り当てを行います。

GameServer Allocation は、GameServer の集合から GameServer を割り当てるために使用されるリソースです。フィルター条件を定義することができ、定義した条件にマッチする GameServer を選択し、その詳細を返す役割を持っています。

Agones Controller / Agones Extensions / Agones Ping

Allocator 以外の ControlPlane  の コンポーネントとしては Agones Controller / Agones Extensions / Agones Ping があります。

Agones Controller はGameServer リソースのライフサイクル全体を管理する役割を持ったサービスです。
Agones Extensions は WebHook と拡張 API を扱うサービスです。
Agones Ping は、HTTP と UDP の両方でレイテンシーの計測を行うことができるサービスです。

本記事ではあまり登場しませんが、Agones を支える大事な役割を持ったコンポーネントです。


Agones チュートリアル

それでは Agones を構成する各コンポーネントとその役割について理解することができたので、ここからはこの Agones を AWS 上で動かす方法をご紹介していきます。Agones は Kubernetes ネイティブのソフトウェアということで、AWS 上で構築する際には、Amazon EKS を利用することで簡単に専用ゲームサーバーを構築することができます。

この章を進めていくことで、以下のような構成で Agones を稼働させることができます。

それでは始めていきましょう。

前提条件

  • AWS アカウントは準備できているものとします。
  • Kubernetes は 1.30 を利用します。
  • Agones は 1.43.0 を利用します。
  • ゲームサーバー本体のコンテナとして利用する Simple Game Server のバージョンは 0.34 を利用します。
  • kubectl , aws-cli , eksctl および Helm のインストールおよび設定は行われているものとします。

1. EKS クラスターの作成

Agones を稼働させるための EKS クラスターを作成します。今回は Kubernetes のバージョンは「1.30」としていますが、適宜利用するバージョンに合わせて変更してください。

Agones のバージョンと対応する Kubernetes バージョンの状況については こちら を確認ください。

実行完了までは 20 - 30 分ほど時間がかかります。

eksctl create cluster --name bf-agones-cluster --version 1.30 \
--nodegroup-name standard-workers --node-type t3.medium \
--nodes 3 --nodes-min 3 --nodes-max 4

2. SecurityGroup の設定

Agones を稼働させるためには、EKS のワーカーノードに対して UDP トラフィックを許可するよう  SecurityGroup  の設定を以下の手順で行います。

  1. AWS マネジメントコンソールにアクセスします。
  2. VPC ダッシュボードに移動し、左のメニューから「セキュリティグループ」を選択します。
  3. ワーカーノードプールのセキュリティグループを見つけます。名前は、「eks-cluster-sg-bf-agones-cluster-XXXXXXXXX」のようになります。
  4.  該当するセキュリティグループを選択して、「インバウンドルール」のタブを開き、「インバウンドのルールを編集」ボタンをクリックします。
  5. ルールを追加」ボタンをクリックして、以下の内容で入力して「ルールを保存」ボタンをクリックします。
    • タイプ : カスタム UDP
    • ポート範囲 : 7000 - 8000
    • ソース : Anywhere-IPv4

3. Agones のインストール

前の手順で作成した EKS クラスターに Agones をインストールします。

以下のコマンドを実行して、Agones をインストールします。今回は Agones のバージョンは「1.43.0」としていますが、適宜利用するバージョンに合わせて変更してください。

Agones のバージョンと対応する Kubernetes バージョンの状況については こちら を確認ください。

helm repo add agones https://agones.dev/chart/stable
helm repo update
helm install bf-release --namespace agones-system --create-namespace agones/agones --version 1.43.0

4. デプロイされた Agones の Control Plane の確認

Agones をインストールすると、Agones の Control Plane がデプロイされますので、デプロイされたコンポーネントを確認してみましょう。

kubectl get pods --namespace=agones-system

コマンドを実行すると以下のような内容が表示されます。「Agones Allocator」「Agones Controller」「Agones Extentions」「Agones Ping」が稼働しているのが確認できます。(NAME のランダム英数字の羅列の箇所は環境により変わります)

NAME                                 READY      STATUS     RESTARTS    AGE
agones-allocator-7879fd785f-s6v94    1/1        Running    0           29s
agones-allocator-7879fd785f-sw8hb    1/1        Running    0           29s
agones-allocator-7879fd785f-xn6zj    1/1        Running    0           29s
agones-controller-d9895b5b8-64f6n    1/1        Running    0           28s
agones-controller-d9895b5b8-l4fqh    1/1        Running    0           28s
agones-extensions-6df8d6f9c7-mdcxv   1/1        Running    0           28s
agones-extensions-6df8d6f9c7-rhgpw   1/1        Running    0           28s
agones-ping-6598fb4d44-7rmac         1/1        Running    0           28s
agones-ping-6598fb4d44-5tavv         1/1        Running    0           28s

5. GameServer の作成

今回は Agones のサンプルとして準備されている Simple Game Server の Docker イメージ を利用します。コマンドを受け取った場合はコマンドを実行し、コマンド以外のテキストを受け取った場合は受け取ったテキストをそのまま返してくれると言ったシンプルな内容です。

5-1. GameServer のマニフェストファイルの作成

GameServer の作成にはマニフェストファイルを利用します。

以下のような内容の GameServer のマニフェストファイルを作成して、gameserver.yaml として保存します。今回は Simple Game Server のバージョンは「0.34」としていますが、適宜利用するバージョンに合わせて変更してください。

内容としてはイメージの指定とポートの指定をしているだけのシンプルな内容となっています。

apiVersion: agones.dev/v1
kind: GameServer
metadata:
  generateName: bf-game-server-
spec:
  ports:
    - name: default
      portPolicy: Dynamic
      containerPort: 7654
  template:
    spec:
      containers:
        - name: bf-game-server
          image: us-docker.pkg.dev/agones-images/examples/simple-game-server:0.34
          imagePullPolicy: Always
          resources:
            requests:
              cpu: 20m
              memory: 64Mi

5-2. GameServer のマニフェストファイルの適用

作成したマニフェストファイルを適用します。

kubectl create -f gameserver.yaml

作成できたら「gameserver.agones.dev/bf-game-server-wp4wp created」といったメッセージが表示されます。

GameServer が作成されたら以下のコマンドを実行して GameServer の状況を確認してみましょう。

kubectl get gs
NAME                   STATE   ADDRESS                                                    PORT   NODE                                                 AGE
bf-game-server-wp4wp   Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7254   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   24s

GameServer が作成されているのが確認できます。(NAMEのランダム英数字の羅列の箇所は環境により変わります)
Ready になっていない場合は、しばらく待った後で再度上記コマンドを実行してください。

6. Fleet の作成

では次に Fleet を作成してみたいと思います。Fleet もマニフェストファイルを利用して作成します。

6-1. Fleet のマニフェストファイルの作成

以下のような内容の Fleet のマニフェストファイルを作成して、fleet.yaml として保存します。

apiVersion: agones.dev/v1
kind: Fleet
metadata:
  name: bf-game-server
spec:
  replicas: 3
  template:
    spec:
      ports:
        - name: default
          containerPort: 7654
      template:
        spec:
          containers:
            - name: bf-game-server
              image: us-docker.pkg.dev/agones-images/examples/simple-game-server:0.34
              imagePullPolicy: Always
              resources:
                requests:
                  cpu: 20m
                  memory: 64Mi

6-2. Fleet のマニフェストファイルの適用

作成したマニフェストファイルを適用します。

kubectl create -f fleet.yaml

作成できたら「fleet.agones.dev/bf-game-server created」といったメッセージが表示されます。
Fleet が作成されたら以下のコマンドを実行して GameServer の状況を確認してみましょう。

kubectl get gs
NAME                         STATE   ADDRESS                                                    PORT   NODE                                                 AGE
bf-game-server-wp4wp         Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7254   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   30m
bf-game-server-x4qrk-b2m2h   Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7130   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   24s
bf-game-server-x4qrk-lg8d6   Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7344   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   24s
bf-game-server-x4qrk-pp2jg   Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7208   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   24s

先ほど作成した GameServer に加えて、新たな GameServer が 3 つ作成されているのがわかります。(NAME  のランダム英数字の羅列の箇所は環境により変わります)

Fleet の情報も確認してみましょう。

kubectl get fleet
NAME             SCHEDULING   DESIRED   CURRENT   ALLOCATED   READY   AGE
bf-game-server   Packed       3         3         0           3       4m13s

bf-game-server という Fleet が作成されていて、現在の状況を確認することができます。

6-3. Fleet の操作

では、ここで Fleet の replica 数を変更してみましょう。レプリカ数を倍の 6 に設定してみます。

kubectl scale fleet bf-game-server --replicas=6

Fleet の情報を確認してみます。

kubectl get fleet
NAME             SCHEDULING   DESIRED   CURRENT   ALLOCATED   READY   AGE
bf-game-server   Packed       6         6         0           6       9m13s

Desired (必要数) が 6 になっているのを確認できます。

GameServer の状況も確認してみます。

kubectl get gs
NAME                         STATE   ADDRESS                                                    PORT   NODE                                                 AGE
bf-game-server-wp4wp         Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7254   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   41m
bf-game-server-x4qrk-b2m2h   Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7130   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   11m
bf-game-server-x4qrk-lg8d6   Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7344   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   11m
bf-game-server-x4qrk-pp2jg   Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7408   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   11m
bf-game-server-x4qrk-pp2jg   Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7208   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   40s
bf-game-server-x4qrk-pvck6   Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7508   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   40s
bf-game-server-x4qrk-spplq   Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7564   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   40s

Fleet の GameServer が新たに 3 つ作成されていることが確認できます。(NAME のランダム英数字の羅列の箇所は環境により変わります)。

7. Fleet Autoscaler の作成

では次に Fleet Autoscaler を作成してみます。

7-1. Fleet Autoscaler のマニフェストファイルの作成

以下のような内容の Fleet Autoscaler のマニフェストファイルを作成して、fleetautoscaler.yaml として保存します。

apiVersion: autoscaling.agones.dev/v1
kind: FleetAutoscaler
metadata:
  name: bf-fleet-autoscaler
spec:
  fleetName: bf-game-server
  policy:
    type: Buffer
    buffer:
      bufferSize: 3
      minReplicas: 0
      maxReplicas: 10

今回は Buffer を 3 に設定しているので、常に Ready の GameServer が 3 つある状態を維持してスケールします。

7-2. Fleet Autoscaler のマニフェストファイルの適用

作成したマニフェストファイルを適用します。

kubectl create -f fleetautoscaler.yaml

作成できたら「fleetautoscaler.autoscaling.agones.dev/bf-fleet-autoscaler created」といったメッセージが表示されます。
Fleet が作成されたら以下のコマンドを実行して GameServer の状況を確認してみましょう。

kubectl get gs
NAME                         STATE   ADDRESS                                                    PORT   NODE                                                 AGE
bf-game-server-wp4wp         Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7254   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   41m
bf-game-server-x4qrk-pp2jg   Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7208   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   12m
bf-game-server-x4qrk-pvck6   Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7508   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   12m
bf-game-server-x4qrk-spplq   Ready   ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7564   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   12m

Fleet の GameServer が 3 つになっていることが確認できます。(NAME のランダム英数字の羅列の箇所は環境により変わります)

それでは、GameServer を割り当てて、Fleet がスケールするか確認してみましょう。

8. GameServer の割り当て

GameServer の割り当ては Agones Allocator を利用する方法と、GameServerAllocation を直接作成する方法があります。今回は GameServerAllocation を直接作成する方法で割り当ててみたいと思います。

8-1. GameServerAllocation のマニフェストの作成

以下のような内容の GameServerAllocation のマニフェストファイルを作成して、gameserverallocation.yaml として保存します。

apiVersion: allocation.agones.dev/v1
kind: GameServerAllocation
spec:
  selectors:
    - matchLabels:
        agones.dev/fleet: bf-game-server

8-2. GameServerAllocation のマニフェストの適用

作成したマニフェストファイルを適用します。

kubectl create -f gameserverallocation.yaml -o yaml

成功した場合は以下のように詳細が接続情報とともに表示されます。

apiVersion: allocation.agones.dev/v1
kind: GameServerAllocation
metadata:
  creationTimestamp: "2024-09-08T01:05:02Z"
  name: bf-game-server-x4qrk-pp2jg
  namespace: default
spec:
  metadata: {}
  multiClusterSetting:
    policySelector: {}
  required: {}
  scheduling: Packed
  selectors:
  - gameServerState: Ready
    matchLabels:
      agones.dev/fleet: bf-game-server
status:
  address: ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com
  addresses:
  - address: XXX.XXX.XXX.XXX
    type: InternalIP
  - address: XXX.XXX.XXX.XXX
    type: ExternalIP
  - address: ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal
    type: InternalDNS
  - address: ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal
    type: Hostname
  - address: ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com
    type: ExternalDNS
  - address: XXX.XXX.XXX.XXX
    type: PodIP
  gameServerName: bf-game-server-x4qrk-nvfls
  metadata:
    annotations:
      agones.dev/last-allocated: "2024-09-08T01:05:02.60831937Z"
      agones.dev/ready-container-id: containerd://038a38f3c82fbd8408504bc72cc334fdfbc6f67f5ad74826253f32cdf170e62d
      agones.dev/sdk-version: 1.43.0
    labels:
      agones.dev/fleet: bf-game-server
      agones.dev/gameserverset: bf-game-server-x4qrk
  nodeName: ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal
  ports:
  - name: default
    port: 7208
  source: local
  state: Allocated

GameServerAllocation の生成が成功すると、Ready の GameServer が 1 つ割り当てられます。

Fleet が作成されたら以下のコマンドを実行して GameServer の状況を確認してみましょう。

kubectl get gs
NAME                         STATE      ADDRESS                                                    PORT   NODE                                                 AGE
bf-game-server-wp4wp         Ready      ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7254   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   101m
bf-game-server-x4qrk-nvfls   Ready      ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7623   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   3m57s
bf-game-server-x4qrk-pp2jg   Allocated  ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7208   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   12m
bf-game-server-x4qrk-pvck6   Ready      ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7508   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   12m
bf-game-server-x4qrk-spplq   Ready      ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com   7564   ip-XXX-XXX-XXX-XXX.ap-northeast-1.compute.internal   12m

1 つの GameServer の STATE が Allocated になっているのがわかります。

Fleet の情報も確認してみましょう。

kubectl get fleet
NAME             SCHEDULING   DESIRED   CURRENT   ALLOCATED   READY   AGE
bf-game-server   Packed       4         4         1           3       143m

また、Fleet 内の Ready の GameServer が 2 つになってしまったため、Fleet Autoscaler が Fleet のレプリカ数を 4 に変更し、Ready の GameServer が 3 つある状態を維持して、スケールアウトしているのが確認できます。

当然ですが、この GameServer には実際に接続することが可能です。nc コマンドなどで IP アドレスとポート番号で接続し、テキストメッセージを送るとそのまま返してくれます。IP アドレスとポート番号は GameServerAllocation の作成時に返却された情報で取得できているので、取得した IP アドレスとポート番号を利用します。

nc -u XXX.XXX.XXX.XXX 7208
Builders Flash!
ACK: Builders Flash!

コマンドを送るとコマンドも実行してくれますが、今回は割愛します。詳細は こちらのページ をご確認ください。

9. 後片付け

チュートリアルは以上となります。最後に今回のチュートリアルで作ったリソースを削除します。

9-1. リソースの削除

以下のコマンドで作成した Agones のリソース (Fleet Autoscaler, Fleet, GameServer ) を削除します

kubectl delete fleetautoscaler bf-fleet-autoscaler
kubectl delete fleet bf-game-server
kubectl get gs |awk '/bf-game-server-*/{print $1}' |xargs kubectl delete gs 

9-2. Agones のアンインストール

以下のコマンドで Agones をアンインストールします。

helm uninstall bf-release --namespace=agones-system

9-3. EKS クラスターの削除

最後に作成した EKS クラスターを削除します。

eksctl delete cluster --name bf-agones-cluster

以上でチュートリアルは全て終了となります。


Amazon GameLift との違いについて

これで AWS 上で Agones をつかってマルチプレイゲームの専用ゲームサーバーを構築することができました。

でもちょっと待ってください。AWS に詳しい人なら「あれ ?」と思われた方もいるのでないかとおもいます。そうです、AWS には「Amazon GameLift」という専用ゲームサーバーをマネージドに提供するサービスがあったんじゃなかったけ ? と疑問を持たれたのではないかと思います。

もちろん「Amazon GameLift」をつかっても専用ゲームサーバーを実現することは可能です。では、Agones と GameLift にはどのような違いがあるのでしょうか ? それを簡単にまとめたものがこちらとなります。

Agones は カスタマイズ性の高さという点と Kubernetes を前提としているため Kubernetes エコシステムのツールなどを利用できるという点に大きなメリットがあります。逆にマッチメイク・プレイヤーセッション管理などの機能がなく実装が必要となりますし、また Kubernetes 自体の運用の複雑さという点もデメリットとして挙げられるかと思います。

この点を踏まえたうえで、コンテナを利用する必要があり、Kubernetes の運用になれている場合は、Agones が第一選択肢となってきます。

このあたりはご自身の会社の体制や今までの経験・対象となるプロジェクトの要件と付き合わせて、ご検討いただければと思います。


まとめ

今回は「Agones on Amazon EKS で構築するマルチプレイゲームの専用ゲームサーバー」というお題で、Agones の説明と、EKS 上で Agonesを動かす手順をご紹介させていただきました。

Agones を使うとかなり簡単に専用ゲームサーバーを構築できることを体感いただき、Agones の全体像と AWS 上で動かすイメージを持っていただけたのではないかと思います。Agones を使って専用ゲームサーバー方式のマルチプレイゲームを作ってみたいと思われた方は、ぜひ AWS のソリューションアーキテクトにご相談いただければと思います。

この Agones を大規模に展開する際のベストプラクティスについて、以前 AWS Summit Japan 2024 でお話させていただいたセッション動画 がありますので、ご興味をお持ちいただけた方はこちらもぜひご覧ください。


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

鷲見 啓志 (@harsm1979)
アマゾン ウェブ サービス ジャパン合同会社
ゲームソリューションアーキテクト

ゲーム業界に特化したソリューションアーキテクトとして、西日本や関西のお客様を支援させていただいております。以前はモバイルゲームの開発・インフラ構築・データ分析やゲームプロデューサー・ディレクターなんかをしておりました。趣味は自転車、いつかは PBP (Paris Brest Paris) を完走してみたいなと思っています。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する