👌

Step Functions 変数をJSONataとJSONPathで使う例

2024/12/27に公開

AWS Step Functionsで最近発表された「変数」を使用する場合、使用するステートマシンクエリ言語がJSONataかJSONPathかによって記法が大きく変わります。公式ドキュメントで変数を使用するステートマシンの例はほとんどJSONataで書かれているため、特にJSONPathで変数を使用する際には注意が必要です。

JSONataで変数を使う

JSONataで変数を参照するには、$x$order.numItemsのように変数名の前に$を使用します。値として変数を使用するには、{% $x %}のようにします。JSONataにおいて{% ... %}は変数を含むことを示します。

変数$statesはStep Functionsによって予約済みです。

ステートマシン例
{
  "QueryLanguage": "JSONata",
  "StartAt": "GetSomeData",
  "States": {
    "GetSomeData": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Arguments": {
        "FunctionName": "function-1",
        "Payload": "{% $states.input %}"
      },
      "Assign": {
        "taskResult": "{% $states.result %}",
        "functionOutput": "{% $states.result.Payload %}"
      },
      "Next": "DoSomething"
    },
    "DoSomething": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Arguments": {
        "FunctionName": "function-2",
        "Payload": {
          "function_output": "{% $functionOutput %}",
          "status_code": "{% $taskResult.StatusCode %}"
        }
      },
      "End": true
    }
  }
}

JSONPathで変数を使う

JSONPathで変数を参照するには、$x$order.numItemsのように変数名の前に$を使用します。値として変数を使用するには、key.$のようにキー名の最後に.$を使用します。

変数の割り当て(Assign)において、$はタスクの結果を表します。タスクが無いステートでは、InputPathでフィルターされた値や、ステートへの入力などになります。詳細は下図のとおりです。

ステートマシン例
{
  "QueryLanguage": "JSONPath",
  "StartAt": "GetSomeData",
  "States": {
    "GetSomeData": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "function-1",
        "Payload.$": "$"
      },
      "Assign": {
        "taskResult.$": "$",
        "functionOutput.$": "$.Payload"
      },
      "Next": "DoSomething"
    },
    "DoSomething": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "function-2",
        "Payload": {
          "function_output.$": "$functionOutput",
          "status_code.$": "$taskResult.StatusCode"
        }
      },
      "End": true
    }
  }
}

参考

https://docs.aws.amazon.com/step-functions/latest/dg/workflow-variables.html

あとがき

動作未確認です。間違っていたら教えていただけると助かります。

Discussion