CloudFlow は、ワークフロー内のステート間でデータを受け渡します。ステートは、前のステートから提供された入力を受け取り、出力を返し、次のステートに渡します。このトピックでは、ワークフローにおける入力と出力について説明します。
背景情報
CloudFlow のワークフロー内のデータは、あるステートから別のステートへと流れます。これは、関数型プログラミングにおける関数呼び出しに似ています。各ステートは入力を受け取り、出力を返します。出力データはコンテキストに保存されます。ステート間のデータフローにより、複雑なロジックを必要とする業務アプリケーションのプロセスを自動化できます。
入力と出力は JSON オブジェクトである必要があります。ステートの入力と出力のサイズは 64 KiB を超えることはできません。ステートの入力と出力のサイズが 64 KiB を超える場合、ワークフローは実行に失敗します。
実行の入力と出力
実行の入力
実行を開始するには、情報またはデータを指定する必要があります。指定した情報またはデータは、1 つ以上のステートの入力として使用できます。ワークフローオーケストレーション中に $Context.Execution.Input システム式を使用すると、実行の入力にアクセスできます。
たとえば、オンラインの学生入学手続きシステムのロジックが「学生情報の収集」「学生情報の検証」「学生の入学手続き」という 3 つのプロセスで構成されているとします。各プロセスでは学生の基本情報が必要です。この場合、学生の基本情報を実行の入力として渡し、対応する 3 つのステートを設定して、システム式を使用して実行入力にアクセスできます。
[フローを実行] ダイアログボックスで、[実行名] を test に設定します。[実行入力] セクションで、JSON エディターに学生の基本情報を含む JSON オブジェクトを入力します。この JSON オブジェクトには、name、age、gender、country、city、occupation、hobbies (配列)、isActive (ブール値) などのフィールドが含まれます。
実行の出力
実行の出力は、成功した実行の結果です。ワークフローオーケストレーション中にシステム変数を使用して実行の出力にアクセスすることはできません。
ステートの入力と出力
ステートの入力
ワークフローオーケストレーション中に $Context.Current.Input システム式、またはその短縮形である $Input を使用して、現在のステートの入力にアクセスできます。
ステートの出力
ワークフローオーケストレーション中に $Context.Current.Output システム式、またはその短縮形である $Output を使用して、現在のステートの出力にアクセスできます。短縮形の $Output は、出力コンストラクターのスコープ内でのみ使用できます。
コンストラクター
コンストラクターで使用できるシステム式
次のシステム式をコンストラクターで使用できます:
$Context:$Context のライフサイクルは、ワークフローの実行期間全体と同じです。
$Contextの詳細については、「データの受け渡し」をご参照ください。$Input:$Input のライフサイクルは、ワークフローがステートに入った時点で開始し、ワークフローがステートから出た時点で終了します。$Input は
$Context.Current.Inputの短縮形です。$Output:$Output のライフサイクルは、ワークフローが Task 呼び出し応答ステートに入った時点で開始し、ワークフローがステートから出た時点で終了します。$Output は
$Context.Current.Outputの短縮形です。$Global:$Global のライフサイクルは、ワークフローの実行期間全体と同じです。
$Globalの詳細については、「グローバル変数」をご参照ください。
入力コンストラクター、出力コンストラクター、またはパラメーターコンストラクターで、キーの末尾が
.$で終わる場合は、式の形式で値を割り当てる必要があります。そうでない場合、エラーが発生します。$で始まる組み込み関数またはシステム変数を使用する場合は、変数が文字列として扱われないように、変数キーの末尾に.$を付加します。入力コンストラクターまたは出力コンストラクターでは、組み込み関数のネストは最大
10階層までサポートされます。
次の図は、$Input、$Output、$Context、$Global の各システム式のライフサイクルと、異なるステートにおける割り当てプロセスを示しています。
$Inputは実行の入力です。前述の図の
$Input=InputConstructor($Context, $Global)は、スコープ内でInputConstructorが$Contextと$Globalを参照し、それらから情報を抽出できることを示します。構築結果は$Inputに割り当てられます。$Outputは Task 呼び出しの結果です。呼び出しが非同期コールバックモードで開始された場合、$Outputの値はコールバックの結果です。$Output=OutputConstructor($Context, $Global)は、スコープ内でOutputConstructorが$Contextと$Globalを参照し、それらから情報を抽出できることを示します。構築結果は$Outputに割り当てられます。$Globalはグローバル変数を示し、ワークフローの実行期間全体でアクセスできます。$Global = Merge($Global, GlobalConstructor($Context, $Global))は、グローバルコンストラクターで構築された変数を$Global内の既存の変数とマージし、その後すべての変数を$Globalに保存することで共有グローバル変数を更新することを示します。$Contextは実行期間全体で有効です。
入力コンストラクター
InputConstructor はワークフローの入力を構築します。InputConstructor の式は、Choice ステートの条件式とは異なります。条件式はブール値のみを返すことができますが、InputConstructor の式は任意の値を返すことができます。ステートの InputConstructor では、次のシステム変数を使用できます:
$Context
$Input
$Global
複数の入力構成が存在する場合、入力の優先順位は、高い順に InputConstructor、ItemsPath、ItemConstructor となります。
次のステートマシン定義は、InputConstructor の使用方法の例を示しています。
Type: StateMachine
Name: test3-tx
SpecVersion: v1
StartAt: InvokeFunction1
States:
- Type: Task
Name: InvokeFunction
Action: FC:InvokeFunction
TaskMode: RequestComplete
InputConstructor:
FieldA.$: $Context.Execution.Input
FieldB: World
FieldC.$: length($Context.Execution.Input)
FieldD.$: $Global.InvokeFunctionPayload
Parameters:
resourceArn: >-
acs:fc:cn-hangzhou:123456:functions/myFunction1/LATEST
invocationType: Sync
body.$: $Input
End: true
- Type: Task
Name: InvokeFunction1
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
invocationType: Sync
resourceArn: acs:fc:cn-hangzhou:123456:functions/myFunction1/LATEST
GlobalConstructor:
InvokeFunctionPayload.$: $Output.Body
Next: InvokeFunction
前述の例では、
InputConstructorのデータ構造は Map[String]Any です。FieldA.$: $Context.Execution.Inputは、FieldA キーが文字列として扱われるのではなく、$Context.Execution.Inputから値を動的に取得することを示します。FieldB: Worldは、静的な文字列「World」が FieldB に割り当てられることを示します。FieldB キーの末尾が .$ マーカーで終わらないため、値は動的に取得されません。FieldC.$: length($Context.Execution.Input)は、組み込み関数 length を使用して$Context.Execution.Inputの値の長さを取得し、その長さを FieldC に割り当てることを示します。コンストラクターで使用できる組み込み関数の詳細については、「組み込み関数」をご参照ください。FieldD.$: $Global.InvokeFunctionPayload式は、グローバルストレージ空間のInvokeFunctionPayloadキーの値を抽出し、その値をFieldDフィールドとしてTaskステートに渡します。
出力コンストラクター
入力コンストラクターと比較すると、出力コンストラクターは実行されるタイミングが異なり、コンテキスト式でより多くの変数を利用できます。たとえば、入力コンストラクターでは $Context、$Input、および $Global を使用できますが、出力コンストラクターでは、Task 呼び出しによってすでに出力が生成されているため、出力を表す $Output を使用できます。ステートの出力コンストラクターでは、次のシステム変数を使用できます:
$Context
$Input
$Output
$Global
次のステートマシン定義は、OutputConstructor の使用方法の例を示しています。
Type: StateMachine
Name: test3-tx
SpecVersion: v1
StartAt: InvokeFunction1
States:
- Type: Task
Name: InvokeFunction1
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
invocationType: Sync
resourceArn: acs:fc:cn-hangzhou:123456:functions/myFunction1/LATEST
GlobalConstructor:
InvokeFunctionPayload.$: $Output.Body
Next: InvokeFunction
- Type: Task
Name: InvokeFunction
Action: FC:InvokeFunction
TaskMode: RequestComplete
Parameters:
resourceArn: >-
acs:fc:cn-hangzhou:123456:functions/myFunction1/LATEST
invocationType: Sync
body.$: $Input
OutputConstructor:
returnID.$: uuid()
functionResult.$: $Output
functionResultStr.$: jsonToString($Output)
executionInput.$: $Context.Execution.Input
lastOutput.$: $Input
demo.$: $Global
End: true
前述の例では、出力コンストラクターのデータ構造は map[string]any です。
functionResult.$はステートの出力を動的に取得し、executionInput.$は実行の入力を動的に取得し、lastOutput.$はステートの入力を動的に取得します。returnID.$は一意の ID を取得し、functionResultStr.$はステートの出力から作成された文字列を取得します。