stepFunctions の ResultSelector, ResultPath, OutputPath について触ってみた
はじめに
stepFunctions の機能である「ResultSelector」、「ResultPath」、「OutputPath」を使って、イベントデータを効率的に選別、変換、そして出力する方法について見ていきます。
今回、lambda
→ eventBridge
に処理を続けるときに後続のeventBridgeの処理でlambdaの値の取得に戸惑ったので備忘録として記載します。
aws コンソールの stepFunctions の「編集」で lambda を選ぶと出てくるやつです。
【触ってみた理解】「ResultSelector」、「ResultPath」、「OutputPath」は後続へ渡す値を変換するもの
「ResultSelector」、「ResultPath」、「OutputPath」は後続へ渡す値を変換するものと理解しました。以下はlambdaの元データになります。この値がそれぞれどのように後続へ渡されるのか確認していきます。
{
"ExecutedVersion": "$LATEST",
"Payload": {
"foo": "bar",
"colors": [
"red",
"blue",
"green"
],
"car": {
"year": 2008,
"make": "Toyota",
"model": "Matrix"
}
},
"SdkHttpMetadata": {
"AllHttpHeaders": {
"X-Amz-Executed-Version": [
"$LATEST"
],
"x-amzn-Remapped-Content-Length": [
"0"
],
"Connection": [
"keep-alive"
],
"x-amzn-RequestId": [
"ac79dacd-7c6f-41c7-bfcf-eea70b43e141"
],
"Content-Length": [
"50"
],
"Date": [
"Fri, 19 Mar 2021 00:38:02 GMT"
],
"X-Amzn-Trace-Id": [
"root=1-6053f269-177467df0c94095a622bc2b8;sampled=0"
],
"Content-Type": [
"application/json"
]
},
"HttpHeaders": {
"Connection": "keep-alive",
"Content-Length": "50",
"Content-Type": "application/json",
"Date": "Fri, 19 Mar 2021 00:38:02 GMT",
"X-Amz-Executed-Version": "$LATEST",
"x-amzn-Remapped-Content-Length": "0",
"x-amzn-RequestId": "ac79dacd-7c6f-41c7-bfcf-eea70b43e141",
"X-Amzn-Trace-Id": "root=1-6053f269-177467df0c94095a622bc2b8;sampled=0"
},
"HttpStatusCode": 200
},
"SdkResponseMetadata": {
"RequestId": "ac79dacd-7c6f-41c7-bfcf-eea70b43e141"
},
"StatusCode": 200
}
ResultSelector
ResultSelector は、ステップの実行結果から特定の部分だけを選択して、新しいデータ構造に変換する機能です。これにより、余計なデータを取り除き、必要な情報だけを次のステップに渡すことができます。
aws公式の解説には
ResultSelector フィルターを使用すると、状態の結果を操作できます。Task ステートの場合、ResultSelector は API コールからのレスポンスを操作するためによく使用されます。結果の一部を使用して新しい JSON オブジェクトを作成する必要がある場合は、ResultSelector を使用します。
例えば、状態のタスク結果が次のとおりであるとします。
{
“ship-date”: “2016-03-14”,
“prod”:
“sku”: “R3”,
“count”: 1344
}
}
出荷日と製品数のみを渡す場合は、この JSON オブジェクトで ResultSelector を指定できます。
{
“date.$”: “$.ship-date”,
“count.$”: “$.prod.count”
}
各キーの後の「.$」に注意してください。これにより、値はリファレンスパスであることを Step Functions に示します。
ResultSelector を使用した後の有効な出力は次のとおりです。
{
“date”: “2016-03-14”,
“count”: 1344
}
オペレーションの順序: Amazon States Language のフィルターは特定の順序で処理されます。ResultSelector は、結果の生成直後、ResultPath と OutputPath の前に処理されます。次の図は、Task ステートでのフィルタリング順序を示しています。
とあります。
例えば、
ResultSelectorを下記のように設定すると
{
"lambdaFoo.$": "$.Payload.foo",
"lambdaCar.$": "$.Payload.car"
}
後続では
{
"foo.$": "$.lambdaFoo",
"car.$": "$.lambdaCar"
}
で前のlambdaの値を取得することができそうです。
ResultPath
ResultPath は、タスクが完了したときの結果を元の入力データのどこに挿入するかを指定します。これにより、入力データ全体を維持しながら、必要な情報だけを追加したり、上書きしたりできます。
awsの解説
ResultPath フィルターを使用すると、タスク結果を元の状態入力に追加できます。入力と結果の両方を状態が出力する必要がある場合は、ResultPath を使用します。
例えば、状態入力が次のとおりであるとします。
{
“foo”: 123,
“bar”: [“a”, “b”, “c”]
}
また、状態の結果が次のとおりであるとします。
{
“Payload”: {
“ID”: “83j9d8d766”
}
}
次の リファレンスパスを ResultPath フィルターに指定することで、元の入力に「ID」を追加できます。
{
“foo”: 123,
“bar”: [“a”, “b”, “c”],
“ID”: {
“ID”: “83j9d8d766”
}
}
オペレーションの順序: Amazon States Language のフィルターは特定の順序で処理されます。ResultPath は ResultSelector の後、OutputPath の前に処理されます。次の図は、Task ステートでのフィルタリング順序を示しています。
とあります。
例えば画像の欄に
$.Payload.colors
と記載すると後続で$.Payload.colors
の値が参照できるようになります。
プルダウンで
Combine original input with result
元の入力と結果を組み合わせるDiscard reult and keep original input
結果を破棄し、元の入力を保持します
が選べるようです。
{
"colors": $.Payload.colors
}
OutputPath とは?
OutputPath は、ステップ全体の結果から特定のデータだけを出力する機能です。これを使うことで、次のステップで扱うデータをシンプルに保つことができます。
awsの解説
OutputPath フィルターを使用して、次の状態に渡す有効な状態出力の一部を選択します。多くの場合、Task ステートと併用して API レスポンスの結果をフィルタリングします。
例えば、タスク状態のタスク結果が次のとおりであるとします。
{
“dog”: {
“breed”: “lab”,
“color”: “black”
}
“cats”: null,
“gerbils”: null
}
次の状態が「dog」内のデータのみを必要とする場合は、次の リファレンスパスを OutputPath フィルターに指定できます。
$.dog
この場合の最終的な状態出力は次のようになります。
{
“breed”: “lab”,
“color”: “black”
}
オペレーションの順序
Amazon States Language のフィルターは、特定の順序で処理されます。OutputPath は、常に最後に処理されます。次の図は、タスク状態でのフィルタリング順序を示しています。
とあります。
例えば画像の欄に
$.Payload
と記載すると後続への出力は
{
"foo": "bar",
"colors": [
"red",
"blue",
"green"
],
"car": {
"year": 2008,
"make": "Toyota",
"model": "Matrix"
}
}
のみになります。
// 後続では下記のように取得できる
{
"lambdaFoo.$": "$.foo"
}
データフローシミュレーター
上記で書いた部分をシミュレートできるものがawsのサイトでありました。
データフローシミュレーター](https://us-west-2.console.aws.amazon.com/states/home?region=us-west-2#/simulator)
まとめ
ResultSelector、ResultPath、そして OutputPath は、AWS stepFunctions のワークフロー内で非常に便利な機能です。これらを使うことで、不要なデータを削除したり、必要な情報を整えて次のステップに引き渡したりすることが簡単にできます。
これらの機能を活用することで、データ処理の効率が大幅に向上し、複雑なワークフローでもデータの流れをシンプルに保つことができるでしょう。
コメント