2022 年 3 月 23 日、GDC にてAWS GameKitが発表され、UnrealEngine 用のプラグインがリリースされました。
AWS には Web サービスや、モバイルアプリなどのバックエンドとして使用できる多数のオンラインサービスが提供されていますが、 実際に使うにはそれなりに各サービスの仕様や API に習熟した上で自分で組み合わせる必要があります。 使ってみるととても便利なのですが、誰にでも簡単に…とは言い辛いのもまた確かでした。
ゲームでよく使われるオンラインサービスはユーザー認証、アイテムやゲーム内通貨の管理、プレイ記録、プレイヤーデータのクラウド保存、実績など ある程度限られており、ゲーム用のオンラインサービスに特化したサービスを提供する会社も多数あります。 AWS GameKit はそのオンラインサービスを開発者自身の AWS アカウント上で構築することができる開発キットです。 AWS 上に構築する以上、運用費は AWS アカウントに請求が来ることになりますが、他社が提供するゲーム用オンラインサービスを使うより費用は割安になることが期待されます。 (※具体的に比較した訳ではないです)
この記事では、AWS GameKit for UnrealEngine プラグインを使い、identity(ユーザー認証)のサンプルを使って実際に構築した様子を解説します。 すでに AWS の各サービスを使っている方から見ると何でもない内容ですが、これから AWS アカウントを作って試そうと考えている方には このサンプルを使うと何が起きるのか多少は把握できるようになると思います。
UE4 プロジェクトの作成
まずはプラグインを組み込んだ UE4 プロジェクトを作成します。ざっくりとした手順は以下のようになります。
- UE4 を起動し、適当なテンプレートでプロジェクトを作成します。(プロジェクト名を TestAwsGameKit とします)
- ファイルメニューから C++ファイルを追加し、C++プロジェクトにします。
- UE4 エディタをいったん終了し、プロジェクトのフォルダに Plugins フォルダを作成し、AWS GameKit のページから
AwsGameKitUnrealPlugin_Windows_v1.0.0.zip
を展開して作成される AwsGameKit をフォルダを Plugins フォルダの下にコピーします。 - TestAwsGameKit.uproject ファイルを選択して右クリックメメニューから Generate VisualStudio Project を実行します。
- TestAwsGameKit.sln ファイルをダブルクリックして VisualStudio を起動し、TestAwsGameKit を選択した状態で右クリックメニューからリビルドを実行します。
- ビルドが完了すると、VisualStudio を終了し UE4 エディタを起動します。
AwsGameKit プロジェクト作成
プラグインが使用できる状態になると、プロジェクト設定に AWS GameKit のカテゴリが出てきます。 Game title・Region を設定し、事前に作成しておいた IAM の AccessKey・SecretKey を入力、Submit をクリックします。
![Project設定からAwsGameKitプロジェクト作成](/assets/blog/ue4-aws-gamekit/01_ProjectSettingsCreateProject-caption.png)
続いて Identity And Authentication の項目までスクロールし、Create をクリックします。
![Project設定のログインサーバ作成画面](/assets/blog/ue4-aws-gamekit/02_ProjectSettingsIdentity-caption.png)
使用状況に応じて課金が発生する可能性があるため警告が表示されますが、 構築自体に料金はかかりませんし、お試し程度の使用であれば無料枠に収まるため料金はほとんどかかりません。 ここは Deploy をクリックします。
![課金が発生するかも警告](/assets/blog/ue4-aws-gamekit/03_AwsCostDialog-caption.png)
![Project設定のログインサーバ作成済み](/assets/blog/ue4-aws-gamekit/04_ProjectSettingsIdentityDeployed.png)
ユーザー認証サンプルの実行
UE4 プロジェクトにあるプラグインのサンプルを実行してみましょう。
コンテンツブラウザから
AwsGameKit Content
のフォルダを開き、BP_AwsGameKitIdentityExamples
をレベルにドラッグ&ドロップします。
(AwsGameKit Content
フォルダがない場合は、View Options から表示されるメニュー内の Show Plugin Contents にチェックを入れましょう)
![UE4コンテンツブラウザのプラグインアセット](/assets/blog/ue4-aws-gamekit/05_PluginContents.png)
Play In Editor 実行すると、サンプル UI が表示されます。
![PlayInEditor実行](/assets/blog/ue4-aws-gamekit/06_PlayInEditor.png)
Register から新たにユーザーを作成します。ユーザー名、メールアドレス、パスワードを入力して Call API をクリックして下さい。
![新規ユーザー登録](/assets/blog/ue4-aws-gamekit/07_Register.png)
この時 AWS の Cognito 管理コンソールを見てみると、ユーザーが登録されていることがわかりますが、未検証になっています。 これはメールアドレスが実在するか確認する手続きが終わってない状態なので、このままではログインすることはできません。
![Cognitoユーザー未検証](/assets/blog/ue4-aws-gamekit/07_CognitoUserPool_NotVerified.png)
Register の時に入力したメールアドレスにメールが届いているはずなので、そちらに書いてある確認コードを入力します。 検証が完了すると成功のステータスが返ってきます。
![ログインメール確認成功](/assets/blog/ue4-aws-gamekit/07_Confirm_Success.png)
Cognito 管理コンソールでも検証済みになっている事がわかります。
![Cognitoユーザー検証済](/assets/blog/ue4-aws-gamekit/07_CognitoUserPool_Verified.png)
早速ログインしてみましょう。
![ログイン成功](/assets/blog/ue4-aws-gamekit/08_Login_Success.png)
ログイン中に GetUser の API を実行すると、ユーザー情報が表示されます。
![ログイン中のユーザー情報取得](/assets/blog/ue4-aws-gamekit/09_GetUser.png)
ログインしていない時はどうなるでしょうか。Logout 実行後、GetUser を実行するとエラーが表示されます。
![ユーザー情報取得失敗](/assets/blog/ue4-aws-gamekit/09_GetUserFailed.png)
Developer Log を開くと、ログインしていないというエラーが返ってきている事がわかります。
![ユーザー情報取得失敗時のログ](/assets/blog/ue4-aws-gamekit/09_GetUserFailedLog.png)
作成された AWS サービス
作成される AWS サービスは多岐にわたります。その一部を見てみましょう。
ユーザー情報を取得する GetUser という API のエンドポイントです。 実際の処理は Lambda で行なわれますが、外部から呼べる REST API にするために必要になります。
![ApiGatewayのエンドポイント](/assets/blog/ue4-aws-gamekit/04_APIGateWay.png)
APIGateWay は無制限に呼び出されると費用がかかるため、この GetUser は Cognito でユーザー認証済みの時のみアクセスできるよう制限がかかっています。
![ApiGatewayの認証](/assets/blog/ue4-aws-gamekit/04_APIGateWay_Authorizer.png)
API の使用状況を監視する CloudWatch ダッシュボードです。
![CloudWatchダッシュボード](/assets/blog/ue4-aws-gamekit/04_CloudWatchDashBoard.png)
ユーザー認証を行う Cognito ユーザープールです。
![Cognitoユーザープール](/assets/blog/ue4-aws-gamekit/04_CognitoUserPool.png)
認証済みのユーザーに AWS サービスの使用を許可する権限する Identitiy プールです。
![CognitoIdentityプール](/assets/blog/ue4-aws-gamekit/04_CognitoIdentityPool.png)
ユーザー情報を保存する DynamoDB です。
![DynamoDB](/assets/blog/ue4-aws-gamekit/04_DynamoDB.png)
Cognito の API を呼び出した時、また GetUser を呼び出した時に実行される処理を登録しておく Lambda です。
![Lambda関数](/assets/blog/ue4-aws-gamekit/04_Lambda.png)
Lambda で実行するスクリプトは Python で書かれていますが、実行に必要なライブラリ環境を Lambda レイヤーという仕組で登録しています。
![LambdaLayer](/assets/blog/ue4-aws-gamekit/04_LambdaLayer.png)
これらのサービスは CloudFormation で自動構築されますが、その設定ファイルや、Lambda で実行するスクリプトや実行に必要なレイヤーはいったんクラウドストレージ S3 にアップロードされます。
![S3](/assets/blog/ue4-aws-gamekit/04_S3.png)
まとめ
UE4 からボタン一発でユーザー登録からメールアドレス確認、認証までの一通りの処理を行うログインサーバの構築ができることがわかりました。
自分の用途に合わせてカスタマイズしていくには… Plugins/AwsGameKit/ResourcescloudResources
の下に
CloudFormation などのバックエンドの設定ファイル・スクリプトがありますので、そこを修正していくことになると思います。
分量がかなりあるので読むだけでげんなりしますが、逆に AWS を使っている身にとってきちんと設計された
バックエンド構築例の設定ファイルやソースコードとしてとても参考になるのではないかと思います。