このトピックでは、入力と出力の基本について説明します。
フローとステップ
通常、データはフローとステップ間、およびフローの複数のステップ間で渡される必要があります。Flow Definition Language(FDL)のステップは、関数型プログラミング言語の関数に似ています。これらのステップは入力を受け入れて出力を生成し、出力は親ステップ(呼び出し元)のローカル変数に格納されます。入力と出力は JSON オブジェクト構造である必要があり、ローカル変数の型はステップによって異なります。たとえば、タスクステップは関数計算の関数を呼び出した結果をローカル変数として使用しますが、並列ステップはすべてのブランチの出力(配列)をローカル変数として使用します。1 つのステップにおける入力、出力、およびローカル変数の合計サイズは 32 KiB を超えることはできません。超えると、フローの実行は失敗します。
ステップに別のステップが含まれている場合、外側のステップは親ステップと呼ばれ、含まれているステップは子ステップと呼ばれます。最外部ステップの親ステップはフローです。2 つのステップの親ステップが同じである場合、2 つのステップは同じレベルです。
各フローとステップには、入力、出力、およびローカル変数が含まれています。それらのマッピングは、以下のコンテンツにリストされています。
- ステップの
inputMappingsは、親ステップの入力とローカル変数を子ステップの入力にマッピングします。 - ステップの
outputMappingsは、現在のステップの入力とローカル変数を現在のステップの出力にマッピングします。 - フローの
inputMappingsは、フロー実行の入力をフローの入力にマッピングします。 - フローの
outputMappingsは、フローの入力とローカル変数をフローの出力にマッピングします。
親ステップのローカル変数には、すべての子ステップの出力の和集合が含まれています。出力に繰り返されるキー値が含まれている場合、後のステップの結果は前のステップの結果を上書きします。ほとんどの場合、入力と出力のマッピングを指定せずにデフォルトのマッピングを使用できます。
- 入力マッピングが指定されていない場合、子ステップの入力は、親ステップの入力とローカル変数の組み合わせになります(ローカル変数と入力に同じキー値がある場合、ローカル変数が入力を上書きします)。
- 出力マッピングが指定されていない場合、並列ステップと foreach ステップを除くすべてのステップで、ローカル変数が出力として使用されます。
入力と出力をより適切に制御したい場合は、詳細なマッピングルールを理解する必要があります。
次の図は、フロー例の入力と出力のマッピングを示しています。フローでは、step1 は step2 と step3 の親ステップであり、step1 と step4 は最外部ステップです。
version: v1
type: flow
steps:
- type: parallel
name: step1
branches:
- steps:
- type: pass
name: step2
- steps:
- type: pass
name: step3
- type: pass
name: step4

次のコードを使用してマッピングを記述できるため、理解しやすくなります。
func flow(input0 Input) (output0 Output) {
local0 := {}
input1 := buildInput(step1InputMappings, input0, local0)
output1 := step1(input1)
save(local0, output1)
input4 := buildInput(step4InputMappings, input0, local0)
output4 := step4(input4)
save(local0, output4)
return buildOutput(flowOutputMappings, input0, local0)
}
func step1(input1 Input) (output1 Output) {
local10 := {}
input2 := buildInput(step2InputMappings, input1, local10)
output2 := step2(input2)
save(local10, output2)
local11 := {}
input3 := buildInput(step3InputMappings, input1, local11)
output3 := step3(input3)
save(local11, output3)
return buildOutput(step1OutputMappings, [local10, local11])
}
func step2(input2 Input) (output2 Output) {
}
func step3(input3 Input) (output3 Output) {
}
func step4(input4 Input) (output4 Output) {
}
この例では、フローは step1 と step4 の 2 つの子ステップで構成されています。step1 は、step2 と step3 を含む並列ステップです。
- システムがフローの実行を開始すると、フローの入力マッピングに基づいて
StartExecution入力がフロー入力(input0)に変換されます。 flowの実行が開始されると、local0は空になります。- システムは、
input1の入力マッピング(step1InputMappings)に基づいて step1 のinput1入力を準備します。マッピングソースは、input0入力とflowのlocal0ローカル変数です。 - システムは
step1を呼び出してinput1をロードします。step1はoutput1を返します。- システムが
step1の実行を開始すると、そのlocal10は空になります。step1は並列ステップであるため、各ブランチはローカル変数に対応し、同時アクセスを回避します。 - システムは、
step2の入力マッピング(step2InputMappings)に基づいて step2 のinput2入力を準備します。マッピングソースは、input1入力とlocal10step1の ローカル変数です。 - システムは
step2を呼び出してinput2をロードします。step2はoutput2を返します。 - システムは
step2の出力をlocal10step1の ローカル変数に保存します。 - 同様に、システムは
step3を呼び出し、結果をlocal11step1の ローカル変数に保存します。
- システムが
- システムは
step1の出力をlocal0flowの ローカル変数に保存します。 - 同様に、システムは
input4step4の入力マッピングに基づいて step4 のinput0local0フロー入力を準備します。マッピングソースは、 入力と の ローカル変数です。説明 この時点で、local0ローカル変数にはstep1の出力が含まれている場合があります。これにより、step1とstep4間のデータ転送が実現します。 - システムは
step4を呼び出してinput4をロードします。step4はoutput4を返します。 - システムは
step4の出力をlocal0flowの ローカル変数に保存します。 - 最後に、システムはフローの出力マッピングに基づいて
local0をフロー出力に変換します。
型
入力マッピングと出力マッピングはどちらも、target と source で構成される配列です。source はパラメーターソースを定義し、マッピングごとに異なる値に設定されます。たとえば、$input.key は、パラメーターソースが input の $.key の値であることを示します。target はターゲットパラメーターの名前を定義します。source の値が $ で始まる場合、値は JSON パス形式で指定され(JSONPath オンライン評価ツール を使用して JSON パスをデバッグできます)、システムはパスに基づいてソースを特定の値に解析します。それ以外の場合、値は定数と見なされます。
- ソース
sourceは、number、string、boolean、array、object、またはnull型の値などの定数に設定できます。次の例のソースでは、さまざまな型の定数を使用しています。例に続く情報は、出力を示しています。
outputMappings: - target: int_key source: 1 - target: bool_key source: true - target: string_key source: abc - target: float_key source: 1.234 - target: null_key source: null - target: array1 source: [1, 2, 3] - target: array2 source: - 1 - 2 - 3 - target: object1 source: {a: b} - target: object2 source: a: b{ "array1": [1, 2, 3], "array2": [1, 2, 3], "bool_key": true, "float_key": 1.234, "int_key": 1, "null_key": null, "object1": { "a": "b" }, "object2": { "a": "b" }, "string_key": "abc" } - ターゲット
ターゲットは、文字列型の定数のみ可能です。
入力マッピング
入力マッピングは、親ステップの入力($input)、親ステップのローカル変数($local)、または定数を子ステップの入力に変換します。入力マッピングが指定されていない場合、親ステップの入力とローカル変数が組み合わされて子ステップの入力として使用されます。親ステップの入力とローカル変数に同じ名前がある場合、新しい入力はローカル変数の名前と値を使用します。
inputMappings:
- target: key1
source: $input.key1
- target: key2
source: $local.key2
- target: key3
source: literal
入力 $input |
ローカル変数 $local |
入力マッピング | 子ステップ入力 |
|
|
|
|
|
|
なし |
|
|
|
なし |
|
出力マッピング
出力マッピングは、現在のステップの入力($input)、現在のステップのローカル変数($local)、または定数をこのステップの出力に変換します。出力マッピングが指定されていない場合、choice ステップと foreach ステップはローカル変数を出力として使用しますが、task ステップはタスクの実行結果を出力として使用します。parallel ステップと foreach ステップのローカル変数は配列です。したがって、配列を JSON オブジェクトに変換するには、出力マッピングを定義する必要があります。デフォルトでは、それらのローカル変数は出力されません。詳細については、ステップの説明を参照してください。
outputMappings:
- target: key1
source: $input.key1
- target: key2
source: $local.key2
- target: key3
source: literal
入力 $input |
ローカル変数 $local |
出力マッピング | ステップ出力 |
|
|
|
|
|
|
|
|
|
|
なし |
|
出力を親ステップのローカル変数に保存する
子ステップの出力($output)は親ステップのローカル変数に保存されます。同じ名前が含まれている場合、出力の名前と値はローカル変数の対応する名前と値を上書きします。
出力 $output |
親ステップのローカル変数 $local |
変更後の親ステップのローカル変数 |
|
|
|
|
|
|