Amazon GameLift Anywhere でサクッとマルチプレイゲームを開発しよう

2023-08-02
デベロッパーのためのクラウド活用方法

Author : 秋山 周平

ゲームが好きな皆様こんにちは。今回も GameLift を絡めて新しいゲームを作りつつその方法を紹介していきたいと思います。

今回メインとして紹介する機能は昨年 12 月に発表された Amazon GameLift Anywhere という機能になります。詳しくは後述しますが、Anywhere の名前の通りゲームサーバーをどこにおいても、例えばローカルでも Amazon EC2 上でも GameLift に組み込んで使える機能のため、手元での検証から本番への導入までシームレスに実施できます。

とはいえ、これまで実際に使ってみた事例はあまりなかったと思うので、本記事で動作が確認できるところまで一通り紹介したいと思います。本記事の手順を追うことで、以下のような同時にプレイする複数のプレイヤーがボードゲーム風の画面上でそれぞれのマスに存在するといった状況を実現することが可能です。さらに作り込みを進めれば本格的なオンラインのボードゲームの作成につながるかと思います。

本記事で紹介する例の構成図

本記事は全 2 回を予定している GameLift を使用したゲーム作成シリーズの第一回目となります。

今回の記事では、まずローカルでのマルチプレイヤーゲームの開発とテストを実施するための手順を紹介します。その次の記事では、ローカルで開発したゲームサーバーアプリケーションを Amazon ECS (予定) にデプロイし、構成やソースコードを変更せずそのままリモートでも検証が可能であることを示します。

ローカルでのテスト構成例<今回紹介>

本番を想定した AWS 上でのゲームホスト例構成例<次回紹介予定>

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 


1. 注意事項

本記事では以下の操作が行えることと、環境が整っていることを前提としています。

  • AWS のマネジメントコンソール
  • 対話型シェル

本記事で使用するサービスを使用可能な IAM ユーザーもしくは IAM ロールの準備
また、本記事で紹介したサンプルを実行することで AWS サービスの利用料が発生する可能性があります。作成したリソースは必ず最後に削除するよう気をつけましょう。

本記事で使用するサンプルコードは以下よりダウンロードが可能です。
buildersflash202308.zip

また、本記事を使用するにあたっては以下言語、ツール、フレームワークを使用しております。

  • Go
  • Node.js
  • AWS CDK
  • AWS CLI
  • Unity 2021.3.5f1 (LTS)

2. GameLift Anywhere 紹介

初めに少し GameLift Anywhere について紹介させていただきます。

GameLift Anywhere は 2022 年の re:Invent で発表された、GameLift Managed Hosting の機能の一つです。これまでの GameLift ではゲームサーバーは一度 GameLift にアップロードした後、 GameLift が管理する EC2 インスタンス上で動作をさせる必要があり、開発サイクルを高速化する上で課題がありました。

GameLift Anywhere は GameLift の管理機能を一部排除する代わりに GameLift 管理外のマシン、ローカルの PC や EC2 インスタンス、オンプレミスのマシンを直接 GameLift に登録できる機能となります。

Anywhere フリートは任意のマシンを GameLift の管理対象とすることが可能なため、オンプレミスのマシンを GameLift の管理下に置くことや、今回紹介するローカルの開発機を本番と同様に GameLift に登録することが可能となります。

GameLift についてはこちらの資料でも解説しておりますので、詳しくは以下をご確認ください。


3. 本記事で実施する手順の概要

本ハンズオンは最短 20 分 程度で動作確認が可能なコンテンツとなっていますが、GameLift や Unity に馴染みのない方は是非自分のペースでゆっくり進めていただくことをお勧めします。

  1. パッケージをダウンロードし確認する
  2. AWS CDK を使用し、必要なリソースを AWS にデプロイする
  3. ローカル PC でゲームサーバー (Go 製) を起動し、接続をテストする
  4. ゲームクライアント (Unity) に AWS にデプロイした Amazon API Gateway の情報を登録しビルドする
  5. ローカル PC 上でゲームサーバーとゲームクライアントを起動し、接続をテストする
  6. 使用したリソースを片付ける※

※作成したリソースを放置することは意図しないコスト発生につながりますので、確実に削除する習慣をつけましょう。


4. パッケージをダウンロードし確認する

まずは、本記事冒頭の サンプルコード の zip ファイル をダウンロードしてください。zip ファイルを解凍すると、3 つのフォルダが存在します。これらの中にはそれぞれ以下の役割を持つプロジェクトが存在します。

  • cdk : AWS リソースを管理、デプロイする AWS CDK ベースのプロジェクト
  • server : リクエストを他のクライアントに分配する Go 製の WebSocket サーバー
  • client : Unity 製のゲームクライアント。GameLift に問い合わせをした後、ゲームサーバーに接続する

なお、本記事では macOS 上での作業を参考として記載しますが Windows を使用している場合も同様の手順を実施可能です。

クリックすると拡大します


5. AWS CDK を使用し、必要なリソースを AWS にデプロイする

まずは、AWS CDK を使用し必要な AWS リソースをデプロイします。今回デプロイするリソースは GameLift のフリートとロケーション、API Gateway、Lambda関数 になります。

AWS CDK は、一般的なプログラム言語を使用して AWS リソースを定義しデプロイ可能なツールです。具体的な使用方法については公式より CDK workshop が公開されていますのでこちらをご確認ください。今回は CDK について詳しくない場合でも実行できるように最低限のコマンドは掲載いたします。

リソースのデプロイは以下のコマンドで cdk ディレクトリに移動、依存パッケージをインストールした後にデプロイを行います。aws cdk を始めて使用する際には cdk bootstrap を実行する必要がある点に注意してください。

cd cdk
npm install
cdk bootstrap 
cdk deploy 

リソースのデプロイ後には、デプロイされたリソースの情報がコンソールに出力されますのでこちらはメモしておきましょう。

なお、デプロイされたリソースは AWS CloudFormation で管理されていますので、こちらの画面のように AWS コンソールより確認が可能です。

クリックすると拡大します

なお、 API Gateway に作成した、 API Key は API Gateway のコンソールより確認することが可能です。

API key は CDK 上で任意の値を指定して作成することも可能ですが、今回は自動生成された値を使用するため、コンソールより値を確認しましょう。

クリックすると拡大します

また、AWS CDK が無事デプロイ完了すると、GameLift Anywhere の利用の際に必要となる カスタムロケーションならびにフリートも自動で作成されます。こちらの画面の通り、フリートのタブから確認が可能です。また、作成されたカスタムロケーションがフリートに登録されていることが確認できます。

クリックすると拡大します

以降の作業で使用するため、以下4つは手元にメモをしておきましょう

  • GameLift Anywhere フリート の FleetID
  • GameLift カスタムロケーションの名前
  • APIGateway の APIDomain 名
  • APIGateway の API Key の値

6. ローカルでサーバーアプリケーションを実装する

次に、ゲームサーバーの動作を確認します。
GameLift Anywhere にゲームサーバーを登録するためには、ゲームサーバーは GameLift に自身の情報を登録する必要があります。そのため、ゲームサーバーに GameLift ServerSDK をインポートする必要があります。GameLift ServerSDK は以下よりダウンロードが可能です。
https://aws.amazon.com/gamelift/getting-started/

GameLift ServerSDK は複数言語向けのパッケージを用意していますが。今回は実装量が少ない Go 向けのパッケージを利用しています。

GameLift ServerSDK 既にパッケージに組み込んであります。以下コマンドでパッケージを確認してみましょう。

cd <パッケージのルートディレクトリ>
cd server
ls -n
total 32
drwxr-xr-x  10 505  20   320 Jun 20 23:18 GameLift-Go-ServerSDK-5.0.0
-rw-r--r--   1 505  20  1853 Jun 20 23:22 gameliftserversdk.go
-rw-r--r--   1 505  20   263 Jun 20 23:22 go.mod
-rw-r--r--   1 505  20   490 Jun 20 23:18 go.sum
-rw-r--r--   1 505  20  2985 Jun 20 23:24 main.go

GameLift-Go-ServerSDK-5.0.0が GameLift ServerSDKにあたります。こちらで定義された関数を gameliftserversdk.go から参照しています。

また、今回は Client とのデータのやり取りを WebSocket でやりとりするため、gorilla/websocket パッケージを使用します。
従って、 GameServer は以下のように クライアントならびに GameLift とそれぞれ通信を行います。


7. ローカルで接続テストを行う

ゲームサーバーの動作について理解を深めたので次に実際に動作を確認してみましょう。

既に AWS CDK によって GameLift のリソースは作成されているため、作成したリソースの情報を使用し GameLift へゲームサーバーの登録が可能です。

接続テストにあたっては、作成されたフリートの ID ならびにロケーションの名前を使用します。

ローカルの PC 上から AWS CLIコマンドを実行するため、GameLiftへの権限を持つアクセスキーと AWS CLI の準備を行なってください。準備ができたら、最初に以下の通り Shell 変数にフリート ID やロケーション名などを設定しましょう。

FLEETID=fleet-xxx-xxx-xxx-xxxx-xx
LOCATION=custom-localMachine
COMPUTE_NAME=localpc

まずは以下の AWS CLI コマンドで、CDK で作成されたフリートの情報を確認します。

aws gamelift describe-fleet-attributes --fleet-id $FLEETID

次に、ローカルの PC を GameLift に登録します。本来はインターネットからアクセス可能なマシンのパブリック IP アドレスを設定する必要がありますが、今回はローカルでテストを行うためあえてローカルループバックアドレスである「127.0.0.1」を指定します。

aws gamelift register-compute --fleet-id $FLEETID \
--compute-name $COMPUTE_NAME \
--location $LOCATION \
--ip-address 127.0.0.1

コマンドが正常に実行できない場合、IAM の権限や、使用している AWS CLI のバージョンが最新でないことが原因の可能性がありますので確認してみてください。最新の AWS CLI のインストールはこちらを参照してください。

正しく登録できた場合、以下のコマンドで GameLift にローカル PC が登録されていることを確認できます。

aws gamelift list-compute --fleet-id $FLEETID

次にゲームサーバーを起動します。
ゲームサーバーを起動する前に、まずは以下のコマンドで認証情報を GameLift から取得する必要があります。

aws gamelift get-compute-auth-token --fleet-id $FLEETID \
--compute-name $COMPUTE_NAME

登録用のトークン情報が手に入るので、こちらも shell 変数に登録しましょう。トークンは 15 分だけ有効なため注意してください。 ENDPOINT は register-compute の結果に記載の GameLiftServiceSdkEndpoint の値を入力します。

TOKEN=< AuthToken に記載の token 文字列>
ENDPOINT=wss://<リージョン>.api.amazongamelift.com

この状態で Go のパッケージを次のコマンドで起動します。

go run . \
--websocketurl $ENDPOINT \
--hostid $COMPUTE_NAME \
--fleetid $FLEETID \
--authtoken $TOKEN

うまくいけば、アプリケーション起動後以下のような GameLift と接続したメッセージが確認できるかと思います。

tcp 80 番ポートのリッスンが失敗する場合、「main.go」の 128 行目を変更しリッスンするポート番号を 8080 などのエフェメラルなポートを使用することを検討してください。

2023/xx/xx 18:14:00 [DEBUG]:Starts receive response
2023/xx/xx 18:14:00 [DEBUG]:Connected to GameLift API Gateway.
2023/xx/xx 18:14:00 [GameLift]:Invoke processReady
2023/xx/xx 18:14:00 [DEBUG]:HealthCheck thread started.
2023/xx/xx 18:14:00 [DEBUG]:Reporting health using the OnHealthCheck callback.
[GameLift]Callback: OnHealthCheck

ここまでで、AWS GameLift 側には、ローカルの PC 上にゲームセッションを配置可能なスロットが1つ存在する状態になっています。そのため、GameLift に対してゲームセッションを発行してみましょう。上記 Go のゲームサーバーが起動してから GameLift に登録されるまでは少々タイムラグがあるため、1~2 分待機してから実行すると確実です。

サーバーを起動したターミナルはそのままに、新しいターミナルを起動し以下 AWS CLI コマンドを実行します。

FLEETID=fleet-xxx-xxx-xxx-xxxx-xx
LOCATION=custom-localMachine

aws gamelift create-game-session --fleet-id $FLEETID \
--location $LOCATION \
--maximum-player-session-count 2  

成功した場合、以下のようなレスポンスが返却され、RegisterCompute コマンドで登録した IP アドレスが返却されます。ポート番号は、起動したこの後クライアントは受け取った IP アドレスとポートに接続することで、ゲームを開始することができます。もちろん、ゲームサーバー側もクライアントからリクエストが来るのでゲームが開始できるよう実装する必要があります。

{
    "GameSession": {
<省略>
        "IpAddress": "127.0.0.1",
        "Port": 80,
<省略>
    }
}

ゲームサーバーの方にも、GameLift からゲームセッション作成の通知があり、この後プレイヤーが接続することが知らされることがログから判別できます。

2023/xx/xx 18:15:54 [DEBUG]:Received HeartbeatServerProcess for GameLift with status 200. Data is {"Action":"HeartbeatServerProcess","RequestId":"xx-yy","StatusCode":200}
2023/xx/xx 18:16:58 [DEBUG]:Received CreateGameSession for GameLift with status 0. Data is {"Action":"CreateGameSession","GameSessionId":"xx-yy","GameSessionName":null,"MaximumPlayerSessionCount":2,"GameProperties":{},"GameSessionData":null,"MatchmakerData":null,"IpAddress":"127.0.0.1","DnsName":null,"Port":7777,"Status":"ACTIVATING","StatusReason":null,"Location":"custom-BuildersFlash"}
2023/xx/xx 18:16:58 [DEBUG]:server got the startGameSession signal. GameSession : arn:aws:gamelift:ap-northeast-1::gamesession/fleet-420fa73a-0724-4a9c-8f4c-8a875f11ecd8/custom-BuildersFlash/gsess-55c4418d-64b7-491b-8376-2605fd0f2f84

実際にゲームサーバーに接続してみましょう。今回作成したゲームサーバーは、 80 番ポートをリッスンしており、HTTPリクエストに対する応答を行います。

また、/connect にアクセスすることで websocket の接続も可能です。WebSocket の疎通の確認にはさまざまなツールが使用可能かと思いますが、今回は wscat を使用して確認します。

curl 127.0.0.1/
Status is green

wscat -c ws://127.0.0.1/connect
Connected (press CTRL+C to quit)
> echo
< echo
>

ここまでで、GameLift にサーバープロセスを登録した後、登録したゲームサーバーの情報をクライアントが取得し、取得した情報から起動しているサーバープロセスに接続する一連の流れが確認できました。

ここまでのコマンドを一括で実行する場合は以下の通りとなります。
なお、以下コマンドでは JSON パーサーである jq を使用して結果を変数に格納している点に注意ください。

FLEETID=fleet-xxx-xxx-xxx-xxxx-xx
IP=127.0.0.1
COMPUTE_NAME=localpc
LOCATION=custom-localMachine

RESPONSE=$(aws gamelift register-compute --fleet-id $FLEETID \
--compute-name $COMPUTE_NAME --location $LOCATION --ip-address $IP --dns-name "localhost")
ENDPOINT=$(echo $RESPONSE | jq -r '.Compute.GameLiftServiceSdkEndpoint')

CREDS=$(aws gamelift get-compute-auth-token --fleet-id $FLEETID --compute-name $COMPUTE_NAME)
TOKEN=$(echo $CREDS | jq -r '.AuthToken')

go run . --websocketurl $ENDPOINT --hostid $COMPUTE_NAME --fleetid $FLEETID --authtoken $TOKEN

まずは CloudShell 上で AWS CLI コマンドを実行するにあたって、リソースを作成するリージョンを指定します。「Default region name」以外の項目については空欄で構いません。今回は ap-northeast-1 リージョンを指定しますが、 GameLift がサポートしている他のリージョンでも動作を確認しています。

aws configure
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: ap-northeast-1
Default output format [None]: 

8. クライアント側を実装する

一通りサーバー側の動作を確認できたため、次はゲームクライアントを使用して同じ手続きを行います。こちらは Unity Project となっていますので、お使いの Unity で開くことが可能です。

なお、バージョンは 2021.3.5f1 バージョン以上の Unity をご利用ください。

プロジェクトを開いた後、何も表示されない場合は、Assets フォルダ → Scenes フォルダ内にある「SampleScene」シーンファイルをダブルクリックで開いてください。

環境によってレイアウトの違いはありますが概ねこちらの画面のような形となっているかと思います。

クリックすると拡大します

プロジェクト中のスクリプトの役割は以下の通りです。

  • GameManager.cs:ゲーム全体のステートの管理や同期するデータの管理送信を担当します
  • ObjectState.cs : オブジェクトにステートを持たせるためのクラスです
  • Player.cs : 自分を含む各プレイヤーのカーソルの管理と移動を担当します
  • RestAPIManager.cs : API Gateway との REST API での呼び出しを担当します
  • WebSocketManager.cs : ゲームサーバーとの WebSocket でのデータ交換を担当します

今回、ゲームクライアントである Unity からゲームサーバーへの通信は WebSocket を使用するため、「NativeWebSocket」というライブラリを使用しています。

また、GameLift に対して API Gateway 経由で新部屋作成と空いている部屋の検索を行うため REST API リクエストを送信します。

API Gateway の URL と API Key については Unity クライアント側の設定は空欄にしていますので、CDK の出力をもとに空欄となっている設定値を入力しましょう。

ヒエラルキーの GameManager を選択し、アタッチされている Rest API Manager の空欄を埋めます。 API Gateway Domain にはデプロイした API Gateway のドメインのみ入力します。東京リージョンの場合、具体的には「<リソースID>.execute-api.ap-northeast-1.amazonaws.com」となります。Api key には、CDK を使用してデプロイした際に出力された値を入力します。

クリックすると拡大します

その他については変更する必要はありません。


9. ローカルPCでゲームサーバーとゲームクライアントを起動し、接続をテストする

それでは、クライアントを使用してテストしてみましょう。

まずは、Unity でゲームクライアントをビルドします。 Unity では、「Build Settings」よりビルドが可能です。

クリックすると拡大します

その後、ゲームクライアントを起動しますが、その前にゲームサーバーをローカルで起動しておく必要があります。

先ほど起動したゲームサーバーを落としてしまった場合、以下のコマンドを実行することですぐに GameLift に登録された状態となります。

FLEETID=fleet-xxx-xxx-xxx-xxxx-xx
IP=127.0.0.1
COMPUTE_NAME=localpc
LOCATION=custom-localMachine

RESPONSE=$(aws gamelift register-compute --fleet-id $FLEETID \
--compute-name $COMPUTE_NAME --location $LOCATION --ip-address $IP --dns-name "localhost")
ENDPOINT=$(echo $RESPONSE | jq -r '.Compute.GameLiftServiceSdkEndpoint')

CREDS=$(aws gamelift get-compute-auth-token --fleet-id $FLEETID --compute-name $COMPUTE_NAME)
TOKEN=$(echo $CREDS | jq -r '.AuthToken')

go run . --websocketurl $ENDPOINT --hostid $COMPUTE_NAME --fleetid $FLEETID --authtoken $TOKEN

次に、ビルドしたゲームクライアントを起動します。Mac OSX の場合ターミナルより以下のコマンドを実行することで多重起動が可能です。

open ./buildersflash.app -n

起動するとこのような画面が表示されます。

List Room」ボタンで既存のゲームセッションの検索が、「Create Room」ボタンで新規ルーム作成が可能です。

まずはゲームセッションが存在しないので「Create Room」でゲームセッション作成を GameLift に指示しましょう。

クリックすると拡大します

正しく処理が実行されると、ゲームサーバー側に GameLift よりゲームセッション作成の通知が届きます。
以下のようなログが gameserver を起動しているターミナルで確認できるかと思います。

2023/06/21 00:55:55 [DEBUG]:Received CreateGameSession for GameLift with status 0. Data is {"Action":"CreateGameSession","GameSessionId":"arn:aws:gamelift:ap-northeast-1::gamesession/fleet-xxx/custom-xxx/gsess-xxx-yyy-zzz","GameSessionName":null,"MaximumPlayerSessionCount":5,"GameProperties":{},"GameSessionData":null,"MatchmakerData":null,"IpAddress":"127.0.0.1","DnsName":null,"Port":80,"Status":"ACTIVATING","StatusReason":null,"Location":"custom-xxxx"}
2023/06/21 00:55:55 [DEBUG]:server got the startGameSession signal. GameSession : arn:aws:gamelift:ap-northeast-1::gamesession/fleet-xxx-yyy-zzz/custom-xxx/gsess-xxx-yyy-zzz
[GameLift]Callback: OnStartGameSession

次に、2つ目のアプリを起動し、「List Room」を選択しましょう。

1 つのゲームセッションがローカルのゲームサーバーで実行中であることを GameLift 側も把握しているため、List Room で結果が一つ表示されます。

また、結果を見るとこの画面のようにサーバーの IP アドレスとポートも取得できていることがわかります。

今回はローカルでのテストのため、ゲームサーバーを GameLift に登録する際にローカルのアドレスをマシンの IP アドレスとしていますが、リモートにゲームサーバーを配置する場合は、配置場所に応じた Public IP を指定する必要があります。こちらは次回で解説します。

クリックすると拡大します

その後、ボタンを押すことでゲームセッションを開始できます。
うまくいけば、単一のゲームサーバーにローカルマシン上の二つの クライアントが WebSocket で接続し常に位置情報が共有されていることの確認が取れるかと思います。

クリックすると拡大します

なお、この状態でさらに、起動中のゲームサーバーに対して wscat で接続すると、メッセージを生の状態で確認することができます。

今回は各ゲームクライアントが自分の座標を送信していますが、wscat により受信したデータを以下のように確認することができるため、実際にゲームクライアントがブロードキャストで送信しているデータを確認することができイメージが湧きやすくおすすめです。

クリックすると拡大します

今回の記事はここまでとなります。

ここまで実施された方はお気づきかと思いますが、AWS 側のリソースについては一度 cdk をデプロイした後一切変更していません。そのため、今後も引き続きローカルでゲームサーバーとゲームクライアントを開発することができます。

従来ゲームサーバーを都度 GameLift にアップロードしていた時と比較し、Anywhere では常にサーバーとクライアントをローカルで接続しながら確認ができるため、開発を高速化することが可能です。


10. リソースを削除する

使ったリソースはきちんと片付けないと使い続けることになり不要なコストが発生するため、確実に片付ける癖をつけましょう。
今回は AWS CDK でリソースを作成しているため、CDK のコマンドを実行するだけで削除が可能です。

cdk destroy 

また、起動中のサーバープロセスについても忘れずに終了しましょう。

cdk bootstrap で作成したブートストラップスタックを削除したい場合は、CloudFormation の コンソールから行う必要があります。CloudFormation コンソールへ行き、CDKToolkit スタックを削除してください。

さらに、作成された S3 バケットはデフォルトで保持されますので、予期せぬ請求を回避したい場合は S3 コンソールを開き、ブートストラップで生成されたバケットを空にし削除してください。

無事削除が完了すれば、ハンズオンの全ての行程は終了です。


11. まとめ

今回は Amazon GameLift Anywhere を活用して、AWS リソースを使用しつつローカルで開発を高速化する方法を紹介しました。

一度 AWS リソースを整備した後は、AWS 側の変更なしにどのマシンでもゲームサーバーを GameLift に登録できるため、どのようなマシンでもゲームサーバーとゲームクライアントを GameLift に接続した状態で開発が可能です。これにより、これまでよりさらに高速な開発が可能です。

一方 GameLift Anywhere ではゲームサーバーの起動を管理しないため、ゲームサーバーをローカルではなく AWS 上にスケールできる状態で配置するには工夫が必要です。

次回は、ECS を使用しゲームサーバーを配置する方法を紹介したいと思います。
こうご期待!


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます


筆者プロフィール

秋山周平
アマゾン ウェブ サービス ジャパン合同会社
技術統括本部 ソリューションアーキテクト

以前は AWS サポートにて広範のお客様をご支援していました。現在は特にゲーム業界のお客様に対して、ソリューションアーキテクトとして技術的なご支援をしています。
好きなサービスは Amazon GameLift と Amazon Cognito。週末は大自然の中にいます。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する