GS2 States Language 定義拡張
GS2 States Language を CDK で定義するための拡張構文について
ネームスペース
ネームスペースは一つのプロジェクトで同じサービスを異なる用途で複数利用できるようにするための仕組みです。
GS2 のサービスは基本的にネームスペースというレイヤーがあり、ネームスペースが異なれば同じサービスでもまったく別のデータ空間として取り扱われます。
そのため、各サービスの利用を開始するにあたってネームスペースを作成する必要があります。
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
name | string | ✓ | ~ 128文字 | ネームスペース名 | |
description | string | ~ 1024文字 | 説明文 | ||
supportSpeculativeExecution | string | ✓ | “disable” | ~ 128文字 | 投機的実行をサポートするか |
transactionSetting | TransactionSetting | {supportSpeculativeExecution} == “enable” | トランザクション設定 | ||
startScript | ScriptSetting | ステートマシンを起動した時に実行するスクリプト | |||
passScript | ScriptSetting | ステートマシンが正常終了した時に実行するスクリプト | |||
errorScript | ScriptSetting | ステートマシンが異常終了した時に実行するスクリプト | |||
lowestStateMachineVersion | long | ステートマシンの最低バージョン | |||
logSetting | LogSetting | ログの出力設定 |
定義 | 説明 |
---|---|
enable | 有効 |
disable | 無効 |
型 | 説明 | |
---|---|---|
Item | Namespace | 作成したネームスペース |
Type: GS2::StateMachine::Namespace
Properties:
Name: namespace-0001
Description: null
SupportSpeculativeExecution: null
TransactionSetting: null
StartScript: null
PassScript: null
ErrorScript: null
LowestStateMachineVersion: null
LogSetting:
LoggingNamespaceId: grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001
import "github.com/gs2io/gs2-golang-cdk/core"
import "github.com/gs2io/gs2-golang-cdk/state_machine"
import "github.com/openlyinc/pointy"
SampleStack := core.NewStack()
stateMachine.NewNamespace(
&SampleStack,
"namespace-0001",
stateMachine.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\StateMachine\Model\Namespace_(
stack: $this,
name: "namespace-0001",
options: new \Gs2Cdk\StateMachine\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.stateMachine.model.Namespace(
this,
"namespace-0001",
new io.gs2.cdk.stateMachine.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.Gs2StateMachine.Model.Namespace(
stack: this,
name: "namespace-0001",
options: new Gs2Cdk.Gs2StateMachine.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 stateMachine from "@/gs2cdk/stateMachine";
class SampleStack extends core.Stack
{
public constructor() {
super();
new stateMachine.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, state_machine
class SampleStack(Stack):
def __init__(self):
super().__init__()
state_machine.Namespace(
stack=self,
name='namespace-0001',
options=state_machine.NamespaceOptions(
log_setting=core.LogSetting(
logging_namespace_id='grn:gs2:ap-northeast-1:YourOwnerId:log:namespace-0001',
),
),
)
print(SampleStack().yaml()) # Generate Template
ステートマシン定義
GSLで記述されたステートマシンを管理します。
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
namespaceName | string | ✓ | ~ 128文字 | ネームスペース名 | |
mainStateMachineName | string | ✓ | ~ 128文字 | メインステートマシン名 | |
payload | string | ✓ | ~ 5242880文字 | ステートマシン定義 |
型 | 説明 | |
---|---|---|
Item | StateMachineMaster | 作成したステートマシンマスター |
Type: GS2::StateMachine::StateMachineMaster
Properties:
NamespaceName: namespace-0001
MainStateMachineName: MainStateMachine
Payload: \nStateMachine MainStateMachine {\n EntryPoint Task1;\n\n Task Task1(int initCounter) {\n Event Pass();\n Event Error(string Reason);\n\n Script grn:gs2:ap-northeast-1:YourOwnerId:script:state-machine-0001:script:Task1\n }\n\n PassTask Pass;\n\n ErrorTask Error(string reason);\n\n Transition Task1 handling Pass -> Pass;\n Transition Task1 handling Error -> Error;\n}\n
import "github.com/gs2io/gs2-golang-cdk/core"
import "github.com/gs2io/gs2-golang-cdk/state_machine"
import "github.com/openlyinc/pointy"
SampleStack := core.NewStack()
stateMachine.NewStateMachineMaster(
&SampleStack,
"namespace-0001",
"MainStateMachine",
"\nStateMachine MainStateMachine {\n EntryPoint Task1;\n\n Task Task1(int initCounter) {\n Event Pass();\n Event Error(string Reason);\n\n Script grn:gs2:ap-northeast-1:YourOwnerId:script:state-machine-0001:script:Task1\n }\n\n PassTask Pass;\n\n ErrorTask Error(string reason);\n\n Transition Task1 handling Pass -> Pass;\n Transition Task1 handling Error -> Error;\n}\n ",
)
println(SampleStack.Yaml()) // Generate Template
class SampleStack extends \Gs2Cdk\Core\Model\Stack
{
function __construct() {
parent::__construct();
new \Gs2Cdk\StateMachine\Model\StateMachineMaster(
stack: $this,
namespaceName: "namespace-0001",
mainStateMachineName: "MainStateMachine",
payload: "\nStateMachine MainStateMachine {\n EntryPoint Task1;\n\n Task Task1(int initCounter) {\n Event Pass();\n Event Error(string Reason);\n\n Script grn:gs2:ap-northeast-1:YourOwnerId:script:state-machine-0001:script:Task1\n }\n\n PassTask Pass;\n\n ErrorTask Error(string reason);\n\n Transition Task1 handling Pass -> Pass;\n Transition Task1 handling Error -> Error;\n}\n "
);
}
}
print((new SampleStack())->yaml()); // Generate Template
class SampleStack extends io.gs2.cdk.core.model.Stack
{
public SampleStack() {
super();
new io.gs2.cdk.stateMachine.model.StateMachineMaster(
this,
"namespace-0001",
"MainStateMachine",
"\nStateMachine MainStateMachine {\n EntryPoint Task1;\n\n Task Task1(int initCounter) {\n Event Pass();\n Event Error(string Reason);\n\n Script grn:gs2:ap-northeast-1:YourOwnerId:script:state-machine-0001:script:Task1\n }\n\n PassTask Pass;\n\n ErrorTask Error(string reason);\n\n Transition Task1 handling Pass -> Pass;\n Transition Task1 handling Error -> Error;\n}\n "
);
}
}
System.out.println(new SampleStack().yaml()); // Generate Template
public class SampleStack : Gs2Cdk.Core.Model.Stack
{
public SampleStack() {
new Gs2Cdk.Gs2StateMachine.Model.StateMachineMaster(
stack: this,
namespaceName: "namespace-0001",
mainStateMachineName: "MainStateMachine",
payload: "\nStateMachine MainStateMachine {\n EntryPoint Task1;\n\n Task Task1(int initCounter) {\n Event Pass();\n Event Error(string Reason);\n\n Script grn:gs2:ap-northeast-1:YourOwnerId:script:state-machine-0001:script:Task1\n }\n\n PassTask Pass;\n\n ErrorTask Error(string reason);\n\n Transition Task1 handling Pass -> Pass;\n Transition Task1 handling Error -> Error;\n}\n "
);
}
}
Debug.Log(new SampleStack().Yaml()); // Generate Template
import core from "@/gs2cdk/core";
import stateMachine from "@/gs2cdk/stateMachine";
class SampleStack extends core.Stack
{
public constructor() {
super();
new stateMachine.model.StateMachineMaster(
this,
"namespace-0001",
"MainStateMachine",
"\nStateMachine MainStateMachine {\n EntryPoint Task1;\n\n Task Task1(int initCounter) {\n Event Pass();\n Event Error(string Reason);\n\n Script grn:gs2:ap-northeast-1:YourOwnerId:script:state-machine-0001:script:Task1\n }\n\n PassTask Pass;\n\n ErrorTask Error(string reason);\n\n Transition Task1 handling Pass -> Pass;\n Transition Task1 handling Error -> Error;\n}\n "
);
}
}
console.log(new SampleStack().yaml()); // Generate Template
from gs2_cdk import Stack, core, state_machine
class SampleStack(Stack):
def __init__(self):
super().__init__()
state_machine.StateMachineMaster(
stack=self,
namespace_name='namespace-0001',
main_state_machine_name='MainStateMachine',
payload='\nStateMachine MainStateMachine {\n EntryPoint Task1;\n\n Task Task1(int initCounter) {\n Event Pass();\n Event Error(string Reason);\n\n Script grn:gs2:ap-northeast-1:YourOwnerId:script:state-machine-0001:script:Task1\n }\n\n PassTask Pass;\n\n ErrorTask Error(string reason);\n\n Transition Task1 handling Pass -> Pass;\n Transition Task1 handling Error -> Error;\n}\n ',
)
print(SampleStack().yaml()) # Generate Template
スタック
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
stateMachineName | string | ✓ | ~ 128文字 | ステートマシン名 | |
taskName | string | ✓ | ~ 128文字 | タスク名 |
ステートマシンごとの状態変数
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
stateMachineName | string | ✓ | ~ 128文字 | ステートマシン名 | |
value | string | ✓ | ~ 1048576文字 | 値 |
トランザクション設定
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
enableAutoRun | bool | ✓ | false | 発行したトランザクションをサーバーサイドで自動的に実行するか | |
enableAtomicCommit | bool | {enableAutoRun} == true | false | トランザクションの実行をアトミックにコミットするか | |
transactionUseDistributor | bool | {enableAtomicCommit} == true | false | トランザクションを非同期処理で実行する | |
acquireActionUseJobQueue | bool | {enableAtomicCommit} == true | false | 入手アクションを実行する際に GS2-JobQueue を使用するか | |
distributorNamespaceId | string | ✓ | “grn:gs2:{region}:{ownerId}:distributor:default” | ~ 1024文字 | トランザクションの実行に使用する GS2-Distributor ネームスペース |
queueNamespaceId | string | ✓ | “grn:gs2:{region}:{ownerId}:queue:default” | ~ 1024文字 | トランザクションの実行に使用する GS2-JobQueue のネームスペース |
イベント
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
eventType | enum { “change_state”, “emit” } | ✓ | ~ 128文字 | イベントの種類 | |
changeStateEvent | ChangeStateEvent | {eventType} == “change_state” | ステートの変更 | ||
emitEvent | EmitEvent | {eventType} == “emit” | メッセージの送信 |
定義 | 説明 |
---|---|
change_state | ステートの変更 |
emit | メッセージの送信 |
ステートの変更イベント
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
taskName | string | ✓ | ~ 128文字 | タスク名 | |
hash | string | ✓ | ~ 64文字 | ハッシュ | |
timestamp | long | ✓ | タイムスタンプ (UNIX時間 単位:ミリ秒) |
メッセージの送信イベント
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
event | string | ✓ | ~ 128文字 | イベント名 | |
parameters | string | ✓ | ~ 1024文字 | パラメータ | |
timestamp | long | ✓ | タイムスタンプ (UNIX時間 単位:ミリ秒) |
乱数の状態
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
seed | long | ✓ | ~ 4294967294 | 乱数シード | |
used | List<RandomUsed> | ~ 1000 items | 使用済み乱数リスト |
使用済み乱数
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
category | long | ✓ | ~ 4294967294 | カテゴリ | |
used | long | ✓ | ~ 4294967294 | 使用済み乱数 |
検証アクションの実行結果
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
action | enum { } | ✓ | ~ 128文字 | 検証アクションで実行するアクションの種類 | |
verifyRequest | string | ✓ | ~ 1048576文字 | リクエストのJSON | |
statusCode | int | ~ 999 | ステータスコード | ||
verifyResult | string | ~ 1048576文字 | 結果内容 |
定義 | 説明 |
---|
消費アクションの実行結果
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
action | enum { } | ✓ | ~ 128文字 | 消費アクションで実行するアクションの種類 | |
consumeRequest | string | ✓ | ~ 1048576文字 | リクエストのJSON | |
statusCode | int | ~ 999 | ステータスコード | ||
consumeResult | string | ~ 1048576文字 | 結果内容 |
定義 | 説明 |
---|
入手アクションの実行結果
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
action | enum { } | ✓ | ~ 128文字 | 入手アクションで実行するアクションの種類 | |
acquireRequest | string | ✓ | ~ 1048576文字 | リクエストのJSON | |
statusCode | int | ~ 999 | ステータスコード | ||
acquireResult | string | ~ 1048576文字 | 結果内容 |
定義 | 説明 |
---|
トランザクション実行結果
サーバーサイドでのトランザクションの自動実行機能を利用して実行されたトランザクションの実行結果
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
transactionId | string | ✓ | 36 ~ 36文字 | トランザクションID | |
verifyResults | List<VerifyActionResult> | ~ 10 items | 検証アクションの実行結果リスト | ||
consumeResults | List<ConsumeActionResult> | ~ 10 items | 消費アクションの実行結果リスト | ||
acquireResults | List<AcquireActionResult> | ~ 100 items | 入手アクションの実行結果リスト |
ログの書き出し設定
ログデータの書き出し設定を管理します。この型は、ログデータを書き出すために使用されるログ名前空間の識別子(Namespace ID)を保持します。
ログ名前空間IDは、ログデータを集約し、保存する対象の GS2-Log の名前空間を指定します。
この設定を通じて、この名前空間以下のAPIリクエスト・レスポンスログデータが対象の GS2-Log へ出力されるようになります。
GS2-Log にはリアルタイムでログが提供され、システムの監視や分析、デバッグなどに利用できます。
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
loggingNamespaceId | string | ✓ | ~ 1024文字 | ネームスペースGRN |
スクリプト設定
GS2 ではマイクロサービスのイベントに関連づけて、カスタムスクリプトを実行することができます。
このモデルは、スクリプトの実行をトリガーするための設定を保持します。
スクリプトの実行方式は大きく2種類あり、それは「同期実行」と「非同期実行」です。
同期実行は、スクリプトの実行が完了するまで処理がブロックされます。
かわりに、スクリプトの実行結果を使ってAPIの実行を止めたり、APIの結果を改ざんすることができます。
一方、非同期実行は、スクリプトの実行が完了するまで処理がブロックされません。
かわりに、スクリプトの実行結果を使ってAPIの実行を止めたり、APIの結果を改ざんすることはできません。
しかし、非同期実行は、スクリプトの実行が完了するまで処理がブロックされないため、APIの応答に影響を与えないため、原則非同期実行を使用することをおすすめします。
非同期実行には実行方式が2種類あり、GS2-Script と Amazon EventBridge があります。
Amazon EventBridge を使用することで、Lua 以外の言語で処理を記述することができます。
型 | 必須 | デフォルト | 値の制限 | 説明 | |
---|---|---|---|---|---|
triggerScriptId | string | ~ 1024文字 | スクリプトGRN | ||
doneTriggerTargetType | enum { “none”, “gs2_script”, “aws” } | ✓ | “none” | ~ 128文字 | 完了通知の通知先 |
doneTriggerScriptId | string | {doneTriggerTargetType} == “gs2_script” | ~ 1024文字 | スクリプトGRN | |
doneTriggerQueueNamespaceId | string | {doneTriggerTargetType} == “gs2_script” | ~ 1024文字 | ネームスペースGRN |
定義 | 説明 |
---|---|
none | なし |
gs2_script | GS2-Script |
aws | Amazon EventBridge |
GS2 States Language を CDK で定義するための拡張構文について