レルムの作成

このページでは、Game Servers のレルムの作成、一覧表示、詳細表示を行う方法について説明します。レルムとは、プレーヤー数に対するゲームのレイテンシ要件に基づいた、Game Servers クラスタのユーザー定義グループです。

始める前に

始める前に、Game Servers の概要の主なコンセプトを理解しておくことをおすすめします。次のタスクを完了していることも確認してください。

  • Game Services API が有効になっていることを確認します。
  • Game Services API を有効にする
  • Cloud SDK がインストールされたシェルを選択するか、API クライアントを使用します。
  • Cloud Shell

    Cloud Shell を起動するには、次の手順に従います。

    1. Google Cloud Console に移動します。

      Google Cloud Console

    2. コンソールの右上隅にある [Cloud Shell をアクティブにする] ボタン をクリックします。

    コンソールの下部にあるフレーム内で Cloud Shell セッションが開きます。このシェルを使用して、gcloud コマンドを実行します。

    ローカルシェル

    gcloud をインストールするには、Cloud SDK をインストールします。これには、gcloud コマンドライン ツールが含まれています。

    gcloud コマンドライン ツールに必要なデフォルトのプロジェクトが設定されていることを確認します(設定されていない場合、後でコマンドごとに --project フラグを明示的に指定する必要があります)。

    gcloud config list project
    

    デフォルト プロジェクトを設定していない場合は、次のコマンドを実行して、デフォルト プロジェクトを設定します。project-id は、設定するプロジェクト ID に置き換えてください。

    gcloud config set project project-id
    

    次のコマンドを実行して、Google Cloud SDK のバージョンを確認します。Game Servers では、バージョン 306.0.0 以降の SDK が必要です。

    gcloud version
    

    インストールを更新するには、次のコマンドを実行します。

    gcloud components update
    

    クライアント ライブラリ

    Google Cloud Game Servers は、クライアント ライブラリを使用して、プログラムで制御できます。ライブラリと認証の手順については、クライアント ライブラリの概要をご覧ください。

レルムの作成

レルムはグローバルまたはリージョンです。レルムに登録されたクラスタが、北米、南米、ヨーロッパ、アジアなど、さまざまな地理的ロケーションにわたるリージョンにある場合は、グローバル レルムが適しています。クラスタが、ヨーロッパ西部など、同じリージョンにある場合は、リージョン レルムが適しています。リージョン間のネットワークが停止した場合、すべてのリージョンで、グローバル レルムによるクラスタの管理ができない場合があります。リージョン間のネットワーク障害に対する復元力を高めるには、関連するゲームサーバー クラスタのできる限り近くのリージョンに、リージョン レルムを作成する必要があります。

たとえば、ヨーロッパ西部のユーザーにサービスを提供するために、europe-west1europe-west2europe-west3 リージョンにクラスタを作成する場合、これらのリージョンの 1 つにリージョン レルムを作成できます。この構成を行うことで、ネットワークの停止により、世界の他のリージョンからこのリージョンに到達できなくなった場合でも、引き続きレルムによるクラスタ管理が可能になります。

レルムを作成する場所がわからない場合は、グローバル レルムとして作成できます。要件の変更に合わせて、管理が必要なクラスタに近いリージョンに新しいレルムを作成できます。最初にグローバル レルムからクラスタを削除および登録解除してから、新しいリージョン レルムにクラスタを登録することで、既存のクラスタを新しいリージョン レルムに移動できます。

gcloud コマンド

gcloud コマンドライン ツールを使用して、レルムを作成できます。グローバル レルムを作成するには、次のコマンドを実行します。realmID などのプレースホルダの値を適切な値に置き換えます。

gcloud game servers realms create realmID --time-zone tz

リージョン レルムを作成するには、次のコマンドを実行します。realmID などのプレースホルダの値を適切な値に置き換えます。

gcloud game servers realms create realmID --time-zone tz --location=region

変数のプレースホルダは、次の説明のとおりです。

  • realmID は、このレルムに指定できる一意の ID です。
  • tz は、このレルムのタイムゾーンです。スケーリング ポリシーなどの時間ベースのイベントをスケジュールする場合は、このタイムゾーンが使用されます。
  • region は、レルムのリージョンです。障害発生ドメインを制御する場合は、リージョンを指定します。グローバル レルムを作成して、このオプションを省略することをおすすめします。

Go


import (
	"context"
	"fmt"
	"io"

	gaming "cloud.google.com/go/gaming/apiv1"
	gamingpb "google.golang.org/genproto/googleapis/cloud/gaming/v1"
)

// createRealm creates a game server realm.
func createRealm(w io.Writer, projectID, location, realmID string) error {
	// projectID := "my-project"
	// location := "global"
	// realmID := "myrealm"
	ctx := context.Background()
	client, err := gaming.NewRealmsClient(ctx)
	if err != nil {
		return fmt.Errorf("NewRealmsClient: %v", err)
	}
	defer client.Close()

	req := &gamingpb.CreateRealmRequest{
		Parent:  fmt.Sprintf("projects/%s/locations/%s", projectID, location),
		RealmId: realmID,
		Realm: &gamingpb.Realm{
			TimeZone:    "US/Pacific",
			Description: "My Game Server Realm",
		},
	}

	op, err := client.CreateRealm(ctx, req)
	if err != nil {
		return fmt.Errorf("CreateRealm: %v", err)
	}
	resp, err := op.Wait(ctx)
	if err != nil {
		return fmt.Errorf("Wait: %v", err)
	}

	fmt.Fprintf(w, "Realm created: %v", resp.Name)
	return nil
}

Node.js

const {RealmsServiceClient} = require('@google-cloud/game-servers');

const client = new RealmsServiceClient();

async function createRealm() {
  /**
   * TODO(developer): Uncomment these variables before running the sample.
   */
  // const projectId = 'Your Google Cloud Project ID';
  // const location = 'A Compute Engine region, e.g. "us-central1"';
  // const realmId = 'A unique identifier for the realm';
  const request = {
    parent: `projects/${projectId}/locations/${location}`,
    realmId: realmId,
    realm: {
      // Must use a supported time zone name.
      // See https://cloud.google.com/dataprep/docs/html/Supported-Time-Zone-Values_66194188
      timeZone: 'US/Pacific',
      description: 'My Game Server realm',
    },
  };

  const [operation] = await client.createRealm(request);
  const results = await operation.promise();
  const [realm] = results;

  console.log('Realm created:');

  console.log(`\tRealm name: ${realm.name}`);
  console.log(`\tRealm description: ${realm.description}`);
  console.log(`\tRealm time zone: ${realm.timeZone}`);
}

createRealm();

Python

def create_realm(project_id, location, realm_id):
    """Creates a realm."""

    client = gaming.RealmsServiceClient()

    request = realms.CreateRealmRequest(
        parent=f"projects/{project_id}/locations/{location}",
        realm_id=realm_id,
        realm=realms.Realm(
            description="My Realm",
            time_zone="US/Pacific",
        ),
    )

    operation = client.create_realm(request)
    print(f"Create realm operation: {operation.operation.name}")
    operation.result(timeout=120)

レルムの一覧表示

gcloud コマンド

グローバルまたはリージョンのレルムの一覧を表示するには、gcloud コマンドライン ツールを使用します。

グローバルとリージョンの両方のレルムを一覧表示するには、次のコマンドを実行します。

gcloud game servers realms list

特定のロケーションのレルムを一覧表示するには、次のコマンドを実行します。region は、global または Google Cloud リージョンに置き換えます。

gcloud game servers realms list --location=region

Go


import (
	"context"
	"fmt"
	"io"

	gaming "cloud.google.com/go/gaming/apiv1"
	"google.golang.org/api/iterator"
	gamingpb "google.golang.org/genproto/googleapis/cloud/gaming/v1"
)

// listRealms lists the realms in a location.
func listRealms(w io.Writer, projectID, location string) error {
	// projectID := "my-project"
	// location := "global"
	ctx := context.Background()
	client, err := gaming.NewRealmsClient(ctx)
	if err != nil {
		return fmt.Errorf("NewRealmsClient: %v", err)
	}
	defer client.Close()

	req := &gamingpb.ListRealmsRequest{
		Parent: fmt.Sprintf("projects/%s/locations/%s", projectID, location),
	}

	it := client.ListRealms(ctx, req)
	for {
		resp, err := it.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return fmt.Errorf("Next: %v", err)
		}

		fmt.Fprintf(w, "Realm listed: %v\n", resp.Name)
	}

	return nil
}

Node.js

const {RealmsServiceClient} = require('@google-cloud/game-servers');

const client = new RealmsServiceClient();

async function listRealms() {
  /**
   * TODO(developer): Uncomment these variables before running the sample.
   */
  // const projectId = 'Your Google Cloud Project ID';
  // const location = 'A Compute Engine region, e.g. "us-central1"';
  const request = {
    parent: `projects/${projectId}/locations/${location}`,
  };

  const [results] = await client.listRealms(request);
  for (const realm of results) {
    console.log(`Realm name: ${realm.name}`);
    console.log(`Realm description: ${realm.description}`);
    console.log(`Realm time zone: ${realm.timeZone}`);

    const createTime = realm.createTime;
    const createDate = new Date(createTime.seconds * 1000);
    console.log(`Realm created on: ${createDate.toLocaleDateString()}\n`);
  }
}

listRealms();

Python



def list_realms(project_id, location):
    """Lists the existing realms."""

    client = gaming.RealmsServiceClient()

    response = client.list_realms(
        parent=f"projects/{project_id}/locations/{location}"
    )

    for realm in response.realms:
        print(f"Name: {realm.name}")

    return response.realms

レルムの詳細表示

gcloud コマンド

作成日時やタイムゾーンなど、レルムの詳細を取得するには、gcloud コマンドライン ツールを使用します。

グローバル レルムの詳細を表示するには、次のコマンドを実行します。realmID は、以前に作成したレルム ID に置き換えます。

gcloud game servers realms describe realmID

グローバルではないレルムを 1 つ以上作成した場合、特定のリージョンのレルムに関する詳細を表示できます。リージョン内のレルムの詳細を表示するには、realmID を以前に作成したレルム ID に置き換え、region をレルムが存在するリージョンに置き換えます。

gcloud game servers realms describe realmID --location=region

Go


import (
	"context"
	"fmt"
	"io"

	gaming "cloud.google.com/go/gaming/apiv1"
	gamingpb "google.golang.org/genproto/googleapis/cloud/gaming/v1"
)

// getRealm retrieves info on a realm.
func getRealm(w io.Writer, projectID, location, realmID string) error {
	// projectID := "my-project"
	// location := "global"
	// realmID := "myrealm"
	ctx := context.Background()
	client, err := gaming.NewRealmsClient(ctx)
	if err != nil {
		return fmt.Errorf("NewRealmsClient: %v", err)
	}
	defer client.Close()

	req := &gamingpb.GetRealmRequest{
		Name: fmt.Sprintf("projects/%s/locations/%s/realms/%s", projectID, location, realmID),
	}

	resp, err := client.GetRealm(ctx, req)
	if err != nil {
		return fmt.Errorf("GetRealm: %v", err)
	}

	fmt.Fprintf(w, "Realm retrieved: %v", resp.Name)
	return nil
}

Node.js

const {RealmsServiceClient} = require('@google-cloud/game-servers');

const client = new RealmsServiceClient();

async function getRealm() {
  /**
   * TODO(developer): Uncomment these variables before running the sample.
   */
  // const projectId = 'Your Google Cloud Project ID';
  // const location = 'A Compute Engine region, e.g. "us-central1"';
  // const realmId = 'Unique identifier of the realm';
  const request = {
    // Realm name is the full resource name including project ID and location
    name: client.realmPath(projectId, location, realmId),
  };

  const [realm] = await client.getRealm(request);
  console.log(`Realm name: ${realm.name}`);
  console.log(`Realm description: ${realm.description}`);
  console.log(`Realm time zone: ${realm.timeZone}`);

  const createTime = realm.createTime;
  const createDate = new Date(createTime.seconds * 1000);

  console.log(`Realm created on: ${createDate.toLocaleDateString()}`);
}

getRealm();

Python

def get_realm(project_id, location, realm_id):
    """Gets a realm."""

    client = gaming.RealmsServiceClient()

    request = realms.GetRealmRequest(
        name=f"projects/{project_id}/locations/{location}/realms/{realm_id}",
    )

    response = client.get_realm(request)
    print(f"Get realm response:\n{response}")
    return response

次のステップ