デベロッパーのよくある質問
注釈:本資料はAI技術を用いて翻訳されています。
この記事では、AccelByte Gaming Services (AGS) を使用してゲームを構築する際によく寄せられるデベロッパーからの質問と回答を紹介します。
Admin Portal
-
自分のネームスペース内のすべてのプレイヤーを表示するにはどうすればよいですか。
Admin Task > Admin Management に移動し、Search User の項目を by Creation Date に変更します。次に、日付をネームスペースが作成される前の時点に設定してください。
-
他のユーザーを Admin Portal に追加するにはどうすればよいですか。
AGS Admin Portal のスーパー管理者であれば、パブリッシャーネームスペースに移動し、Admin Task > Admin Management に進みます。そこで招待するユーザーのメールアドレスを入力し、スーパー管理者、ゲーム管理者、またはその他の利用可能なロールとして設定してください。
-
フルフィルメントとエンタイトルメント付与の違いは何ですか。
フルフィルメントは実際にはエンタイトルメントの付与を呼び出しますが、主な違いは、フルフィルメントの場合は Admin Portal のフルフィルメントタブにトランザクション情報が記録される点です。これにより、あなたとチームが付与されたすべてのエンタイトルメントを追跡できます。
-
Access Logs Viewer とは何ですか。
Access Logs Viewer は、バックエンドに対して行われた API 呼び出しを確認できる Admin Portal に組み込まれたツールです。Trace ID、User ID、Response Status Code など、多くの項目でフィルタリングできます。これらのフィルターは組み合わせて使用することもできます。Admin Portal で Development Utilities > Access Logs に移動することでアクセスできます。
-
サーバーイメージをアップロードする際、アップロードの進行状況や残り時間を確認できますか。
現時点では、サーバーイメージのアップロード進行状況や残り時間を確認する機能はありません。ビルドのステータスのみ確認できます。
-
ユーザーがロビーから切断すると、プレゼンスの在席状況はすぐにオフラインに変わりますか。
はい、Admin Portal のロビー設定で
keepPresenceActivityOnDisconnectが有効になっている場合を除き、すぐにリセットされます。
AGS のアーキテクチャと動作
-
サービスがアクセストークンの取得または更新に失敗した場合、期待される動作は何ですか。サービスを終了させて Kubernetes に再起動させるべきですか、それともリトライを続けるべきですか。
サービス側にエラーをスローする前に、少なくとも 1 回はリトライすることを推奨します。
-
AGS OSS は Blueprint をサポートしていますか。
設計上、AGS OSS は Blueprint をサポートしていません。Blueprint で OSS を使用するには、プラグインを使用したり、独自のラッパーを作成したりするなどのカスタム設定が必要です。
-
ロビー通知がクライアントに正常に送信されたかどうかを確認する方法はありますか。
Service Logs を確認することで、ロビー通知が正常に送信されたかどうかを確認できます。成功通知は "info" ログが利用可能な場合にのみ記録されます。ただし、対象ユーザーがオフラインの場合はこれに該当しません。
-
プレイヤーが持てるフレンドの数に上限はありますか。
現在、プレイヤーが持てるフレンドの数に制限はありません。
-
クラウドベースのバックエンドシステムについては初心者です。用語の説明はどこで確認できますか。
用語集 には、AGS やオンラインゲームでよく使われる用語とその定義がまとめられています。定義してほしい用語がさらにあれば、AccelByte にお問い合わせください。
API エンドポイント
-
すべてのプレイヤーレポートをクエリするための Admin API は何ですか。また、この呼び出しを行うために OAuth クライアントに必要な権限は何ですか。
クエリが Ticket ベースか Report ベースかによって、2 つのエンドポイントがあります。
Ticket ベースでクエリする場合:
GET /reporting/v1/admin/namespaces/{namespace}/ticketsReport ベースでクエリする場合:
GET /reporting/v1/admin/namespaces/{namespace}/reports必要な権限は以下の通りです。
Permission: ADMIN:NAMESPACE:{namespace}:TICKET [READ]Ticket は単一の報告対象を表すモデルであることに注意してください。ステータスを持ち、オープンかクローズかを示します。新しい報告対象に対して Ticket が作成されます。同じ対象に対する後続のレポートは、その対象に対するオープンな Ticket がない場合を除き、同じ Ticket を使用します。
Report は、単一の対象に対してユーザーが送信したレポートです。Category はレポートがどの機能に関するものかを定義します(例: Chat、Matchmaking、UGC など)。Object は報告されている対象の種類を定義し(例: user または content)、object ID レコードがその一意の ID となります。
-
API 呼び出し
queryUserIAPOrdersは Admin Portal の機能やメニューから呼び出されますか。いいえ、呼び出されません。
-
API コマンドを呼び出したりログインを試みたりする際に、次の警告が表示されます:
LogAccelByte: INVALID RSP HTTP。これは何を意味し、どのように対処すればよいですか。このエラーは通常、HTTP 400 エラーレスポンスとともに発生し、API 呼び出しの形式が不正であることを示します。Unreal Engine の場合、これは呼び出している API コマンドの形式に問題がある可能性が高いことを意味します。API 呼び出し URL にダブルスラッシュ (
//) が含まれていないこと、およびdefaultEngine.iniが正しく設定されていることを確認してください。BaseUrl の末尾にスラッシュがないことに注意しながら、以下の例のように設定します。[/Script/AccelByteUe4Sdk.AccelByteSettings]
ClientId=<client_id>
ClientSecret=
Namespace=<namespace>
PublisherNamespace=<publisher_namespace>
RedirectURI="http://127.0.0.1"
BaseUrl=<base_url>
AppId=<app_id>
[/Script/AccelByteUe4Sdk.AccelByteServerSettings]
ClientId=<client_id>
ClientSecret=<client_secret>
Namespace=<namespace>
PublisherNamespace=<publisher_namespace>
RedirectURI="http://127.0.0.1"" -
現在のフルアカウントからヘッドレスアカウントにリンクされている場合、
Getconflict の結果で返されるlinkedGamesパラメータは何を示しますか。linkedGamesパラメータはゲームのネームスペースを返します。 -
現在のフルアカウントからヘッドレスアカウントにリンクされている場合、
oneTimeLinkCodeパラメータは何を返しますか。oneTimeLinkCodeパラメータはゲームのネームスペースを返します。 -
上限が 2,000 の
queryパラメータをプレイヤーのフレンドに対して使用する場合、プレイヤーが 64 人以上のフレンドを持っているとオーバーロードしますか。はい、各プレイヤー ID には 32 文字が必要なため、上限は約 64 個の ID となります。回避策としては、フレンド ID の数を制限するか、複数回のリクエストに分けることが挙げられます。
-
エンタイトルメントを一括で付与または取り消すことはできますか。
Admin Portal と API のどちらでも、複数のエンタイトルメントを一括で付与・取り消しできます。Commerce > User Entitlements に移動して Entitlements の設定を確認してください。API 呼び出しは
grantUserEntitlementおよびrevokeUserEntitlementsです。
認証と認可
-
IAM サービスと Steam を使用した認証について、
steamopenidに関する情報はどこで確認できますか。Steam の Web サイトにある User Authentication and Ownership を参照してください。
-
ユーザーが未確認のメールアドレスを持っている場合、メールとパスワードでログインしてアクセストークンを取得できますか。
はい、取得できます。
-
未確認のメールアドレスを持つユーザーが取得したアクセストークンは、他のサービスへのアクセスに使用できますか。
はい、使用できます。
-
ユーザーの国を、例えばユーザーの IP アドレスから自動入力する機能はありますか。
これは現在、サードパーティログインの機能であり、ユーザー名とパスワードによるログインにはありません。サードパーティログインの場合、国のフィールドが空であれば、IAM が IP アドレスに基づいてユーザーの国を自動的に設定します。
専用サーバー
-
専用サーバーが作成されません。何が間違っている可能性がありますか。
考えられる原因の 1 つは設定です。Admin Portal の Dedicated Server Management > Configurations で、デプロイメントの最大数が 0 に設定されていないかを確認してください。次に、Pod の設定を確認してください。
Pod の設定が少なすぎると、サーバー用のリソースが不足します。多すぎると、サーバーを実行している仮想マシンがそれを実行できなくなります。通常、AGS が使用する仮想マシンは 5GHz の CPU と 8GB のメモリ(AWS EC2 インスタンス m5a.large)を持っているため、これらの仕様を念頭に Pod の設定を調整してください。
場合によっては、特に本番環境向けに、より高性能な EC2 インスタンスを会社側で要求することもあります。その方法については、組織または AccelByte の担当者にお問い合わせください。
-
サーバーの作成中またはユーザーが参加している実行中に、サーバーが終了してしまうようです。これは一定時間経過後によく発生します。何が問題である可能性がありますか。
これはタイムアウトが原因である可能性が高いです。作成タイムアウトとセッションタイムアウトが適切に設定されていることを確認してください。タイムアウトは、専用サーバービルダーや専用サーバー自体が問題発生時に無期限に実行され続けないようにするために必要です。作成タイムアウトについては、少なくとも 300 秒(5 分)を推奨します。新しいサーバーイメージがアップロードされた場合、ビルダーと仮想マシンがサーバーイメージをダウンロードしてキャッシュするのに時間がかかります。セッションタイムアウトについては、ゲームセッションが通常終了するまでにかかる時間の少なくとも 2 倍を推奨します。
エラーと例外
-
ロビーサーバーにアクセスした際にエラーコードが返されました。そのコードに対応する説明はどこで確認できますか。
Lobby Error Codes のエラー一覧を検索してください。
-
エラーコード 401
invalid_clientは何を意味しますか。このエラーは、Client ID または Client Secret が正しくないことが原因です。使用しているネームスペースに対応する正しい Client ID と Client Secret を使用していることを確認してください。
-
IAM クライアントトークンを作成しようとした際に表示される
unable to grant client tokenというエラーメッセージは何を意味しますか。このエラーは、IAM クライアントの 間違ったシークレット を使用していることが原因です。詳細については、アプリケーションのアクセス制御を管理するのガイドを参照してください。
-
Docker file pushed to registry but unable to update DSM config. Please contact the Administratorというエラーメッセージは何を指していますか。このエラーコードは、DS Uploader のバージョンと Environment のバージョンが一致していないことが原因です。Admin Portal から DS Uploader の最新バージョンをダウンロードすることで、このエラーが発生しなくなります。
-
エラーコード 720743
unable to create image patch, invalid request: patch version is emptyは何を指していますか。このエラーコードは、DS Uploader のバージョンと Environment のバージョンが一致していないことが原因です。Admin Portal から DS Uploader の最新バージョンをダウンロードすることで、このエラーが発生しなくなります。
-
"conflict image version" error=conflictというエラーメッセージは何を意味しますか。このエラーは、アップロードしようとしている新しいイメージのバージョンが既に存在することを意味します。同じバージョンを維持したい場合は、コマンドに
--patchフラグを追加できます。それ以外の場合は、アップロードコマンドのバージョンを変更する必要があります。 -
エラーコード 20013
access forbidden: insufficient permissionsは何を意味しますか。このエラーは、特定の API を呼び出す際に権限が正しく設定されていないことが原因です。
-
PS4 および/または PS5 用の PlayStation Login を設定しましたが、ログインしようとすると次のエラーが表示されます:
"unable to exchange auth code: unable to unmarshal error response: invalid character '<' looking for beginning of value"。これはどのように解決すればよいですか。<は<を表す数値コードであり、これはレスポンスとして HTML ページが返されていることを意味します。通常、このページは Sony の環境への未承認アクセスを示しています。アクセスを許可されるためには、以下の手順で自分の環境をホワイトリストに登録する必要があります。-
ホワイトリスト登録のため、環境の IAM サービスの静的 IP アドレスについて AccelByte にリクエストを送信します。
-
アクセスしようとしている Sony の環境を特定します(例:
sp-intまたはprod-qa)。 -
所属組織の PlayStation Partners サポートページにアクセスします。
-
ホワイトリスト登録が必要な環境で提供された IP アドレスをホワイトリストに登録するための一般サポートリクエストを送信し、PlayStation が示すプロセスに従ってください。
-
-
publicBulkClaimUserRewardsエンドポイントがエラーメッセージ49124 Manual claim not supportedを返す場合、どうすればよいですか。このエンドポイントは、
Automaticallyclaim reward の設定に基づいてレスポンスを返します。この設定が有効になっている場合、手動で受け取ることができず、エンドポイントは 49124 エラーメッセージを返します。 -
ゲームネームスペースからパブリッシャー(またはスタジオ)ネームスペースにゲームアイテムを複製しようとすると、
Default Region is requiredというエラーが発生します。両方のネームスペースは既に同じリージョンと言語の設定を持っています。何が問題ですか。ゲームネームスペース内で対象アイテムのリージョン価格が既に設定されていることを確認してください。これにより、パブリッシャーネームスペースは、アイテムを複製する際にどのベース価格を参照すればよいかを把握できます。これを行うには、Stores に移動し、対象アイテムの詳細を開き、Pricing パネルで Add New をクリックしてください。
AGS SDK による HTTP エラーの自動リトライ
AGS SDK は、次のエラーコードに対して自動リトライをサポートしています。
- 429 (Too Many Requests)
- 449 (Retry With)
- 500 (Server Error)
- 502 (Bad Gateway)
- 503 (Service Unavailable)
- 504 (Gateway Timeout)
リトライは指数バックオフ戦略を使用して行われ、試行ごとに待機時間が指数的に増加し、最大で 60 秒のタイムアウトまで続きます。
機能リクエスト
-
リージョンごとのチャットルームをサポートする予定はありますか。
現時点では、リージョン固有のチャットルームのサポートを開発する予定はありません。
インシデントリカバリー
-
AccelByte Multiplayer Servers (AMS) を設定している際、コードにバグが発生し、V2 セッションがスタックしてしまいました。これにより、セッションを検索する関数が壊れてしまいます。セッションを削除してクリーンアップしようとしましたが、セッションをローカルで削除できないというエラーが表示されました。テストを再開するために、スタックした V2 セッションを削除するにはどうすればよいですか。
自分が参加しているすべてのセッションをクエリし、ゲームの起動時にそれぞれに対して
LeaveRestoredSessionを呼び出してください。ユーザー数が 0 になるとセッションが削除されるため、DestroySessionを呼び出すべきではありません。
Player Portal
-
AccelByte Player Portal を、例えば顧客独自のバナーなどでリブランディングすることは可能ですか。
はい、可能です。ただし現時点では、これは AccelByte に問い合わせて対応してもらう必要があります。Player Portal の UI エディターは、将来のリリースに向けたロードマップに含まれています。
ロールと権限
-
Admin Portal でユーザーに通貨を付与できるようにするロールに必要な権限は何ですか。
必要な権限は以下の通りです。
resource="ADMIN:NAMESPACE:{namespace}:USER:{userId}:WALLET", action=4 (UPDATE) -
必要な権限をどのように判断すればよいですか。
権限は、使用しようとしている API エンドポイントによって異なります。
使用したい API について API エンドポイント の一覧を確認し、各呼び出しに必要な権限を確認してください。
備考- API が Public の場合、理想的には ユーザーロール を通じて Regular Player に権限が必要です。
- API が Admin の場合、ユーザーロール を通じて Admin User に権限が必要か、または IAM/OAuth クライアント を通じてゲームサーバーに権限が必要です。
-
ユーザーにはどのようなロールを設定すればよいですか。
- AGS Public Cloud
- AGS Private Cloud
デフォルトでは、Studio Admin ロールと Game Admin ロールの使用を推奨します。Studio Admin ロールは、スタジオ内のすべてのネームスペースに対する完全な管理者アクセス権をユーザーに提供し、開発リードに適しています。Game Admin は、割り当てられたネームスペースに対して完全な管理者アクセス権を持ちますが、Studio Admin のようなスタジオ全体へのアクセスが必要なものは含まれません。
Public Cloud で利用可能なロールについて詳しくは、ユーザーロール セクションを参照してください。
デフォルトでは、Super Admin ロールと Game Admin ロールの使用を推奨します。Super Admin ロールは、すべてのネームスペースに対する完全な管理者アクセス権をユーザーに提供し、開発リードに適しています。Game Admin は、割り当てられたネームスペースに対して完全な管理者アクセス権を持ちますが、Super Admin のような環境全体へのアクセスが必要なものは含まれません。ローンチが近づいたら、モデレーターや非開発者向けにカスタムロールを作成することを検討するとよいでしょう。
Private Cloud で利用可能なロールについて詳しくは、ユーザーロール セクションを参照してください。
-
ユーザーにロールを付与するにはどうすればよいですか。
Admin Portal で対象ユーザーのプロフィールに移動し、Roles タブをクリックして Add Role を選択することで、特定のユーザーにロールを付与できます。
-
自分のプレイヤーが他のプレイヤーの統計情報を閲覧するための View アクセス権を持つことはできますか。
はい、デフォルトでは、すべてのユーザーロールには以下に示す権限が付与されています。
"Action": 2は Read アクセスを意味するため、プレイヤーには自動的に View 権限が付与されます。"Resource": "NAMESPACE:{namespace}:USER:*:STATITEM", "Action": 2
セキュリティ
-
dsm-controller には Cross-Origin Resource Sharing (CORS) のホワイトリスト機能がありますか。
CORS のホワイトリストとは、サーバーが特定の指定されたオリジンからのリソース読み込みを許可できるようにする仕組みです。これは AccelByte の dsm-controller によってサポートされています。
-
不審なアクティビティが発生した際に、指定したユーザーにメール通知を送信する仕組みはありますか。
現在、この通知はすべてのユーザーに送信され、特定のユーザーグループに対して設定することはできません。
テスト
-
プレイテスト用に複数の App ID を持っている場合、どうすればよいですか。
この問題に対処する方法は 2 つあります。
-
このプレイテストに参加するユーザーの進行状況やエンタイトルメントを引き継ぎたい場合は、既に使用しているネームスペース内で App ID を入れ替えるのが最善です。
-
このプレイテストのためだけにユーザーの進行状況やエンタイトルメントを分離しておきたい場合は、新しいネームスペースを作成し、すべての設定をインポートするとともに、プレイテスト用の新しい App ID を設定してください。これにより、すべてのデータが他のネームスペースとは分離された状態に保たれます。
-
-
Nomad からログを取得するにはどうすればよいですか。
Commands: alloc logs を参照してください。
二要素認証
-
バックアップコードはどこで取得できますか。
バックアップコード方式を使用して二要素認証 (2FA) を初めて設定した際に、バックアップコード を受け取っています。
-
バックアップコードを失った場合はどうすればよいですか。
認証アプリを使用して 2FA を設定している場合は、ログインメニューに戻り、認証アプリを使用して認証できます。ログイン後、Password & Security に移動し、バックアップコード を再生成して、安全な場所に保管してください。
-
セキュリティコードはどこで取得できますか。
認証アプリを開き、ログイン画面で求められたら セキュリティコード を入力してください。
-
セキュリティコードが無効な場合はどうすればよいですか。
セキュリティコードを再確認し、認証アプリをインストールしているスマートフォンの日付と時刻が、お使いのコンピューターの日付と時刻と同期していることを確認してください。セキュリティコードが失敗し続ける場合は、バックアップコード を使用してログインしてみてください。これらの手順でも解決しない場合は、サポートチームにお問い合わせください。
Web 開発における CORS (Cross-Origin Resource Sharing) の扱い
CORS は、異なるオリジン(ドメイン)からの Web リクエストをブロックまたは制限するセキュリティ機能です。セキュリティ上重要な機能ですが、ローカルで Web アプリを開発する際には煩わしく感じることがあります。ここでは、CORS を管理または回避する方法をいくつか紹介します。
サーバー側で許可リストを設定する
AGS Private Cloud のお客様であれば、Web ドメインを弊社の許可リストに追加するようリクエストできます。注: この機能は現時点では AGS Public Cloud では利用できません。
サーバーへのアクセス権がある場合は、特定のオリジンからのリクエストを受け入れるようにサーバーを設定してください。例えば、http://localhost:3030 や http://example.com からのリクエストを許可することができます。
ブラウザの機能や拡張機能を使用する(推奨されません)
ブラウザの設定や拡張機能を使用して CORS を回避することもできますが、この方法にはリスクがあります。Chrome での例を以下に示します。
chrome.exe --disable-web-security --disable-gpu --user-data-dir="[directory]"
これにより Chrome のウェブセキュリティが無効になり、すべてのリクエストが CORS を回避し、クッキーがドメインをまたいで維持されるようになります。このアプローチはセキュリティと安定性を損なうため、推奨しません。
また、ブラウザの拡張機能をプロキシとして使用し、リクエストを対象のサーバーに転送する方法もありますが、これも本番環境やユーザー向けのシナリオでは安全ではありません。
ローカルプロキシを使用する(開発者に推奨)
ローカルプロキシの設定は、JavaScript 開発において安全で効果的な方法です。設定方法は以下の通りです。
方法 1: Vite の組み込みプロキシを使用する
Vite では、プロキシを設定するための簡単な方法が提供されています。
export default defineConfig({
server: {
port: 3000,
proxy: {
'/api': {
target: 'http://example.com',
changeOrigin: true,
cookieDomainRewrite: 'localhost',
configure(proxy) {
proxy.on('proxyReq', req => {
req.setHeader('Referer', 'https://example.com')
})
},
rewrite: path => {
return path.replace(/^\/api/, '')
}
}
},
},
})
説明:
http://localhost:3000/api/test-routeへのリクエストはhttps://example.com/test-routeに転送されます。- プロキシがオリジンを変更し、Referer ヘッダーを設定します。
- レスポンスに含まれるクッキーは、元のドメインではなく localhost を使用するように書き換えられます。
方法 2: Express で http-proxy-middleware を使用する
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const apiProxy = createProxyMiddleware({
target: 'http://example.com',
changeOrigin: true,
cookieDomainRewrite: 'localhost',
configure(proxy) {
proxy.on('proxyReq', req => {
req.setHeader('Referer', 'https://example.com')
})
},
rewrite: path => {
return path.replace(/^\/api/, '')
}
});
const app = express();
app.use('/api', apiProxy);
app.listen(3000);
Vite のプロキシと同様に、この設定でもリクエストが転送され、クッキーが書き換えられます。
推奨事項
- 本番環境では、ドメインに対するサーバー側の許可リストを設定してください。
- ローカル開発では、(Vite や http-proxy-middleware などの)ローカルプロキシを使用してください。
- セキュリティを損なう可能性があるため、ブラウザ拡張機能の使用やセキュリティ設定の無効化は避けてください。
これらの手順に従うことで、セキュリティを損なうことなく CORS を効果的に管理できます。