このトピックでは、入力と出力の基本について説明し、例を示します。
フローとステップ
データは、フロー内のステップ間で受け渡されることがよくあります。フロー定義言語 (FDL) のステップは、関数型プログラミング言語の関数に似ています。入力を受け取り、出力を返します。出力は、呼び出し元である親ステップのローカル変数に保存されます。入力と出力は、JSON オブジェクト形式でなければなりません。ローカル変数の型はステップによって異なります。たとえば、タスクステップでは Function Compute 関数呼び出しの結果をローカル変数として使用します。並列ステップでは、すべてのブランチの出力の配列をローカル変数として使用します。ステップの入力、出力、ローカル変数の合計サイズは 32 KB を超えることはできません。この制限を超えると、フローの実行は失敗します。
あるステップが別のステップを含む場合、外側のステップを親ステップ、内側のステップを子ステップと呼びます。最も外側のステップの親はフロー自体です。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) {
} この例では、フローには 2 つの子ステップ (step1 と step4) が含まれます。step1 は並列ステップで、2 つの子ステップ (step2 と step3) を含みます。
- システムがフローの実行を開始すると、フローの入力マッピングに基づいて
StartExecutionの入力をフロー入力 (input0) に変換します。 flowが開始されると、そのローカル変数local0は空です。- システムは、入力マッピング (
step1InputMappings) に基づいてstep1の入力input1を準備します。マッピングのソースは、flowの入力input0とローカル変数local0です。 - システムは
step1を呼び出し、入力input1を渡し、step1は出力output1を返します。step1が開始されると、そのローカル変数は空です。step1step1は並列ステップであるため、同時アクセスの問題を防ぐために、各ブランチは独自のローカル変数を持ちます。- システムは、入力マッピング (
step2InputMappings) に基づいてstep2の入力input2を準備します。マッピングのソースは、step1の入力input1とローカル変数local10です。 - システムは
step2を呼び出し、入力input2を渡し、step2は出力output2を返します。 - システムは
step2の出力を、step1のローカル変数local10に保存します。 - 同様に、システムは
step3を呼び出し、その結果をstep1のローカル変数local11に保存します。
- システムは
step1の出力を、flowのローカル変数local0に保存します。 - 同様に、システムは入力マッピングに基づいて
step4の入力input4を準備します。マッピングのソースは、flowの入力input0とローカル変数local0です。説明 この時点で、ローカル変数local0には、すでにstep1の出力が含まれている場合があります。これが、step1とstep4の間でデータが受け渡される仕組みです。 - システムは
step4を呼び出し、入力input4を渡し、step4は出力output4を返します。 - システムは
step4の出力を、flowのローカル変数local0に保存します。 - 最後に、システムはフローの出力マッピングに基づいて
local0をフローの出力に変換します。
型定義
入力マッピングと出力マッピングはいずれも、target と source のペアで構成される配列です。source はパラメーター値の取得元を定義し、target は宛先パラメーター名を定義します。source の値が $ で始まる場合、それはシステムが解析して特定の値を取得するための JSONPath 式です。それ以外の場合、その値は定数として扱われます。たとえば、$input.key は、パラメーター値が input オブジェクト内の key の値であることを示します。JSONPath 式をテストするには、このツール を使用できます。
- ソース
sourceフィールドは定数値をサポートします。定数値の型は、number、文字列、ブール値、配列、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)、または定数をステップの出力に変換します。出力マッピングを指定しない場合、選択ステップとループステップでは、ローカル変数が出力として使用されます。タスクステップでは、タスク実行の結果が出力として使用されます。並列ステップと foreach ステップのローカル変数は配列であるため、配列の結果を JSON オブジェクトに変換するには出力マッピングを定義する必要があります。デフォルトでは、これらのローカル変数は出力に含まれません。詳細については、各ステップの説明をご参照ください。
outputMappings:
- target: key1
source: $input.key1
- target: key2
source: $local.key2
- target: key3
source: literal 入力 $input | ローカル変数 $local | 出力マッピング | ステップの出力 |
| | | |
| | | |
| | なし | |
出力を親ステップのローカル変数に保存する方法
子ステップの出力 ($output) は、親ステップのローカル変数にマージされます。両方に同じ名前のキーがある場合、出力の値がローカル変数内の対応する値を上書きします。
出力 $output | 親ステップのローカル変数 $local | 変更後の親ステップのローカル変数 |
| | |
| | |