インラインモードでのマップステートの使用 - AWS Step Functions

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

インラインモードでのマップステートの使用

デフォルトでは、Map 状態は [インライン] モードで実行されます。インラインモードでは、マップステートは JSON 配列のみを入力として受け入れます。ワークフローの前のステップから、この配列を受け取ります。このモードでは、Map 状態のそれぞれの反復は、Map 状態を含むワークフローのコンテキストで実行されます。Step Functions は、これらの反復の実行履歴を親ワークフローの実行履歴に追加します。

このモードでは、Map 状態は最大 40 回の同時反復をサポートします。

[インライン] に設定された Map ステートはインラインマップステートと呼ばれます。ワークフローの実行履歴が 25,000 エントリを超えない場合や、同時反復が 40 回以上必要ない場合は、Map 状態をインラインモードで使用します。

インラインマップステートの使用の概要については、チュートリアル インラインマップステートを使用したアクションの反復 を参照してください。

このトピックの主要概念

インラインモード

Map 状態の制限付き同時実行モード。このモードでは、Map 状態のそれぞれの反復は、Map 状態を含むワークフローのコンテキストで実行されます。Step Functions は、これらの反復の実行履歴を親ワークフローの実行履歴に追加します。Map 状態はデフォルトではインラインモードで実行されます。

このモードは JSON 配列のみを入力として受け入れ、最大 40 回の同時反復をサポートします。

インラインマップステート

[インライン] モードに設定された Map 状態。

マップワークフロー

Map各反復で状態が実行する一連のステップ。

マップステートの繰り返し

Map 状態内で定義されたワークフローの繰り返し。

インラインマップステートのフィールド

ワークフローでインラインマップステートを使用するには、これらのフィールドを 1 つ以上指定します。これらのフィールドは、共通状態フィールドに加えて指定します。

Type (必須)

状態のタイプ (Map など) を設定します。

ItemProcessor
(必須)

Map 状態処理モードと定義を指定する次の JSON オブジェクトが含まれます。

定義には、各配列項目を処理する際に繰り返す一連の手順が含まれています。

  • ProcessorConfig - Map 状態の処理モードを指定するオプションの JSON オブジェクト。このオブジェクトには Mode サブフィールドが含まれます。このフィールドのデフォルトは INLINE で、インラインモードの Map 状態を使用します。

    このモードでは、反復処理が失敗すると Map 状態も失敗します。Map 状態に障害が発生すると、すべての反復処理が停止します。

  • StartAt - ワークフローの最初の状態を示す文字列を指定します。この文字列は、大文字と小文字が区別され、いずれかの状態オブジェクトの名前と完全に一致する必要があります。この状態は、データセット内の各アイテムで最初に実行されます。Map 状態に提供した実行入力は、まず StartAt 状態に渡されます。

  • States – カンマで区切られた一連の状態を含む JSON オブジェクト。このオブジェクトでは、Map workflowを定義します。

    注記
    • ItemProcessor フィールド内の状態は相互にしか遷移できません。フィールド外の状態は、ItemProcessor フィールド内の状態に遷移することはできません。

    • ItemProcessor フィールドは、現在廃止された Iterator フィールドに置き換わります。Iterator フィールドを使用する Map 状態は引き続き含めることができますが、このフィールドを ItemProcessor に置き換えることを強くお勧めします。

      Step Functions Local は現在 ItemProcessor フィールドをサポートしていません。Iterator フィールドは、Step Functions Local で使用することをお勧めします。

ItemsPath (オプション)

JsonPath 構文を使用してリファレンスパスを指定します。このパスは、状態入力内の項目の配列を含む JSON ノードを選択します。詳細については「ItemsPath」を参照してください。

ItemSelector
(オプション)

Map 状態反復に渡される前に、入力配列項目の値をオーバーライドします。

このフィールドでは、キーと値のペアのコレクションを含む有効な JSON を指定します。これらのペアには以下のいずれかを含めることができます。

詳細については「ItemSelector」を参照してください。

ItemSelector フィールドは、現在廃止された Parameters フィールドに置き換わります。Parameters フィールドを使用する Map 状態は引き続き含めることができますが、このフィールドを ItemSelector に置き換えることを強くお勧めします。

MaxConcurrency (オプション)

並行して実行できる Map 状態の反復数の上限を示す整数値を指定します。例えば、MaxConcurrency 値が 10 の場合、Map 状態の反復の同時実行数は一度に 10 回に制限されます。

注記

同時反復は制限される場合があります。この状況が起こったときは、前の反復が完了するまで一部の反復は開始されません。入力配列の項目が 40 を超えると、この問題が発生する可能性が高くなります。

同時実行性を高めるには、分散マップ状態の使用 を検討してください。

デフォルト値は 0 で、同時実行数に制限はありません。Step Functions は可能な限り同時に反復を呼び出します。

MaxConcurrency 値が 1 の場合、配列要素ごとに 1 回ずつ ItemProcessor を呼び出します。配列内の項目は、入力に現れる順に処理されます。Step Functions は、前の反復が完了するまで新しい反復を開始しません。

MaxConcurrencyPath (オプション)

リファレンスパスを使用して状態の入力からタイムアウト値を動的に最大同時実行値を指定する場合は、MaxConcurrencyPath を使用してください。解決されると、リファレンスパスは、値が負でない整数のフィールドを選択する必要があります。

注記

Map 状態には MaxConcurrencyMaxConcurrencyPath の両方を含めることはできません。

ResultPath (オプション)

Map 状態の反復の出力を入力のどこに保存するかを指定します。次に、マップステートは OutputPath フィールドの指定に従って入力をフィルタリングします (指定されている場合)。次に、フィルター処理された入力を状態の出力として使用します。詳細については、入力および出力処理を参照してください。

ResultSelector (オプション)

値が静的であるか結果から選択された、キーバリューのペアの集合を渡します。詳細については「ResultSelector」を参照してください。

ヒント

ステートマシンで使用している並列またはマップステートが配列の配列を返す場合は、ResultSelector フィールドを使用して配列をフラットな配列に変換できます。詳細については「配列の配列の平坦化」を参照してください。

Retry (オプション)

Retrier と呼ばれるオブジェクトの配列。再試行ポリシーを定義します。状態はランタイムエラーが発生すると再試行ポリシーを使用します。詳細については「Retry と Catch を使用するステートマシンの例」を参照してください。

注記

インライン状態に Retrier を定義すると、リトライポリシーは、失敗した反復だけではなくすべての Map 状態の反復に適用されます。例えば、Map 状態の反復が 2 回成功し、反復が 1 回失敗したとします。Map 状態の Retry フィールドを定義した場合、リトライポリシーは、失敗した反復だけでなく、3 回の Map 状態反復すべてに適用されます。

Catch (オプション)

Catcher と呼ばれるオブジェクトの配列で、フォールバック状態を定義します。状態は、ランタイムエラーが発生し、リトライポリシーが設定されていないか、リトライポリシーが使い果たされた場合に、catcher を実行します。詳細については、フォールバック状態を参照してください。

廃止されたフィールド

注記

次のフィールドを使用する Map 状態は引き続き含めることができますが、この IteratorItemProcessorParametersItemSelector に置き換えることを強くお勧めします。

Iterator

配列の各要素を処理する一連のステップを定義する JSON オブジェクトを指定します。

Parameters

キーには次のいずれかを含めることができる、キーと値のペアの集合を指定します。

  • ステートマシンの定義で定義する静的値。

  • パスを使用して入力から選択された値。

インラインマップステートの例

[インライン] モードで実行されている Map 状態の次の入力データについて考えてみます。

{ "ship-date": "2016-03-14T01:59:00Z", "detail": { "delivery-partner": "UQS", "shipped": [ { "prod": "R31", "dest-code": 9511, "quantity": 1344 }, { "prod": "S39", "dest-code": 9511, "quantity": 40 }, { "prod": "R31", "dest-code": 9833, "quantity": 12 }, { "prod": "R40", "dest-code": 9860, "quantity": 887 }, { "prod": "R40", "dest-code": 9511, "quantity": 1220 } ] } }

前の入力を指定すると、次の例の Map 状態は、shipped フィールドの配列の各項目に対して ship-val という名前の AWS Lambda 関数を 1 回呼び出します。

"Validate All": { "Type": "Map", "InputPath": "$.detail", "ItemProcessor": { "ProcessorConfig": { "Mode": "INLINE" }, "StartAt": "Validate", "States": { "Validate": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "FunctionName": "arn:aws:lambda:us-east-2:123456789012:function:ship-val:$LATEST" }, "End": true } } }, "End": true, "ResultPath": "$.detail.shipped", "ItemsPath": "$.shipped" }

Map 状態の各反復は、ItemsPath フィールドで選択された、配列にある項目を ship-val Lambda 関数への入力として送信します。以下の値は、Lambda 関数の呼び出しに対して Map 状態が送信する入力の例です。

{ "prod": "R31", "dest-code": 9511, "quantity": 1344 }

完了すると、Map 状態の出力は JSON 配列となります。配列の各項目は反復の出力です。この場合、この配列には ship-val Lambda 関数の出力が含まれます。

ItemSelector によるインラインマップステートの例

前の例の ship-val Lambda 関数でも、配送の運送会社に関する情報も必要であるとします。この情報は、繰り返しのたびに配列内の項目に追加されます。Map 状態の現在の反復に固有である情報に加えて、入力からの情報を含めることもできます。次の例の ItemSelector フィールドに注目してください。

"Validate-All": { "Type": "Map", "InputPath": "$.detail", "ItemsPath": "$.shipped", "MaxConcurrency": 0, "ResultPath": "$.detail.shipped", "ItemSelector": { "parcel.$": "$$.Map.Item.Value", "courier.$": "$.delivery-partner" }, "ItemProcessor": { "StartAt": "Validate", "States": { "Validate": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:ship-val", "End": true } } }, "End": true }

ItemSelector ブロックは反復への入力を JSON ノードに置き換えます。このノードには、コンテキストオブジェクトからの現在のアイテムデータと、Map 状態入力の delivery-partner フィールドからの運送会社に関する情報の両方が含まれます。以下に示すのは、1 回の反復処理への入力の例です。Map 状態は、この入力を ship-val Lambda 関数の呼び出しに渡します。

{ "parcel": { "prod": "R31", "dest-code": 9511, "quantity": 1344 }, "courier": "UQS" }

前述のインラインマップステートの例では、ResultPath フィールドは入力と同じ形式で出力を生成します。ただし、各要素が各反復の ship-val Lambda 呼び出しの出力である配列で detail.shipped フィールドが上書きされます。

インラインマップステートとそのフィールドの使用方法の詳細については、以下を参照してください。

インライン Map 状態の入出力処理

特定の Map 状態について、InputPath は状態の入力のサブセットを選択します。

Map 状態の入力には JSON 配列が含まれている必要があります。Map 状態は配列内の項目ごとに ItemProcessor セクションを 1 回実行します。ItemsPath フィールドを指定すると、Map 状態は反復処理の対象となる配列を検索する入力内の場所を選択します。場所を指定しない場合、ItemsPath の値は $ となり、ItemProcessor セクションはこの配列が唯一の入力であると見なします。ItemsPath フィールドを指定する場合、その値はリファレンスパスである必要があります。Map 状態は、InputPath を適用した後に、このパスを有効な入力に適用します。ItemsPath は、値が JSON 配列であるフィールドを識別する必要があります。

各反復への入力は、デフォルトでは、ItemsPath 値で識別される配列フィールドの単一の要素です。この値は、ItemSelector フィールドで上書きできます。

完了すると、Map 状態の出力は JSON 配列となります。配列の各項目は反復の出力です。

インラインマップステートの入力と出力の詳細については、以下を参照してください。