翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
状態の管理とデータの変換
変数を使用して状態間でデータを渡す方法と、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:us-east-1: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": "jdoe@example.com",
"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-identity
InputPath
フィールドを使用します。
"InputPath": "$.data.identity"
加えて、
Lambda 関数が使用する必要があるノードを指定するには、以下のように check-address
InputPath
フィールドを使用します。
"InputPath": "$.data.address"
ここで、検証結果を元のステートマシン入力内に保存する場合は、以下のように ResultPath
フィールドを使用します。
"ResultPath": "$.results"
ただし、ID と検証の結果のみが必要で、元の入力を破棄する場合は、以下のように OutputPath
フィールドを使用します。
"OutputPath": "$.results"
詳細については、「Step Functions の入力および出力処理」を参照してください。
OutputPath を使用した状態出力のフィルタリング
OutputPath
を使用すると、状態の出力の一部を選択して次の状態に渡すことができるようになります。このアプローチを使用すると、不要な情報をフィルタリングして、JSON データの必要な部分のみを渡すことができます。
OutputPath
を指定しない場合、デフォルトの値は $
です。これによって、JSON ノード全体 (状態の入力、タスクの結果、および ResultPath
によって決定) が次の状態に渡されます。