Lambda@Edgeを使用してカスタムゲームコンテンツをプレーヤーに配信する方法

はじめに

AWS の「 Amazon Game Tech 」公式ブログで、ゲームコンテンツをいかにすればネット遅延なく、配信できるのか?という記事をご紹介します!
image.png

AWS を利用して構築されている某モバイルゲームなどをよくプレイしていると、画質は綺麗だし動きもまるでコンシューマーゲームと変わらないようなクオリティでプレイできます。
誰かがゲームをプレイするたびに、データがチェックされてダウンロードされています。
プレーヤーの場所に関係なく、どのようにして超高速配信を確実にしているのか、という疑問を説明していきます。

超高速配信の為に何をすべきか?

この問題には、 AWS のさまざまな解決策があります!
ほとんどは着信要求を調べ、プレイヤーのリクエストをみて、提供するどのファイルをレスポンスで返すかを決めるコードを実行する web 機能を実装します。

ただし、「電光石火の速さ」を必要とすることは少し問題があります。
プレイヤーが世界中にいる場合、ファイルが海中を走っているネット回線を介してダウンロードされているため、ゲームが読み込まれるのを待つ必要がないようにするにはどうすればよいか?
そのデータは CDN(コンテンツ配信ネットワーク)上にある必要があります。

コンテンツ配信システム

CDN

  • 世界中の複数のサーバーがコンテンツを配信するシステム
  • 「マスター」サーバーにチェックインすることで、常に最新のファイルを保持
  • 世界中にサーバーがあるので、サーバーがプレイヤーの近くにある可能性が高く、ダウンロードがはるかに高速になる

しかし、CDN だけでは問題は解決しません。
1つのURLがヒットしているため、実際に送信するファイルを決定するコードが必要です。
CDN でコードを実行することはできません。

Amazon CloudFront について

AWSは、Amazon CloudFront と呼ばれる、高速で安全性の高いコンテンツ配信ネットワーク(CDN)を提供しています。
CloudFront には、この問題の解決に役立つ 「Lambda@Edge」 と呼ばれる機能があります。
2020-04-07_15h35_14.png

AWS Lambda

サーバーをプロビジョニングまたは管理せずにコードを実行できるサービスです。
Lambda@Edge は、このサーバーレスなテクノロジーを CloudFront にもたらします。

Lambda@Edge 関数

  • プレーヤーにコンテンツを提供している近くの同じサーバーで実行される
  • データを取得するときに CloudFront がプレーヤーに送信するものを決定でき、コンテンツを送信する前に、追加の待機時間が起きるのを防ぐ
  • Lambda@Edge にはトリガーのタイプに関する制限があり(すべてCloudFrontを中心)、許可される実行時間が短いが、静的な CDN にはないレベルの実用性が CloudFront に追加される

オリジンとエッジの関係

まず「オリジンサーバー」と「エッジサーバー」とは何なんだと。

「オリジンサーバー」

  • ファイルの作成元であり、ファイルの最新バージョンが存在する場所
  • CloudFront にデータを取得するために、すべてのサーバーにデータをプッシュする必要がなく、代わりにオリジンサーバーにデータを配置する

「エッジサーバー」

  • プレーヤーにデータを提供する、複数のリージョン(地域)のすべてのサーバー
  • プレーヤーに送信する前に、常に元のサーバー(オリジン)に新しいデータがあるかどうかを確認し、そのデータもキャッシュする
  • データはプレーヤーのために常に準備されており、再びオリジンからそれを取得する必要がない

これが高速な理由です。

遠くから投げられたボールをキャッチするよりも、近くのボールをキャッチするほうが断然早いですよね。
デフォルトでは、キャッシュは24時間残りますが、必要に応じてキャッシュを長くしたり短くしたりできます。

所感

よく海外のWEBページの観覧や、ゲームをやっているとなかなか通信が重かったりします。
それは直接遠くにあるオリジンサーバーにアクセスして、大量の負荷がかかり、キャッシュより重いデータメモリにアクセスしているからなんだなと知ることができました。
CloudFront があるだけで、アクセス遅延によるユーザー離れも免れます。

公式サイトリンク

Amazon Game Techブログ
Lambda@Edge