GS2-Friend Deploy/CDK リファレンス

GS2-Deployのスタックを作成する際に使用するテンプレートのフォーマットと、CDKによる各種言語のテンプレート出力の実装例

エンティティ

Deploy処理で操作の対象となるリソース

Namespace

ネームスペース

ネームスペースは、一つのプロジェクト内で同じサービスを異なる用途で複数利用するためのエンティティです。
GS2 の各サービスはネームスペース単位で管理されます。ネームスペースが異なれば、同じサービスでも完全に独立したデータ空間として扱われます。

そのため、各サービスの利用を開始するにあたってネームスペースを作成する必要があります。

Request

リソースの生成・更新リクエスト

有効化条件必須デフォルト値の制限説明
namestring
~ 128文字ネームスペース名
ネームスペース固有の名前。英数字および -(ハイフン) _(アンダースコア) .(ピリオド)で指定します。
descriptionstring~ 1024文字説明文
transactionSettingV2TransactionSettingV2トランザクション設定(V2)
このネームスペースが発行するトランザクションをどのように実行するかを決める設定です。設定する項目は、実行に使用する GS2-Distributor のネームスペースと、トランザクションに含まれるアクションを 1 件ずつ実行して先に実行されたアクションの結果を後続のアクションから使えるようにするか、まとめて同時に実行してレスポンスタイムを短くするか、の 2 つだけです。
新しく作成するネームスペースではこちらを設定してください。これに置き換えられて非推奨となった transactionSetting は、こちらが設定されていない間だけ使用されます。
followScriptScriptSettingフォローされたときに実行するスクリプトの設定
Script トリガーリファレンス - follow
unfollowScriptScriptSettingアンフォローされたときに実行するスクリプトの設定
Script トリガーリファレンス - unfollow
sendRequestScriptScriptSettingフレンドリクエストを発行したときに実行するスクリプトの設定
Script トリガーリファレンス - sendRequest
cancelRequestScriptScriptSettingフレンドリクエストをキャンセルしたときに実行するスクリプトの設定
Script トリガーリファレンス - cancelRequest
acceptRequestScriptScriptSettingフレンドリクエストを承諾したときに実行するスクリプトの設定
Script トリガーリファレンス - acceptRequest
rejectRequestScriptScriptSettingフレンドリクエストを拒否したときに実行するスクリプトの設定
Script トリガーリファレンス - rejectRequest
deleteFriendScriptScriptSettingフレンドを削除したときに実行するスクリプトの設定
Script トリガーリファレンス - deleteFriend
updateProfileScriptScriptSettingプロフィールを更新したときに実行するスクリプトの設定
Script トリガーリファレンス - updateProfile
followNotificationNotificationSettingフォローされたときのプッシュ通知
他のプレイヤーにフォローされたときにプッシュ通知を送信する設定です。フォローされたプレイヤーが GS2-Gateway 経由でリアルタイムに通知を受け取ることができます。
receiveRequestNotificationNotificationSetting
フレンドリクエストが届いたときのプッシュ通知
他のプレイヤーからフレンドリクエストを受信したときにプッシュ通知を送信する設定です。受信者が GS2-Gateway 経由で迅速に応答できるようにします。
cancelRequestNotificationNotificationSetting
受け取ったフレンドリクエストがキャンセルされたときのプッシュ通知
以前受信したフレンドリクエストが送信者によってキャンセルされたときにプッシュ通知を送信する設定です。保留中のリクエストが存在しなくなったことを受信者に通知します。
acceptRequestNotificationNotificationSetting
フレンドリクエストが承認されたときのプッシュ通知
送信したフレンドリクエストが受信者によって承認されたときにプッシュ通知を送信する設定です。承認後、両プレイヤーが互いのフレンドリストに追加されます。
rejectRequestNotificationNotificationSetting
フレンドリクエストが拒否されたときのプッシュ通知
送信したフレンドリクエストが受信者によって拒否されたときにプッシュ通知を送信する設定です。フレンドリクエストは送信ボックスと受信ボックスの両方から削除されます。
deleteFriendNotificationNotificationSetting
フレンドが削除されたときのプッシュ通知
他のプレイヤーのフレンドリストから削除されたときにプッシュ通知を送信する設定です。フレンド関係は双方で解消されます。
logSettingLogSettingログの出力設定
フレンド操作のログデータを GS2-Log に出力するための設定です。GS2-Log のネームスペースを指定することで、フォロー/アンフォロー、フレンドリクエスト、プロフィール更新の API リクエスト・レスポンスログを収集できます。

GetAttr

!GetAttrタグで取得可能なリソースの生成結果

説明
ItemNamespace作成したネームスペース

実装例

Type: GS2::Friend::Namespace
Properties:
  Name: namespace-0001
  Description: null
  TransactionSettingV2: null
  FollowScript: null
  UnfollowScript: null
  SendRequestScript: null
  CancelRequestScript: null
  AcceptRequestScript: null
  RejectRequestScript: null
  DeleteFriendScript: null
  UpdateProfileScript: null
  FollowNotification: null
  ReceiveRequestNotification: null
  CancelRequestNotification: null
  AcceptRequestNotification: null
  RejectRequestNotification: null
  DeleteFriendNotification: null
  LogSetting: 
    LoggingNamespaceId: grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001
import (
    "github.com/gs2io/gs2-golang-cdk/core"
    "github.com/gs2io/gs2-golang-cdk/friend"
)


SampleStack := core.NewStack()
friend.NewNamespace(
    &SampleStack,
    "namespace-0001",
    friend.NamespaceOptions{
        LogSetting: &core.LogSetting{
            LoggingNamespaceId: "grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001",
        },
    },
)

println(SampleStack.Yaml())  // Generate Template
class SampleStack extends \Gs2Cdk\Core\Model\Stack
{
    function __construct() {
        parent::__construct();
        new \Gs2Cdk\Friend\Model\Namespace_(
            stack: $this,
            name: "namespace-0001",
            options: new \Gs2Cdk\Friend\Model\Options\NamespaceOptions(
                logSetting: new \Gs2Cdk\Core\Model\LogSetting(
                    loggingNamespaceId: "grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001"
                )
            )
        );
    }
}

print((new SampleStack())->yaml());  // Generate Template
class SampleStack extends io.gs2.cdk.core.model.Stack
{
    public SampleStack() {
        super();
        new io.gs2.cdk.friend.model.Namespace(
                this,
                "namespace-0001",
                new io.gs2.cdk.friend.model.options.NamespaceOptions()
                        .withLogSetting(new io.gs2.cdk.core.model.LogSetting(
                            "grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001"
                        ))
        );
    }
}

System.out.println(new SampleStack().yaml());  // Generate Template
public class SampleStack : Gs2Cdk.Core.Model.Stack
{
    public SampleStack() {
        new Gs2Cdk.Gs2Friend.Model.Namespace(
            stack: this,
            name: "namespace-0001",
            options: new Gs2Cdk.Gs2Friend.Model.Options.NamespaceOptions
            {
                logSetting = new Gs2Cdk.Core.Model.LogSetting(
                    loggingNamespaceId: "grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001"
                )
            }
        );
    }
}

Debug.Log(new SampleStack().Yaml());  // Generate Template
import core from "@/gs2cdk/core";
import friend from "@/gs2cdk/friend";

class SampleStack extends core.Stack
{
    public constructor() {
        super();
        new friend.model.Namespace(
            this,
            "namespace-0001",
            {
                logSetting: new core.LogSetting(
                    "grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001"
                )
            }
        );
    }
}

console.log(new SampleStack().yaml());  // Generate Template
from gs2_cdk import Stack, core, friend

class SampleStack(Stack):

    def __init__(self):
        super().__init__()
        friend.Namespace(
            stack=self,
            name='namespace-0001',
            options=friend.NamespaceOptions(
                log_setting=core.LogSetting(
                    logging_namespace_id='grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001',
                ),
            ),
        )

print(SampleStack().yaml())  # Generate Template

TransactionSettingV2

トランザクション設定(V2)

トランザクション設定(V2)は、ネームスペースが発行するトランザクションをどのように実行するかを決める設定です。

設定する項目は次の 2 つだけです。

  • distributorNamespaceId: トランザクションの実行に使用する GS2-Distributor のネームスペース
  • enableParallelExecution: トランザクションに含まれるアクションを 1 件ずつ実行するか、まとめて同時に実行するか

どちらを選んでも、トランザクションは発行された時点でサーバーが実行し、成否はトランザクション全体でひとつになります。あるアクションが失敗した場合は、それまでに実行されたアクションもろとも取り消され、1 つも反映されません。トランザクションの実行方法に関するそれ以外の項目は推奨構成に固定されているため、設定する必要はありません。

1 件ずつ実行する場合(既定 / enableParallelExecutionfalse)、各アクションは先に実行されたアクションの書き込みを踏まえて動作します。アクションは verify・consume・acquire の順に実行され、次のことができます。

  • 1 つのトランザクションの中で、同じ行を複数のアクションから更新する(まとめて同時に実行する場合は失敗します)
  • 先に実行されたアクションの書き込みを読む。List や Query の結果でも、入れ子になったトランザクションの内側でも読めます
  • %{Gs2Xxx:ActionName.path[0].field} を使って、先に実行された verify や consume アクションの結果を、後続の verify・consume・acquire アクションの引数として渡す

代わりに、レスポンスタイムは各アクションの実行時間の合計になり、1 つのトランザクションに含められるアクションは最大 20 件になります。また、各フェーズの中での実行順はアクション名、次に対象リソースの順で決まるため、リクエストに並べた順序で実行順を指定することはできません。実行は最初に失敗したアクションで停止します。

まとめて同時に実行する場合(enableParallelExecutiontrue)、アクションは同一のデータスナップショットに対して並列に実行されるため、レスポンスタイムは最も遅いアクション 1 件分で済み、アクション数の上限もありません。

代わりに、あるアクションから他のアクションの書き込みを読むことはできず、同じ行を 2 つのアクションが書き換えるとトランザクションは database:transaction:same.resource(400)で失敗します。同一トランザクション内で同じデータを 2 つ以上のアクションが書き換えないことを保証できる場合にだけ選択してください。%{...} は先行するフェーズ(verify → consume → acquire の順)の結果だけを参照でき、同じフェーズ内のアクションへの参照は解決されずにそのまま残ります。%{...} を含むフェーズは先行するフェーズの完了を待ってから実行されるため、その分だけレスポンスタイムが伸びます。

トランザクション設定は、トランザクション設定(V2)に置き換えられた非推奨の設定で、トランザクション設定(V2)が存在しなかった頃に作成されたネームスペースのために残されています。トランザクション設定(V2)が設定されていない間だけ適用され、トランザクション設定(V2)を設定するとそちらが優先されます。トランザクション設定で可能だった、トランザクションをクライアント実行のスタンプシートとして実行する・GS2-Distributor による AutoRun の非同期実行を行う・入手アクションを GS2-JobQueue に畳み込む、という 3 つの挙動は、こちらではあえて提供していません。

有効化条件必須デフォルト値の制限説明
distributorNamespaceIdstring“grn:gs2:{region}:{ownerId}:distributor:default”~ 1024文字トランザクションの実行に使用する GS2-Distributor ネームスペース GRN
enableParallelExecutionboolfalseアクションを直列ではなく並列に実行するか

ScriptSetting

スクリプト設定

GS2 ではマイクロサービスのイベントに関連づけて、カスタムスクリプトを実行することができます。
このモデルは、スクリプトの実行をトリガーするための設定を保持します。

スクリプトの実行方式は大きく2種類あり、それは「同期実行」と「非同期実行」です。
同期実行は、スクリプトの実行が完了するまで処理がブロックされます。
代わりに、スクリプトの実行結果を使って API の実行を止めたり、API のレスポンス内容を制御することができます。

一方、非同期実行ではスクリプトの完了を待つために処理がブロックされることはありません。
ただし、スクリプトの実行結果を利用して API の実行を停止したり、API の応答内容を変更することはできません。
非同期実行は API の応答フローに影響を与えないため、原則として非同期実行を推奨します。

非同期実行には実行方式が2種類あり、GS2-Script と Amazon EventBridge があります。
Amazon EventBridge を使用することで、Lua 以外の言語で処理を記述することができます。

有効化条件必須デフォルト値の制限説明
triggerScriptIdstring~ 1024文字API 実行時に同期的に実行される GS2-Script のスクリプト GRN
「grn:gs2:」ではじまる GRN 形式のIDで指定する必要があります。
doneTriggerTargetType文字列列挙型
enum {
  “none”,
  “gs2_script”,
  “aws”
}
“none”非同期スクリプトの実行方法
非同期実行で使用するスクリプトの種類を指定します。
「非同期実行のスクリプトを使用しない(none)」「GS2-Scriptを使用する(gs2_script)」「Amazon EventBridgeを使用する(aws)」が選択できます。
定義説明
noneなし
gs2_scriptGS2-Script
awsAmazon EventBridge
doneTriggerScriptIdstring{doneTriggerTargetType} == “gs2_script”~ 1024文字非同期実行する GS2-Script スクリプト GRN
「grn:gs2:」ではじまる GRN 形式のIDで指定する必要があります。
※ doneTriggerTargetType が “gs2_script” であれば 有効
doneTriggerQueueNamespaceIdstring{doneTriggerTargetType} == “gs2_script”~ 1024文字非同期実行スクリプトを実行する GS2-JobQueue ネームスペース GRN
非同期実行スクリプトを直接実行するのではなく、GS2-JobQueue を経由する場合は GS2-JobQueue のネームスペースGRN を指定します。
GS2-JobQueue を利用する理由は多くはありませんので、特に理由がなければ指定する必要はありません。
※ doneTriggerTargetType が “gs2_script” であれば 有効

NotificationSetting

プッシュ通知に関する設定

GS2 のマイクロサービス内で何らかのイベントが発生した際に、プッシュ通知を送信するための設定です。
ここでいうプッシュ通知は GS2-Gateway の提供する WebSocket インターフェースを経由した処理であり、スマートフォンのプッシュ通知とは性質が異なります。
たとえば、マッチメイキングが完了した時やフレンドリクエストが届いた時など、ゲームクライアントの操作とは関係なく状態が変化した際に GS2-Gateway を経由してプッシュ通知をすることで、ゲームクライアントは状態の変化を検知することができます。

GS2-Gateway のプッシュ通知は通知先のデバイスがオフラインだった時に追加の処理としてモバイルプッシュ通知を送信できます。
モバイルプッシュ通知をうまく利用すれば、マッチメイキング中にゲームを終了しても、モバイルプッシュ通知を使用してプレイヤーに通知し、ゲームに戻ってくるフローを実現できる可能性があります。

有効化条件必須デフォルト値の制限説明
gatewayNamespaceIdstring“grn:gs2:{region}:{ownerId}:gateway:default”~ 1024文字プッシュ通知に使用する GS2-Gateway のネームスペース
「grn:gs2:」から始まる GRN 形式で GS2-Gateway のネームスペースIDを指定します。
enableTransferMobileNotificationbool?falseモバイルプッシュ通知へ転送するか
この通知を送信しようとした時、通知先のデバイスがオフラインだった場合、モバイルプッシュ通知へ転送するかどうかを指定します。
soundstring{enableTransferMobileNotification} == true~ 1024文字モバイルプッシュ通知で使用するサウンドファイル名
ここで指定したサウンドファイル名は、モバイルプッシュ通知を送信する際に使用され、特別なサウンドで通知を出すことができます。
※ enableTransferMobileNotification が true であれば 有効
mobileNotificationMessagesList<MobileNotificationMessage>{enableTransferMobileNotification} == true0 ~ 100 itemsモバイルプッシュ通知へ転送するときの言語別のタイトルと本文
オフラインのプレイヤーへモバイルプッシュ通知として転送するときの、言語別のタイトルと本文です。
デバイストークンに登録された locale に一致するエントリ → default → 先頭 の順に採用します。
未設定なら通知の payload の mobile 配列、それも無ければ payload をそのまま本文にします。
※ enableTransferMobileNotification が true であれば 有効
enable文字列列挙型
enum {
  “Enabled”,
  “Disabled”
}
“Enabled”プッシュ通知を有効にするか
定義説明
Enabled有効
Disabled無効

LogSetting

ログの出力設定

ログデータの出力設定を管理します。この型は、ログデータを書き出すために使用される GS2-Log ネームスペースの識別子(Namespace ID)を保持します。
ログネームスペースID(loggingNamespaceId)には、ログデータを収集し保存する GS2-Log のネームスペースを、GRNの形式で指定します。
この設定をすることで、設定されたネームスペース内で発生したAPIリクエスト・レスポンスのログデータが、対象の GS2-Log ネームスペース側へ出力されるようになります。
GS2-Log ではリアルタイムでログが提供され、システムの監視や分析、デバッグなどに利用できます。

有効化条件必須デフォルト値の制限説明
loggingNamespaceIdstring
~ 1024文字ログを出力する GS2-Log のネームスペース GRN
「grn:gs2:」ではじまる GRN 形式のIDで指定する必要があります。

TransactionSetting

トランザクション設定

トランザクション設定は非推奨です。トランザクション設定(V2)がこれに置き換わります。トランザクション設定(V2)が存在しなかった頃に作成されたネームスペースのために残されており、トランザクション設定(V2)が設定されていない間だけ適用されます。新しく作成するネームスペースでは使用しないでください。

この設定は、トランザクションの実行に関わる要素――自動実行(AutoRun)、アトミック実行(AtomicCommit)、GS2-Distributor を利用した非同期実行、スクリプト結果の一括適用、GS2-JobQueue による入手アクションの非同期化、直列実行――をそれぞれ個別の項目として公開しているため、推奨構成以外の組み合わせも作れます。その推奨構成を 1 つの設定としてまとめたものがトランザクション設定(V2)です。トランザクション設定を使い続けるのは、トランザクション設定(V2)が提供しない挙動――トランザクションをクライアント実行のスタンプシートとして実行する、GS2-Distributor による AutoRun の非同期実行を行う、入手アクションを GS2-JobQueue に畳み込む――にすでに依存しているネームスペースに限ってください。

有効化条件必須デフォルト値の制限説明
enableAutoRunboolfalse発行したトランザクションをサーバーサイドで自動的に実行するか
enableAtomicCommitbool{enableAutoRun} == truefalseトランザクションの実行をアトミックにコミットするか
※ enableAutoRun が true であれば 有効
transactionUseDistributorbool{enableAtomicCommit} == truefalseトランザクションを非同期処理で実行する
※ enableAtomicCommit が true であれば 有効
commitScriptResultInUseDistributorbool{transactionUseDistributor} == truefalseスクリプトの結果コミット処理を非同期処理で実行するか
※ transactionUseDistributor が true であれば 有効
acquireActionUseJobQueuebool{enableAtomicCommit} == truefalse入手アクションを実行する際に GS2-JobQueue を使用するか
※ enableAtomicCommit が true であれば 有効
enableSequentialExecutionbool{enableAtomicCommit} == truefalseアトミックコミットのアクションを直列に実行し、同じ行を複数のアクションで更新できるようにするか
※ enableAtomicCommit が true であれば 有効
distributorNamespaceIdstring“grn:gs2:{region}:{ownerId}:distributor:default”~ 1024文字トランザクションの実行に使用する GS2-Distributor ネームスペース GRN
queueNamespaceIdstring“grn:gs2:{region}:{ownerId}:queue:default”~ 1024文字トランザクションの実行に使用する GS2-JobQueue のネームスペース GRN

MobileNotificationMessage

モバイルプッシュ通知の言語別メッセージ

通知をモバイルプッシュ通知へ転送する際に使用する、言語別メッセージリストの 1 要素です。1 つの要素が 1 つのロケールに対するタイトルと本文を保持します。
採用される要素は、Firebase デバイストークンに登録されたロケールと locale が一致する要素 → localedefault の要素 → リストの先頭の要素、の順で選択されます。

有効化条件必須デフォルト値の制限説明
localestring~ 32文字メッセージの言語
この要素がどの言語に対するものかを表します。Firebase デバイストークンに登録されたロケールと照合されます。jaen のような任意の文字列を指定できます。default は特別な値で、端末のロケールに一致する要素がなかったときに使われるフォールバックの要素であることを表します。
titlestring~ 256文字プッシュ通知のタイトル
この要素が採用されたときに、モバイルプッシュ通知のタイトルとして表示されるテキストです。省略した場合は、通知の件名が使用されます。
messagestring~ 1024文字プッシュ通知の本文
この要素が採用されたときに、モバイルプッシュ通知の本文として表示されるテキストです。