翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
例: Step Functions ワークフローでパスを使用して状態データを操作する
状態の管理とデータの変換
変数を使用して状態間でデータを渡す方法と、JSONata を使用してデータを変換する方法について説明します。
このトピックでは、InputPath フィールド、ResultPath フィールド、および OutputPath フィールドを使用して、状態入力と出力 JSON を操作する方法の例を示します。
ワークフロー状態に失敗する 状態または Succeed ワークフロー状態 状態以外のすべての状態には、InputPath、ResultPath、OutputPathなどの入力および出力処理フィールドを含めることができます。また、Wait ワークフロー状態 および Choice ワークフローの状態 状態は ResultPath フィールドをサポートしていません。これらのフィールドを使用すると、JSJsonPath
Parameters フィールドを使用して、JSON データがワークフロー内を移動する際にそのデータを操作することもできます。Parameters の使用の詳細については、「Step Functions ワークフローでパラメータを操作する」を参照してください。
たとえば、Lambda を使用する Step Functions ステートマシン状態の作成チュートリアルで説明されている AWS Lambda 関数とステートマシンから始めます。次の InputPath、ResultPath、OutputPath が含まれるように、ステートマシンを変更します。
{
"Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function",
"StartAt": "HelloWorld",
"States": {
"HelloWorld": {
"Type": "Task",
"Resource": "arn:aws:lambda:region:123456789012:function:HelloFunction",
"InputPath": "$.lambda",
"ResultPath": "$.data.lambdaresult",
"OutputPath": "$.data",
"End": true
}
}
}次の入力を使用して実行を開始します。
{
"comment": "An input comment.",
"data": {
"val1": 23,
"val2": 17
},
"extra": "foo",
"lambda": {
"who": "AWS Step Functions"
}
}
comment および extra ノードは破棄できますが、Lambda 関数の出力を含め、data ノードに情報を保存したいと思っています。
更新されたステートマシンで、Task 状態は、タスクへの入力を処理するように変更されます。
"InputPath": "$.lambda",
ステートマシン定義のこの行によって、タスク入力は、状態入力から lambda ノードのみに制限されます。Lambda 関数は、入力として JSON オブジェクト ({"who": "AWS Step Functions"}) のみを受信します。
"ResultPath": "$.data.lambdaresult",
この ResultPath は、元のステートマシン入力の data ノードの子として、Lambda 関数の結果を lambdaresult という名前のノードに挿入するよう指示します。元の入力および OutputPath を使った結果に対してこれ以上処理を実行しないため、状態の出力には元の入力を使った Lambda 関数の結果が含まれるようになります。
{
"comment": "An input comment.",
"data": {
"val1": 23,
"val2": 17,
"lambdaresult": "Hello, AWS Step Functions!"
},
"extra": "foo",
"lambda": {
"who": "AWS Step Functions"
}
}しかし、目的は data ノードのみを保持し、Lambda 関数の結果を含めることです。OutputPath を使用して、状態出力に渡す前に、結合されたこの JSON をフィルタリングします。
"OutputPath": "$.data",これにより、出力に渡される、元の入力の data ノード (例: lambdaresult によって挿入される ResultPath の子) のみ選択されます。状態出力は、次のようにフィルタリングされます。
{
"val1": 23,
"val2": 17,
"lambdaresult": "Hello, AWS Step Functions!"
}この Task 状態では次のようになります。
-
InputPathでは、Lambda 関数への入力からlambdaノードのみ送信します。 -
ResultPathでは、元の入力のdataノードの子として結果を挿入します。 -
OutputPathでは、dataノードのみが状態出力に渡されるように、状態入力 (現在は Lambda 関数の結果が含まれる) がフィルタリングされます。
例 JsonPath を使用して、元のステートマシンの入力、結果、最終出力を操作する
保険申請者の身元と住所を検証する以下のステートマシンを考えてみましょう。
注記
完全な例を表示するには、「Step Functions での JSON パスの使用方法
{ "Comment": "Sample state machine to verify an applicant's ID and address", "StartAt": "Verify info", "States": { "Verify info": { "Type": "Parallel", "End": true, "Branches": [ { "StartAt": "Verify identity", "States": { "Verify identity": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "Payload.$": "$", "FunctionName": "arn:aws:lambda:us-east-2:111122223333:function:check-identity:$LATEST" }, "End": true } } }, { "StartAt": "Verify address", "States": { "Verify address": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Parameters": { "Payload.$": "$", "FunctionName": "arn:aws:lambda:us-east-2:111122223333:function:check-address:$LATEST" }, "End": true } } } ] } } }
次の入力を使用してこのステートマシンを実行すると、検証を実行する Lambda 関数は検証が必要なデータのみを入力として想定するため、実行は失敗します。そのため、適切な JsonPath を使用して検証する情報を含むノードを指定する必要があります。
{ "data": { "firstname": "Jane", "lastname": "Doe", "identity": { "email": "[email protected]", "ssn": "123-45-6789" }, "address": { "street": "123 Main St", "city": "Columbus", "state": "OH", "zip": "43219" }, "interests": [ { "category": "home", "type": "own", "yearBuilt": 2004 }, { "category": "boat", "type": "snowmobile", "yearBuilt": 2020 }, { "category": "auto", "type": "RV", "yearBuilt": 2015 }, ] } }
Lambda 関数が使用する必要があるノードを指定するには、以下のように check-identityInputPath フィールドを使用します。
"InputPath": "$.data.identity"加えて、 Lambda 関数が使用する必要があるノードを指定するには、以下のように check-addressInputPath フィールドを使用します。
"InputPath": "$.data.address"ここで、検証結果を元のステートマシン入力内に保存する場合は、以下のように ResultPath フィールドを使用します。
"ResultPath": "$.results"ただし、ID と検証の結果のみが必要で、元の入力を破棄する場合は、以下のように OutputPath フィールドを使用します。
"OutputPath": "$.results"詳細については、「Step Functions の入力および出力処理」を参照してください。
OutputPath を使用した状態出力のフィルタリング
OutputPath を使用すると、状態の出力の一部を選択して次の状態に渡すことができるようになります。このアプローチを使用すると、不要な情報をフィルタリングして、JSON データの必要な部分のみを渡すことができます。
OutputPath を指定しない場合、デフォルトの値は $ です。これによって、JSON ノード全体 (状態の入力、タスクの結果、および ResultPath によって決定) が次の状態に渡されます。