すべてのプロダクト
Search
ドキュメントセンター

CloudFlow:入力と出力

最終更新日:Jan 12, 2025

このトピックでは、入力と出力の基本について説明します。

フローとステップ

通常、データはフローとステップ間、およびフローの複数のステップ間で渡される必要があります。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      
flow-io-mappings-v0

次のコードを使用してマッピングを記述できるため、理解しやすくなります。

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) {
}       

この例では、フローは step1step4 の 2 つの子ステップで構成されています。step1 は、step2step3 を含む並列ステップです。

  1. システムがフローの実行を開始すると、フローの入力マッピングに基づいて StartExecution 入力がフロー入力(input0)に変換されます。
  2. flow の実行が開始されると、local0 は空になります。
  3. システムは、input1 の入力マッピング(step1InputMappings)に基づいて step1 の input1 入力を準備します。マッピングソースは、input0 入力と flowlocal0 ローカル変数です。
  4. システムは step1 を呼び出して input1 をロードします。step1output1 を返します。
    • システムが step1 の実行を開始すると、その local10 は空になります。step1 は並列ステップであるため、各ブランチはローカル変数に対応し、同時アクセスを回避します。
    • システムは、step2 の入力マッピング(step2InputMappings)に基づいて step2 の input2 入力を準備します。マッピングソースは、input1 入力と local10step1 の ローカル変数です。
    • システムは step2 を呼び出して input2 をロードします。step2output2 を返します。
    • システムは step2 の出力を local10step1 の ローカル変数に保存します。
    • 同様に、システムは step3 を呼び出し、結果を local11step1 の ローカル変数に保存します。
  5. システムは step1 の出力を local0flow の ローカル変数に保存します。
  6. 同様に、システムは input4step4 の入力マッピングに基づいて step4 の input0local0フロー
    説明 この時点で、local0 ローカル変数には step1 の出力が含まれている場合があります。これにより、step1step4 間のデータ転送が実現します。
    入力を準備します。マッピングソースは、 入力と の ローカル変数です。
  7. システムは step4 を呼び出して input4 をロードします。step4output4 を返します。
  8. システムは step4 の出力を local0flow の ローカル変数に保存します。
  9. 最後に、システムはフローの出力マッピングに基づいて local0 をフロー出力に変換します。

入力マッピングと出力マッピングはどちらも、targetsource で構成される配列です。source はパラメーターソースを定義し、マッピングごとに異なる値に設定されます。たとえば、$input.key は、パラメーターソースが input$.key の値であることを示します。target はターゲットパラメーターの名前を定義します。source の値が $ で始まる場合、値は JSON パス形式で指定され(JSONPath オンライン評価ツール を使用して JSON パスをデバッグできます)、システムはパスに基づいてソースを特定の値に解析します。それ以外の場合、値は定数と見なされます。

  • ソース

    source は、numberstringbooleanarrayobject、または 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 入力マッピング 子ステップ入力
{
"key1":"value1"
}
{
"key2":"value2"
}
inputMappings:
  - target: key1
    source: $input.key1
  - target: key2
    source: $local.key2
  - target: key3
    source: literal
{
"key1":"value1"
"key2":"value2"
"key3":"literal"
}
{
"key1":"value1"
}
{
"key2":"value2"
}
なし
{
"key1":"value1"
"key2":"value2"
}
{
"key1":"value1"
}
{
"key1":"value2"
}
なし
{
"key1":"value2"
}

出力マッピング

出力マッピングは、現在のステップの入力($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 出力マッピング ステップ出力
{
"key1":"value1"
}
{
"key2":"value2"
}
outputMappings:
  - target: key1
    source: $input.key1
  - target: key2
    source: $local.key2
  - target: key3
    source: literal
{
"key1":"value1"
"key2":"value2"
"key3":"literal"
}
{
"key1":"value1"
}
[
  {
    "key2":"value2.1"
  },
  {
    "key2":"value2.2"
  }
]
outputMappings:
  - target: key1
    source: $input.key1
  - target: key2
    source: $local[*].key2
  - target: key3
    source: literal
{
  "key1":"value1",
  "key2":["value2.1","value2.2"],
  "key3":"literal"
}
{
"key1":"value1"
}
{
"key2":"value2"
}
なし
{
"key2":"value2"
}

出力を親ステップのローカル変数に保存する

子ステップの出力($output)は親ステップのローカル変数に保存されます。同じ名前が含まれている場合、出力の名前と値はローカル変数の対応する名前と値を上書きします。

出力 $output 親ステップのローカル変数 $local 変更後の親ステップのローカル変数
{
"key1":"value1"
}
{
"key2":"value2"
}
  {
    "key1":"value1"
  },
  {
    "key2":"value2"
  }
{
"key1":"value11"
}
  {
    "key1":"value1"
  },
  {
    "key2":"value2"
  }
  {
    "key1":"value11"
  },
  {
    "key2":"value2"
  }