Amazon Web Services ブログ

AWS Global Accelerator と Amazon GameLift FleetIQ を活用してプレーヤーエクスペリエンスを向上させる

インターネット経由で世界中のユーザーにサービスを提供するゲームを構築することは困難です。この2つのパートからなるシリーズでは、ゲーム開発者が世界中のプレイヤーエクスペリエンスを向上させ、より効率的に展開し、レイテンシーを短縮し、インゲームのパフォーマンスを向上させ、ゲームコンテンツをより速く配信する方法について説明します。

この最初の投稿では、AWS Global Accelerator を使用して、ゲームプレイやオンラインストアのトラフィックなどの動的コンテンツのパフォーマンスを向上させる方法について説明します。また、AWS Global Accelerator と Amazon GameLift FleetIQ を統合するためのリファレンスアーキテクチャも提示し、マルチプレイヤーゲーム用のクラウドサーバーを簡単にデプロイ、運用、スケーリングします。2番目のブログ記事である、Amazon CloudFront を使用してゲームバイナリやメディアアセットなどの静的コンテンツを配信することについては、近日公開予定です。

AWS Global Accelerator とは何か?

AWS Global Accelerator は、AWS グローバルネットワークインフラストラクチャを活用して、インターネットユーザーのパフォーマンスを最大 60% 向上させるネットワーキングサービスです。オンラインゲームコミュニティを成長させ、維持するには、スムーズで競争力のあるゲーム体験が必要です。AWS Global Accelerator を使用すると、プライベート AWS グローバルネットワークに沿ってプレイヤーのトラフィックをルーティングし、インゲームのレイテンシー、ジッター、パケット損失を減らし、プレイヤーのオンライン体験を向上させます。AWS Global Accelerator を使用して、AWS リージョンでホストされているプレイヤーとサーバー間のトラフィックを加速し、ゲームのグローバルリーチを拡大します。アクセラレーションは、Amazon Lumberyard、Unity、Unreal Engineなどの一般的なエンジンで使用される TCP と UDP ベースのプロトコルの両方でサポートされています。AWS Global Accelerator エッジロケーションでは、AWS Global Accelerator がサポートするリージョンのいずれかのゲームサーバーにプレイヤーのトラフィックがルーティングされるため、ロード時間が短縮され、インゲームのエクスペリエンスの一貫性が向上します。可用性の高い AWS グローバルネットワークでのサービスを中断することなく、ゲームの起動やインゲームイベントなどの大きなトラフィックスパイクを処理できます。

ゲームに AWS Global Accelerator を選択できるいくつかの理由は次のとおりです。

インゲームのパフォーマンスの向上 — プレイヤーのトラフィックはアクセラレータ経由でルーティングされ、パブリックインターネットではなく、専用の輻輳のない冗長な AWS グローバルネットワークを通過します。プレイヤーのトラフィックは、最も近い AWS エッジロケーションを通過し、そこからゲームセッションをホストしているエンドポイントに向かって最適化されたパスを経由してリクエストがルーティングされます。これらのルートとネットワークの最適化により、パケット損失、ジッタ、およびレイテンシーを一貫して低く保ち、パフォーマンスを最大 60% 向上させることができます。

追加のインフラストラクチャをデプロイすることなく、より多くのプレイヤーにリーチする — Global Accelerator は、AWS グローバルネットワークに沿ってプレイヤーのトラフィックを加速することで、ゲームサーバーをホストする AWS リージョンにプレイヤーを近づけます。その結果、世界中のプレイヤーにサービスを提供しながら、より少ない AWS リージョンへゲームフリートのデプロイを行える様に最適化できます。

マッチメイキングサービスとの統合 — マルチプレイヤーゲームの場合、カスタムルーティングアクセラレータを使用して、地理的位置、プレイヤーのスキル、ゲーム構成などの要素に基づいて一致したプレイヤーを、ゲームサーバー上で実行される 1 つのセッションに決定的にルーティングできるようになりました。マッチメイキングサービスから、複数のプレイヤーをアクセラレータ上の固有のポートに誘導することができます。アクセラレータは、ポートを特定の Amazon EC2 の宛先プライベート IP アドレスにマップし、そこにトラフィックをルーティングします。これにより、プレイヤーが接続するアクセラレータの IP アドレスとポートを渡すことで、AWS Global Accelerator とマッチメイキングサービスを簡単に統合できます。

DDoS 攻撃からゲームを保護しやすくする — Global Accelerator は、悪意のある攻撃のリスクを軽減します。データが通過するネットワークの数を減らし、エントリを 2 つの静的 IP アドレスに絞り込むことで、攻撃対象となる仮想的な領域が小さくなります。AWS Shield のデフォルトの保護と組み合わせることで、AWS でホストされるゲームに対する分散型サービス拒否攻撃 (DDoS) によるダウンタイムとレイテンシーが減少します。また、AWS Shield Advanced を有効にして、リソース固有の強化された検出と緩和を自動化できます。また、高度な DDoS 攻撃の手動軽減のために AWS DDoS レスポンスチーム(DRT)に 24 時間 365 日アクセスすることもできます。

Amazon GameLift FleetIQとは何か?

Amazon GameLift は、マルチプレイヤーゲームセッションサーバー向けのサービスで、次の 4 つの主な利点を提供することを目的としています。

  • 低レイテンシー: ゲームサーバーをグローバルに展開し、レイテンシーを最小限に抑えるために、できるだけプレイヤーに近い場所に配置できるようにします。
  • 柔軟性: その時点で実行されているゲームの数や数に関係なく、ゲームサーバーグループをプレイヤー数に応じて拡張できます。
  • 高可用性: アイドル状態の容量を維持することで、新しいサーバの起動を待たずに、新しい需要をすぐに処理できます。
  • 低コスト: EC2 スポットインスタンスの形で余剰容量をゲームセッションサーバーに実用化することで、開発スタジオの費用を節約できます。GameLift を使用すると、既存のオンプレミス展開と比較して最大 70% のコスト削減を実現できます。

AWS は GameLift FleetIQ というサービスに、Amazon EC2 でのクラウドベースのゲームホスティングに低コストの EC2 スポットインスタンスの使用を最適化する機能をリリースしました。GameLift FleetIQ を使用すると、Amazon EC2 および Auto Scaling でホスティングリソースを直接操作しながら、GameLift 最適化を活用して、安価で弾力性のあるゲームホスティングをプレイヤーに提供できます。

まず、FleetIQは、オンプレミスサーバーやコロケーションサーバーと比較して、サーバーコストを削減するのに役立ちます。第二に、技術チームのあるゲームスタジオが、すでに起動されているゲームと FleetiQ を統合することが容易になります。第三に、ゲームサーバーをバーストキャパシティを用いて一時的に、もしくは永続的に FleetIQ に移行することができます。

Amazon GameLift FleetIQ に AWS Global Accelerator を併用してインゲームのパフォーマンスを向上させる

AWS Global Accelerator カスタムルーティングアクセラレータを活用して FleetIQ サーバーグループのトラフィックを高速化することで、ゲームサーバーに接続するプレイヤーのインゲームのラグとジッターを減らすことができます。これにより、ゲームセッショントラフィックは、ネットワークエッジポイント (POP) の Amazon ネットワークの高速ファイバーに送られます。レイテンシーの影響を受けやすいゲームプレイトラフィックをプレイヤーにルーティングするために必要なネットワークホップの数を減らすことで、プレイヤーに優れたゲーム体験を提供できるようになりました。さらに、プレイヤーはネットワークジッターの減少を確認できます。ネットワークジッターとはゲームトラフィックのレイテンシの変動の測定値で、これは、ネットワークホップが減り、移動の長い部分で AWS グローバルネットワークを介してトラフィックがルーティングされるためです。

GameLift FleetiQ で AWS Global Accelerator を使用することは、ローカルバスと同じルートで急行列車を走らせることに似ています。バスには多くの停留所があり、外出先まで行きたい場合は最適ですが、終点まで移動する場合は最寄りの急行駅までバスに乗り、合計所要時間を短くすることができます。

アクセラレータ経由でプレイヤートラフィックをFleetIQで実行しているゲームセッションにルーティングするプロセスでは、セットアップにいくつかの手順が必要です。まず、Amazon GameLift FleetIQ と AWS Global Accelerator でこれを設定する方法を学びましょう。次に、アクセラレータを介してゲームセッションをホストしているゲームサーバーへのプレイヤトラフィックがどのように高速化されるかを説明します。

Amazon GameLift FleetiQ サーバーと AWS Global Accelerator のセットアップ

Architecture diagram described throughout this blog post.

このセクションでは、GameLift FleetIQ でゲームサーバーをホストし、AWS Global Accelerator と統合するためのセットアップについて説明します。セットアップステップは、アーキテクチャ図の青いタグで示されています。

ステップ 1: GameLift FleetiQ ゲームサーバーグループのセットアップ

通常の操作中、GameLift FleetIQはゲームサーバーグループのサーバーを管理します。ゲームサーバーグループ (1) を作成すると、新しい EC2 Auto Scaling Groupが作成され (2)、ゲームサーバー (3) を Auto Scaling Groupに起動できます。FleetIQ は、Auto Scaling Group(4)の動作を制御します。

Auto Scaling Groupは複数のアベイラビリティーゾーン(5)にまたがり、それぞれにサブネット(6)があり、トラフィックをサーバーにルーティングし、クライアントに戻すためのルーティングテーブル(7)があります。

スケーリング機能を管理することで、FleetIQは以下のことが可能になります。

  1. 試合数が増えたときに、要求の前に十分なサーバー容量を確保する
  2. EC2 スポットインスタンスの効率的な利用を確保するために、需要が下がったときにできるだけ早くこれらのサーバーをシャットダウンする

各 Amazon EC2 インスタンスには IP アドレスがあり、各ゲームサーバー(通常、そのインスタンスで実行される OS プロセス)は、ポートをListenしています。ポートは、FleetIQ の登録時に FleetIQ に提供される接続情報でサーバーによって指定されます。ゲームサーバーは、実行されているインスタンス上で使用可能なポートを決定し、リッスン用にポートを開いて登録します。次に、GameLift (10) にポートを登録し、GameLift がサーバーをゲームに割り当てることができるようにします。ゲームクライアントは IP アドレスとポートを知るとすぐにサーバーに直接接続できますが、Amazon Global Accelerator のカスタムルーティングアクセラレータが提供するアクセラレーションの利点を利用しています。AWS Global Accelerator との統合では、EC2 インスタンス上の事前定義されたポートリストでゲームセッションをホストすることをお勧めします。

ステップ 2: カスタムルーティングアクセラレータを作成し、EC2 スポットインスタンスを登録する

ゲームトラフィックがゲームクライアントからアクセラレータに送信されるようにするには、まずカスタムルーティングアクセラレータ (8) を作成し、カスタムルーティングアクセラレータへのエンドポイントとして、フリート内のサーバーを含む各サブネットを追加します。ゲームサーバーが、各 EC2 インスタンスの事前定義されたポートセットでホストされていることを確認します。これらのポートは、アクセラレータでエンドポイントグループを設定するときに設定します(ドキュメントをご参照ください)。カスタムルーティングアクセラレータは、アクセラレータの各リスナーポートから、サブネット内の各 IP アドレスおよび定義済みポート範囲への静的マッピングを作成します。たとえば、次の図では、カスタムルーティングアクセラレータのポート 6 は 10.0.16.0:26 にマッピングされ、ポート 8 は 10.0.16.1:18 にマップされています。したがって、プレイヤーがアクセラレータのポート 6 に接続すると、トラフィックは 10.0.16.0:26 にルーティングされます。

Architecture diagram visualizing Step 2: Create a custom routing accelerator and register your EC2 Spot instances

スケーリングイベント中、サブネットで EC2 スポットインスタンスを起動したら、 AllowCustomRoutingTraffic API を呼び出して、AWS Global Accelerator が EC2 インスタンス内のゲームサーバーにトラフィックをルーティングできるようにします。EC2 インスタンスとポートがトラフィックの受信を許可されていない場合、プレイヤートラフィックはエッジのアクセラレータによってドロップされます。同様に、EC2 インスタンスを終了する前に、 DenyCustomRoutingTraffic API (9) を呼び出すことで、EC2 IP とポートの登録を解除できます。

Amazon GameLift FleetIQ で AWS Global Accelerator を設定したので、アクセラレータを介してプレイヤーがゲームサーバーに接続する方法についてお話しましょう。

プレイヤーのインゲームトラフィックフロー

このセクションでは、プレイヤーが認証を行い、マッチメイキングサービスによって他のプレイヤーとマッチし、最終的にGlobal Accelerator を介してフリートでマルチプレイヤーゲームをホストしているゲームサーバーにルーティングされる方法について説明します。上記のアーキテクチャ図では、ステップはピンクのタグで示されています。

ステップ 1: 認証

プレイヤーがゲームクライアント (またはインストーラー/アップデータ) に接続する方法について見てみましょう。プレイヤーがログインすると、ゲームクライアントにはすでにアイデンティティ(一般的にはSteam ID、PlayStation Network ID、Apple IDなど)があり、ゲームが実行されているプラットフォームによって異なります。ゲームは ID プロバイダー (1) にログインします。通常はゲーム自体の外部にあります。ID プロバイダーはゲームの認証情報を認証し、ゲームに ID トークン (2) を与えます。ゲーム(3)は AWS SDK を使用してトークンをゲームバックエンド(4)に送信します。この設計では、AWS のマネージドアイデンティティサービスである Amazon Cognito を使用してトークンを検証します。Cognito は ID トークンからプレイヤー情報を取得し、身元を確立します。

識別されると、Cognito はセキュアトークンサービス (STS) からプレイヤー (5) の一時的な認証情報を要求し、ゲームに返します。ゲームは認証情報を使用して、アクセスする必要がある AWS リソースの使用をゲームに許可するロールを引き受けます。この場合、マッチメイカーコントローラー (複数の設計のうちの 1 つを持つことができるため、ここでは一般的な計算ユニットとして表されます) と、マッチメイキングの結果をチェックするための Lambda 関数へのアクセスのみを許可します。

ステップ 2: マッチメイキング

ゲームは STS 認証情報を使用して、ゲームのリクエストでマッチメーカーコントローラーを呼び出します (6)。この場合、マッチメーカーコントローラー (7) は、リクエストが有効であることを保証します。たとえば、プレイヤーがまだゲームに入っていないか、プレイヤーが過去 15 分間にゲームを 5 回以上リクエストしなかった場合などです。これにより、ハッキングされたクライアントに対するシステムの耐障害性が高くなります。

リクエストが正規のものであることが満たされると、マッチメイカーコントローラーはリクエストを行った他の互換プレイヤーを検索して、プレイヤーをゲームを見つけます。マッチは最終的に決定されます。

マッチメーカーコントローラーは、FleetIQ ゲームサーバーグループ (9) からゲームセッションサーバー (8) を要求します。ここでマッチがホストされます。FleetIQ は、サーバの実際のアドレスとポート番号を マッチメーカーコントローラーに返します。AWS Global Accelerator を使用しているため、サーバーの IP アドレスとポートをアクセラレータの IP アドレスとポート (10) に変換する必要があります。エンドポイントの登録中に作成されたマッピングは、 ListCustomRoutingPortMappingsByDestination API を呼び出すことによって参照できます。この API は、このゲームセッションで要求されたサーバープロセスにマップされたアクセラレータポートを返します。

ステップ 3: ゲームに複数のプレイヤーをサーバーに接続する

マッチメーカーコントローラーは、Websocket または HTTP/2 経由で接続されたクライアントにサーバー起動メッセージを書き込むことができますが、この設計では、これは実装されていないと仮定し、結果は一時的に DynamoDB テーブルに格納されます (11)。テンポラリデータテーブル (12) のレコードには、有効期間 (TTL) が与えられ、チェックされない場合に 5 分または 10 分後に有効期限が切れます。ゲームは結果の準備ができていると考えて、その後数秒おきに、ゲームはリクエストが処理されたかどうかを確認するために Lambda 関数を呼び出すリクエスト(13)を行います。Lambda 関数は DynamoDB テーブルを読み取り、マッチメイキングの結果を含むレコードを検索します (14)。これらの結果は、接続先の AWS Global Accelerator の IP アドレスとポートとともに、ゲームクライアントに戻されます。

プレイヤーは、アクセラレータ IP アドレスとポート (15) のいずれかを使用して、ゲームセッションに割り当てられた GameLift ゲームサーバーに接続できます。AWS Global Accelerator(16)は、プレイヤーに最も近いエッジロケーション(POP)でリクエストを受け取り、マッピングを使用して適切なサーバーへのトラフィックを高速化します。プレイヤーは全員かなり早く到着し(彼らは同時にマッチングしているので)、ゲームプレイを開始することができます。

TCP または UDP トラフィックは、プレイヤーからサーバーに自由に流れるようになりました(AGAは両方向のトラフィックを加速するため)。これにより、可能な限り低いレイテンシーでゲームを体験できます。これは明らかにプレイヤーを幸せにします! ミッションは成し遂げられました。

このシリーズのパート2である、 Amazon CloudFront を使用して静的コンテンツを配信する方法について を、乞うご期待ください。

 

原文はこちらです。

ソリューションアーキテクト  長田 義広