foreach ステップは、入力内の配列をイテレーションし、配列内の各要素に対して同一のステップシーケンスを並列実行します。各イテレーションは独自のローカル変数を保持し、出力マッピングがすべてのイテレーションの結果を foreach ステップの出力に結合します。
foreach ステップの仕組み
foreach ステップは、入力配列パラメーターをイテレーションし、配列内の各要素に対して steps フィールドで定義されたステップを実行します。foreach ステップはプログラミング言語の foreach と同様に動作しますが、イテレーションが順番に実行されるのではなく、並列で実行される点が異なります。
foreach ステップが実行されると、次のシーケンスで実行されます:
foreach ステップは配列内の各要素に対して 1 つのイテレーションを開始し、イテレーションを並行して実行します。
各イテレーションは独自のローカル変数を持ちます。イテレーション内のステップは、そのイテレーションのローカル変数のみを変更します。
すべてのブランチが完了すると、すべてのイテレーションのローカル変数が foreach ステップの
$local変数となります。この変数は配列であり、各要素は 1 回のイテレーションの結果を記録する JSON オブジェクトです。foreach ステップの出力マッピングが、イテレーションのローカル変数の配列を foreach ステップの出力に変換します。
制限
foreach ステップは、最大 100 個のイテレーションを並行して実行します。
プロパティ
foreach ステップは、次のプロパティをサポートします。
| プロパティ | 必須 | 説明 |
type | はい | ステップのタイプです。値を foreach に設定します。 |
name | はい | ステップの名前です。 |
iterationMapping | はい | foreach ステップのイテレーションマッピングです。 iterationMapping のフィールドについては、次の表で説明します。 |
steps | はい | 各イテレーションで実行されるステップです。 |
end | いいえ | foreach ステップの終了時に、foreach ステップの後に定義されたステップの実行を継続するかどうかを指定します。 |
inputMappings | いいえ | foreach ステップの入力マッピングです。ステップで入力マッピングを定義しない場合、ステップは親ステップまたはフローの入力を継承します。 |
outputMappings | いいえ | foreach ステップの出力マッピングです。出力マッピングを指定しない場合、foreach ステップの出力はデフォルトで空になります。 |
foreach ステップの iterationMapping プロパティには、次のフィールドが含まれます。
| フィールド | 必須 | 説明 |
collection | はい | ループのコレクションとして使用する入力パラメーターを指定します。 |
item | はい | 現在の要素をイテレーション入力にマージする際のキー名を指定します。 |
index | いいえ | 現在のインデックスをイテレーション入力にマージする際のキー名を指定します。 |
例
次のフロー定義には、myforeach という名前の foreach ステップが含まれています。 names 配列内の各要素に対して、foreach ステップは toUpperCase という名前のタスクステップを 1 つ実行します。
version: v1
type: flow
steps:
- type: foreach
name: myforeach
iterationMapping:
collection: $.names
item: name
steps:
- type: task
name: toUpperCase
resourceArn: acs:fc:{region}:{account}:services/fnf_test/functions/toUpperCase
outputMappings:
- target: names
source: $local[*].nameresourceArn 内の {region} と {account} を、ご自身の値に置き換えてください。
例におけるデータフロー
以下の各段階では、データが myforeach ステップ内でどのように渡され、どのフィールドによって各変換が実行されるかを示します。
1. フローの入力。 myforeach ステップでは入力マッピングを定義していないため、 myforeach の入力はフローの入力と同じです:
{
"names": ["a", "b", "c"]
}2. イテレーションの入力。 toUpperCase ステップでも入力マッピングを定義していないため、親ステップの入力を継承します。イテレーションが実行されるたびに、 iterationMapping は name をキーとして現在の要素を入力にマージします。そのため、3 つのイテレーションは次の入力を受け取ります。
a のイテレーションの入力:
{
"name": "a",
"names":["a","b","c"]
}b のイテレーションの入力:
{
"name": "b",
"names":["a","b","c"]
}c のイテレーションの入力:
{
"name": "c",
"names":["a","b","c"]
}3. イテレーションの出力。 toUpperCase は要素ごとに 1 回、合計 3 回実行され、次の出力を返します。
a のイテレーションの出力:
{
"name": "A"
}b のイテレーションの出力:
{
"name": "B"
}c のイテレーションの出力:
{
"name": "C"
}4. foreach ステップのローカル変数。 myforeach のローカル変数は、各イテレーションの結果を保持する配列です:
[
{
"name": "A"
},
{
"name": "B"
},
{
"name": "C"
}
]5. ステップの出力とフローの出力。 myforeach の outputMappings プロパティは、 $local[*].name を names にマッピングします。これにより、ステップの出力は次のようになります。フローでは出力マッピングまたは結果マッピングを定義していないため、この出力が最終的なフロー実行の出力にもなります。
{
"names": ["A", "B", "C"]
}