Amazon GameLift Servers におけるコンテナの仕組み
Amazon GameLift Servers コンテナフリートは、コンテナ化されたアプリケーションを柔軟にデプロイおよびスケーリングできるように設計されています。Amazon Elastic Container Service (Amazon ECS) を使用して、タスクのデプロイメントと実行をあなたの Amazon GameLift Servers フリート向けに管理します。このトピックでは、Amazon GameLift Servers マネージドフリートでコンテナを実行するための基本的な構造要素について説明し、一般的なアーキテクチャを示し、いくつかの主要な概念の概要を示します。
マネージドコンテナ用のこれらのツールを使用して、オンボーディングを高速化します。
-
コンテナスターターキット
は、統合とフリートのセットアップを合理化します。ゲームサーバーに重要なゲームセッション管理機能を追加し、事前設定されたテンプレートを使用して、ゲームサーバー用のコンテナフリートと自動デプロイパイプラインを構築します。デプロイ後、Amazon GameLift Servers コンソールと API ツールを使用して、フリートのパフォーマンスのモニタリング、ゲームセッションの管理、メトリクスの分析を行います。 -
Unreal Engine または Unity の開発者の場合、Amazon GameLift Servers プラグイン
を使用してゲームサーバーを統合し、ゲームエンジンの開発環境内からコンテナフリートを構築します。プラグインのガイド付きワークフローは、マネージドコンテナを使用したクラウドベースのホスティングによる高速でシンプルなソリューションの作成に役立ちます。次に、この基盤をもとに、ゲーム用のカスタムホスティングソリューションを作成します。
コンテナフリートコンポーネント
- フリート
コンテナフリートは、コンテナ化されたゲームサーバーをホストするための Amazon EC2 インスタンスのコレクションです。これらのインスタンスは、Amazon GameLift Servers によってユーザーに代わって管理されます。フリートを作成するときは、ゲームサーバーソフトウェアを含むコンテナアーキテクチャを各フリートインスタンスにどのようにデプロイするかを設定します。1 つまたは複数の地理的な場所にインスタンスを持つコンテナフリートを作成できます。Amazon GameLift Servers スケーリングツールを使用して、ゲームセッションとプレイヤーをホストするためにコンテナフリートの容量を自動的にスケールできます。
- インスタンス
Amazon EC2 インスタンスは、ゲームホスティング用のコンピューティング容量を提供する仮想サーバーです。Amazon GameLift Serversでは、さまざまなインスタンスタイプから選択できます。各インスタンスタイプごとに、CPU、メモリ、ストレージ、ネットワーキングの異なる組み合わせが提供されます。
コンテナフリートを作成すると、Amazon GameLift Servers が選択したインスタンスタイプとフリート設定に基づいてコンテナをデプロイします。デプロイされた各フリートインスタンスは同一であり、コンテナ化されたゲームサーバーソフトウェアを同じ方法で実行します。フリート内のインスタンスの数によって、フリートのサイズとゲームホスティング容量が決まります。
- コンテナグループ
Amazon GameLift Servers は、コンテナグループの概念を使用して、一連のコンテナを記述および管理します。コンテナグループは、コンテナの「タスク」や「ポッド」に近い概念です。各コンテナグループ内では、コンテナの動作、依存関係、使用可能な CPU とメモリリソースの共有方法を定義できます。
各フリートインスタンスには、次のタイプのコンテナグループを含めることができます。
-
ゲームサーバーコンテナグループは、ゲームサーバーアプリケーションおよびサポートソフトウェアを実行するコンテナを管理します。ゲームセッションやプレイヤーをホストするには、コンテナフリートにこのタイプのコンテナグループが少なくとも 1 つ必要です。ゲームサーバーコンテナグループは、フリートインスタンス間で複製できます。フリートインスタンスごとのゲームサーバーグループの複製数は、ソフトウェアのコンピューティング要件と、インスタンスで利用できるコンピューティングリソースによって変わります。
オプションであるインスタンス単位のコンテナグループを使用すると、各フリートインスタンスで追加のソフトウェアを実行できます。これらは、モニタリングなどのバックグラウンドサービスやユーティリティプログラムの実行に役立ちます。ゲームサーバーソフトウェアは、インスタンス単位のコンテナグループのプロセスに直接依存しません。インスタンス単位のコンテナグループは、各フリートインスタンスに 1 つだけデプロイされます。
コンテナフリート内の各コンテナグループには、「必須」と指定されたコンテナが 1 つ含まれます。必須コンテナは、コンテナグループのライフサイクルを制御します。必須コンテナに障害が発生すると、コンテナグループ全体が再起動します。
-
- コンテナ
コンテナは、コンテナベースのアーキテクチャを構成する最も基本的な要素です。これには、実行可能ファイルと依存ファイルを含むコンテナイメージが含まれます。ソフトウェアの動作方法やAmazon GameLift Serversとの連携方法を設定するため、コンテナを定義します。
Amazon GameLift Servers は 2 種類のコンテナを定義します。
-
ゲームサーバーコンテナには、ゲームサーバープロセスを実行し、プレイヤーのゲームセッションをホストするために必要なものがすべて含まれています。これには、ゲームサーバーのビルドと依存ソフトウェアが含まれます。フリートの ゲームサーバーコンテナ用に、1 つの ゲームサーバーコンテナ を定義します。ゲームサーバーコンテナは、コンテナグループの必須として扱われます。
-
サポート用コンテナは、ゲームサーバーをサポートする追加のソフトウェアを実行します。これは「sidecar」コンテナの概念に似ています。これにより、サポートソフトウェアをゲームサーバーと並行して実行・スケールさせつつ、別のコンテナとして管理できます。ゲームサーバーコンテナグループでは、サポートコンテナを 0 個以上定義できます。インスタンス単位のコンテナグループでは、すべてのコンテナがサポート用コンテナです。どの サポート用コンテナ でも、必須 として指定できます。
-
- コンピューティング
コンピューティングは、フリートインスタンス上の ゲームサーバーコンテナグループ のコピーを表します。
一般的なアーキテクチャ
次の図は、最も単純なコンテナフリート構造を示しています。この構造では、フリート内の各インスタンスが ゲームサーバーコンテナグループ の 1 つのコピーを保持します。このコンテナグループには、1 つのゲームサーバープロセスを実行する 1 つの ゲームサーバーコンテナ が含まれます。この例では、コンテナフリートは、インスタンスごとに ゲームサーバーコンテナグループのコピーを 1 つ配置するように構成されています。このアーキテクチャでは、各インスタンスが 1 つのゲームサーバープロセスを実行します。
2 番目の図は、より複雑なコンテナフリートアーキテクチャを示しています。この構造では、フリートに ゲームサーバーコンテナグループとインスタンス単位のコンテナグループの両方が含まれます。ゲームサーバーコンテナグループ には、ゲームサーバープロセス用と サポートプロセス用の個別のコンテナがあります。フリートは、各フリートインスタンスに ゲームサーバーコンテナグループ のコピーを 3 つ配置するよう構成されています。インスタンス単位のコンテナグループは、レプリケートされません。この例では、コンテナフリートは、インスタンスごとに ゲームサーバーコンテナグループ のコピーを 3 つ配置するよう構成されています。このアーキテクチャでは、各インスタンスが 3 つのゲームサーバープロセスを実行します。
主要機能
このセクションでは、Amazon GameLift Servers がいくつかの基本的なコンテナの概念をどのように実装するかをまとめています。コンテナフリートの操作方法については、このガイド内の関連トピックを参照してください。
アクティブなフリートの更新
マネージドコンテナは、ホストされたソフトウェアとコンテナアーキテクチャのライフサイクル管理を支援する高度なサポートを提供します。コンテナイメージを含むコンテナ定義を更新し、既存のフリートに変更をデプロイできます。この機能を利用すると、開発中のコンテナへの変更をより迅速かつ容易に反映できます。また、ソフトウェアバージョンのビルド、デプロイ、および追跡を支援する機能も提供します。これには次の機能が含まれます。
-
コンテナグループ定義の更新とバージョニングを管理します。コンテナイメージや設定を含む、コンテナグループ定義のほぼすべてのプロパティを更新できます。コンテナを更新すると、Amazon GameLift Servers が更新にバージョン番号を自動的に割り当て、デフォルトですべてのバージョンを保持します。任意のバージョンにアクセスでき、必要に応じてバージョンを削除できます。コンテナフリートを作成するときに、デプロイするコンテナグループ定義とバージョンを指定できます。
-
既存のコンテナフリートを、新しいコンテナグループ定義と設定で更新します。フリートインスタンスにデプロイ済みのフリートに、コンテナ更新をデプロイできます。AWS マネジメントコンソール または AWS SDK と CLI を使用して、各フリートロケーションの更新デプロイのステータスを追跡できます。
-
フリートの更新をアクティブなフリートにどのようにデプロイするかを設定します。
-
ゲームセッション保護。アクティブなゲームセッションが終了するまで、そのセッションを実行しているフリートインスタンスを保護すること (安全なデプロイ) を選択できます。または、ゲームセッションの状況に関係なくフリートインスタンスを置き換えること (安全でないデプロイ) を選択できます。開発フェーズやテストフェーズでは、安全でないデプロイを使用してデプロイ時間を短縮できます。
-
最小正常率。デプロイ中に維持したい正常なタスクの割合を指定します。この機能を使用すると、デプロイによって影響を受けるフリートインスタンスの数を決定できます。値を低くするとデプロイの速度が優先され、値を高くするとデプロイ全体を通じてゲームサーバーの可用性が高く維持されます。
-
デプロイの失敗戦略。デプロイが失敗した場合に実行するアクションを決定します。デプロイの失敗は、更新されたコンテナの一部のステータスチェックが失敗し、異常状態と見なされることを意味します。すべてのフリートインスタンスを以前のデプロイ状態に自動的にロールバックするよう、デプロイを設定できます。あるいは、デバッグ用途のために、障害状態のフリートインスタンスの一部を維持することもできます。
-
アクティブなフリートを更新できる機能は、ゲームサーバーソフトウェアに更新をデプロイしたい場合に非常に有用です。ゲームサーバー用に新しいコンテナイメージをビルドした後、デプロイは 2 つのステップで行います。まず、新しいイメージでコンテナグループ定義を更新し、次にコンテナフリートを更新します。Amazon GameLift Serversは必要に応じて残りのタスクを処理します。
コンテナのパッキング
コンテナフリートにデプロイするためのコンテナ構造を開発する場合、共通の目標は、利用可能なコンピューティング能力の使用を最適化することです。この目標を達成するため、各フリートインスタンスに可能な限り多くの ゲームサーバーコンテナグループ をパッキングします。
Amazon GameLift Servers は、次の情報に基づいてインスタンスあたりの最大 ゲームサーバーコンテナグループ 数を計算し、この作業を支援します。
-
フリートのインスタンスタイプと、その vCPU およびメモリリソース。
-
ゲームサーバーコンテナグループ 内のすべてのコンテナに必要となる vCPU とメモリ要件。
インスタンス単位のコンテナグループが存在する場合、そのグループ内のすべてのコンテナに必要となる vCPU とメモリ要件。
コンテナフリートを作成するときは、計算された最大値を使用するか、必要な数を指定できます。ベストプラクティスとして、コンテナ化されたゲームサーバーソフトウェアをテストし、最適なゲームサーバーパフォーマンスに必要なリソース要件を判断する計画を立ててください。
容量スケーリング
フリート容量は、フリートが同時にホストできるゲームセッション数を表します。また、フリートがサポートできる同時プレイヤー数に基づいて容量を算定することもできます。フリートのホスティング容量を増減するには、フリートインスタンスを追加または削除します。
コンテナフリートは、各フリートインスタンスで特定数の同時ゲームサーバープロセスを実行するように構成されています。(これは、(1) インスタンスあたりの ゲームサーバーコンテナグループ 数と、(2) 各コンテナグループで実行されるゲームサーバープロセスの数に基づいて計算できます。) インスタンスあたりの同時ゲームサーバー数は、フリートインスタンスを追加または削除した場合の影響を示します。例えば、コンテナフリートが各 ゲームサーバーコンテナグループ で 1 つのゲームサーバープロセスを実行し、各フリートインスタンスが 100 の ゲームサーバーコンテナグループ を保持している場合、フリートの同時ゲームセッションのホスティング容量は 100 単位で増減します。各ゲームセッションが 10 個のプレイヤースロットを持つ場合、プレイヤーをホストするフリート容量は 1000 単位で増減します。
コンテナフリートでは、Amazon GameLift Servers が提供する任意の容量スケーリング方法を使用できます。これには、以下のものが含まれます。
-
必要なフリートインスタンス数を設定して、フリート容量を手動で設定します。
-
使用可能なインスタンスの希望するバッファをターゲットとして、自動スケーリングを設定します (ターゲット追跡)。この方法は、参加プレイヤーがすぐにゲームに入れるよう、一定量のアイドルホスティングリソースを自動的に維持します。プレイヤーの需要の増減に応じて、このバッファのサイズは継続的に調整されます。
-
カスタムスケーリングルール (高度な機能) を使用して、自動スケーリングを設定します。この方法では、選択したフリートメトリクスに基づいてスケーリングできます。
ゲームクライアント/サーバー接続
Amazon GameLift Servers が管理するフリートでは、ゲームクライアントがクラウドホスト型ゲームサーバーに直接接続します。ゲームクライアントがゲームへの参加をリクエストすると、Amazon GameLift Servers を検索し、接続情報 (IP とポート) をゲームクライアントに提供します。フリートの特定のポート範囲 (インバウンドアクセス許可) を開くことで、フリートインスタンスへの外部アクセスを制御できます。インバウンドアクセス許可は、受信トラフィックに対して開いているポートを決定します。すべてのポートをすばやくシャットダウンしたり、開くポートを数個に制限したり、すべてのポートを開くことができます。
マネージドコンテナフリートには、コンテナで実行されているプロセスへのアクセスを許可する追加の設定が必要です。コンテナ定義を作成する際は、接続を受け付ける各プロセスごとに、使用するポートのセットを指定します。これには、以下が含まれます。
-
ゲームサーバーコンテナで同時に実行されるすべてのゲームサーバープロセス。ゲームセッションに参加するため、ゲームサーバープロセスはゲームクライアントからの接続を受け入れる必要があります。
-
外部ソースが接続する必要があるサポートコンテナ内のプロセス。例えば、テストアプリケーションにリモート接続できます。
内部向けコンテナポートを設定すると、Amazon GameLift Servers はその設定を使用して、ゲームクライアントやその他のアプリケーションが接続できる外部向けインバウンドアクセス許可を算出します。また Amazon GameLift Servers は、インバウンドアクセス許可と、プレイヤーがコンテナ内のゲームセッションへアクセスする際に使用する個々のコンテナポートとのマッピングも管理します。この内部マッピングは、ゲームサーバーがコンテナポートへの直接アクセスから保護されることで、追加のセキュリティレイヤーを提供します。必要に応じて、フリートの外部向けポート設定をカスタマイズできます。コンテナフリートポートを手動で設定する方法の詳細については、「ネットワーク接続を構成する」を参照してください。
コンテナフリートのポート設定はいつでも変更できます。この変更には、フリート更新のデプロイが必要です。
次の図は、コンテナフリート間のポート接続の役割を示しています。図に示すように、個々のコンテナにポートを設定すると、Amazon GameLift Servers がその情報を使用して、各コンテナポートに対応させるために必要な数のポートをフリートインスタンス上に構成します。外部向けインスタンスのインバウンドアクセス許可と、内部向け接続ポートの両方は、手動で設定しない限り、Amazon GameLift Servers によってフリート用に算出されます。
コンテナのログ記録
マネージドコンテナフリートでは、標準出力 (および標準エラー) ストリームがすべてのコンテナでキャプチャされます。これには、ゲームサーバーのゲームセッションログが含まれます。コンテナフリートは、複数のオプションのいずれかを使用して出力ストリームを処理するように設定できます。
-
コンテナ出力を Amazon CloudWatch ログストリームとして保存します。各ログストリームはフリート ID とコンテナを参照します。フリートに対してこのログ記録オプションを選択した場合、フリートからのすべてのログストリームを整理する CloudWatch ロググループを指定します。その後、CloudWatch 機能を使用して、必要に応じてログデータを検索および分析できます。
-
コンテナ出力を Amazon Simple Storage Service (Amazon S3) バケットに保存します。必要に応じて、コンテンツを表示、共有、またはダウンロードできます。
ログ記録をオフにします。このシナリオでは、コンテナ出力は保存されません。
Amazon GameLift Servers は、マネージドコンテナフリートのログデータを、AWS アカウントの CloudWatch または Amazon S3 サービスに送信します。データを表示するには、AWS アカウントにサインインし、AWS マネジメントコンソール または他のツールを使用して、個々のサービスを操作します。コンテナフリートのサービスロールを作成することで、これらのアクションを実行するための制限付きアクセスを Amazon GameLift Servers に付与します。
コンテナフリートのログ記録設定はいつでも変更できます。この変更には、フリート更新のデプロイが必要です。
コンテナフリートと Amazon GameLift Servers エージェント
一般的に使用されるコンテナアーキテクチャは、コンテナごとに 1 つのプロセスを実行します。Amazon GameLift Servers コンテナフリートでは、ゲームサーバーグループに 1 つのゲームさーあーコンテナがあり、そのコンテナで 1 つのゲームサーバープロセスを実行します。このアーキテクチャでは、Amazon GameLift Servers が フリートインスタンス 上の各 ゲームサーバーコンテナグループ 内にある単一の ゲームサーバー プロセスのライフサイクルを管理します。
各 ゲームサーバーコンテナグループで複数の ゲームサーバー プロセスを実行する コンテナアーキテクチャを構築する場合、すべての プロセスのライフサイクルを管理する方法が必要です。これは、必要に応じてプロセスを起動・停止・置き換え、同時に実行するプロセス数を管理し、障害発生時の対処を行うといった作業を含みます。
これらのタスクに Amazon GameLift Servers エージェントを使用することを選択できます。コンテナフリートでは、エージェントが「実行指示 (ランタイム指示)」を処理し、どの実行ファイルを何個起動するかを指定し、起動時のパラメータを渡し、ゲームサーバーの起動ルールを設定します。例えば、ランタイム指示により、本番環境用として 10 個のゲームサーバープロセスを維持し、テスト用として特別な起動パラメータを設定したゲームサーバープロセスを 1 個維持するよう、エージェントに指示できます。
コンテナフリートでエージェントを使用するには、コンテナイメージにエージェントを組み込み、必要なランタイム指示一式を含めます。エージェントの詳細については、「Amazon GameLift Servers エージェントの操作」を参照してください。