複数ステートで構成されるワークフローでは、各ステートは前のステートの出力を入力として受け取ります。仮に、ステート A が生成した値を、遠く離れたステート Z のみが必要とする場合でも、その値は途中にあるすべての中間ステートを通過しなければなりません。このような値の連鎖 (チェイニング) は、ワークフローを複雑にし、メンテナンスを困難にします。
グローバル変数はこの問題を解決します。任意のステートで値を保存し、他の任意のステートからチェーン全体をバイパスして直接その値を読み取ることができます。
クイックリファレンス
| 操作 | 構文 | 例 |
|---|---|---|
| 書き込み | GlobalConstructor 状態定義内 | myVar.$: $Output.Body |
| 読み取り | $Global.<key> 式 | $Global.myVar |
| キーの最大長 | 128 Bytes | -- |
| 値の最大サイズ | 256 KiB | -- |
仕組み
グローバル変数は、実行レベルのキーバリューストアを提供します。任意のステートが終了時にこのストレージにデータを書き込むことができ、後続の任意のステートが入力チェーンを介してデータを受け取ることなく、そのデータを直接読み取ることができます。
コンストラクター
CloudFlow は、ステート内およびステート間でデータフローを管理するために、3 つのコンストラクターを使用します。
| コンストラクター | 目的 | 使用するケース |
|---|---|---|
GlobalConstructor | グローバルストレージに値を書き込む | 隣接していないステート間でデータを共有する |
InputConstructor | ステートへの入力データを再形成する | ステートが実行される前に入力をフィルターまたは再構築する |
OutputConstructor | ステートからの出力データを再形成する | 次のステートに渡す前に出力をフィルターまたは再構築する |
3 つのコンストラクターはすべて、$Context と $Global の両方を参照して情報を抽出できます。
次の図は、コンストラクターがステート内でどのように相互作用するかを示しています。
主な動作:
$Outputは、Task 呼び出しの生の結果です。非同期コールバックタスクの場合、$Outputにはコールバックの結果が含まれます。GlobalConstructorが実行されると、その出力は既存の$Globalの値とマージされます:$Global = Merge($Global, GlobalConstructor($Context, $Global))。$Globalは、ワークフローの実行全体を通じてアクセス可能です。
評価順序
コンストラクターは、各ステート内で固定された順序で評価されます。GlobalConstructor と OutputConstructor は $Output と $Global の異なるスナップショットを読み取るため、この順序を理解することが非常に重要です。
Task が実行され、
$Output(生のタスク結果) を生成します。GlobalConstructorが評価されます。ここでは$Output(生のタスク結果であり、OutputConstructorの結果ではありません) を使用します。OutputConstructorが評価されます。ここでは$Global(GlobalConstructorが更新する前の値) を使用します。
具体例:
ある Task ステートが $Output = {"status": "ok", "data": {"id": 42}} を返します。現在のグローバルストレージは $Global = {"previousId": 10} です。
GlobalConstructor:
latestId.$: $Output.data.id # 42 を $Global.latestId に書き込みます
OutputConstructor:
combined.$: $Global.previousId # 10 (GlobalConstructor が実行される前の値) を読み取りますこのステートが完了した後:
$Global={"previousId": 10, "latestId": 42}(マージ済み)ステートの出力 =
{"combined": 10}(更新前の$Globalの値を使用)
$Output in GlobalConstructor は、Task ステートの生の結果を指し、OutputConstructor の結果ではありません。同様に、$Global in OutputConstructor は、GlobalConstructor が値を更新する前の値を指します。
グローバル変数の書き込み
グローバル変数を書き込むには GlobalConstructor を使用します。これは各ステートの実行の最後に実行され、そのデータ構造は Map[String]Any です。
次の例では、関数の応答のヘッダーとボディを、それぞれ別のグローバル変数として保存します。
Type: StateMachine
Name: MyWorkFlow
SpecVersion: v1
StartAt: InvokeFunction
States:
- Type: Task
Name: InvokeFunction
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: >-
acs:fc:cn-hangzhou:123456:functions/myFunction/LATEST
invocationType: Sync
body.$: $Input
GlobalConstructor:
InvokeFunctionResultHeader.$: $Output.Header # レスポンスヘッダーを保存
InvokeFunctionResultBody.$: $Output.Body # レスポンスボディを保存
End: trueこの定義では:
InvokeFunctionResultHeader.$: $Output.Headerは、関数のレスポンスヘッダーをInvokeFunctionResultHeaderグローバル変数に保存します。InvokeFunctionResultBody.$: $Output.Bodyは、関数のレスポンスボディをInvokeFunctionResultBodyグローバル変数に保存します。
グローバル変数の読み取り
グローバル変数を読み取るには、$Global キーワードを使用します。構築をサポートする任意の式は、$Global.<key> を通じてグローバルストレージにアクセスできます。
次の例は、最初のステートがグローバル変数を書き込み、2 番目のステートがそれを読み取る、2 つのステートからなるワークフローを示しています。
Type: StateMachine
Name: MyWorkFlow
SpecVersion: v1
StartAt: InvokeFunction1
States:
- Type: Task
Name: InvokeFunction1
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
invocationType: Sync
resourceArn: acs:fc:cn-hangzhou:123456:functions/myFunction/LATEST
GlobalConstructor:
InvokeFunctionPayload.$: $Output.Body # 後で使用するためにレスポンスボディを保存
Next: InvokeFunction
- Type: Task
Name: InvokeFunction
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: acs:fc:cn-hangzhou:123456:functions/myFunction/LATEST
invocationType: Sync
body.$: $Global.InvokeFunctionPayload # 保存された値を入力として読み取り
OutputConstructor:
demo.$: $Global # グローバルストレージ全体を出力
End: trueこの定義では:
InvokeFunction1は、そのレスポンスボディをInvokeFunctionPayloadグローバル変数に保存します。InvokeFunctionは$Global.InvokeFunctionPayloadを読み取り、それをbodyパラメーターとして関数の呼び出しに渡します。OutputConstructorは、$Globalの全コンテンツをステート出力のdemoフィールドにマッピングします。
グローバル変数の値は、CloudFlow コンソールで実行出力を確認することで検証できます。

制限事項
| 項目 | 最大値 |
|---|---|
| 変数キーの長さ | 128 Bytes |
| 変数値の長さ | 256 KiB |
コンテキストサイズ (InputConstructor と OutputConstructor の出力が $Global を使用する場合) | 64 KiB |
これらの制限がお客様のニーズを満たさない場合は、チケットを送信して上限緩和をリクエストしてください。
$Global を介してデータを渡す場合、InputConstructor と OutputConstructor の両方の出力は、64 KiB のコンテキストサイズの制限内に収める必要があります。
並列実行における競合状態
グローバル変数は、1 つの実行内のすべてのステートで共有されます。並列ロジック (Parallel または Map ステート) が存在する場合、同時書き込みによって互いに上書きされる可能性があります。以下のガイドラインに従ってください。
| シナリオ | ガイダンス |
|---|---|
| Parallel ステート | ブランチごとに一意キーを使用します。各ブランチは、上書きを避けるために独自のキーに書き込みます。 |
| Map ステート | グローバル変数を書き込まないでください。すべての反復は同じ GlobalConstructor 定義を共有するため、同じキーに書き込み、互いに上書きしてしまいます。 |
| 分散サブ実行 | 分散モードのサブ実行は、親エグゼキューションのグローバル変数にアクセスできません。これらは異なる Execution レベルで実行され、個別のグローバルストレージを持ちます。 |