StepFunctionsの入力方法サンプルメモ集

# メモ

## 前提
### 検証用Lambdaファンクション
引数を出力するだけ

```ruby
require 'json'

def lambda_handler(event:, context:)
    puts event
    puts context
    { statusCode: 200, body: JSON.generate('Hello from Lambda!') }
end

```

## InputPath

StepFunctionsの実行の入力のうちで、Lambdaファンクションにわたす引数を抽出する。

### ステートマシン定義

```json
{
  "Comment": "test",
  "StartAt": "Hello",
  "States": {
    "Hello": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:ap-northeast-1:xxx:function:inputparameter-test",
      "InputPath": "$.num1",
      "End": true
    }
  }
}
```

### StepFunctions実行入力

```json
{
  "num1": 1,
  "num2": 2
}
```

### Lambdaファンクション出力(event)

`$.num1` と指定することで、入力のうちの `num1` キーの値だけが `event`引数で渡される

```
1
```

## Parameters

Lambdaファンクションにわたす引数を定義する。

### ステートマシン定義

```json
{
  "Comment": "test",
  "StartAt": "Hello",
  "States": {
    "Hello": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:ap-northeast-1:xxx:function:inputparameter-test",
      "Parameters": {
        "Param1": 1,
        "Param2": 2,
        "Param3": "hogehoge"
      },
      "End": true
    }
  }
}
```

### StepFunctions実行入力

```json
{
  "num1": 1,
  "num2": 2
}
```

### Lambdaファンクション出力(event)

`Parameters` の中身がそのまま入ってくる

```ruby
{"Param1"=>1, "Param2"=>2, "Param3"=>"hogehoge"}
```

## Parameters(入力値を利用、パス指定)

> パスを使用して値を選択するキーと値のペアの場合、キーの名前は .$ で終わる必要があります。
https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/input-output-inputpath-params.html

### ステートマシン定義

```json
{
  "Comment": "test",
  "StartAt": "Hello",
  "States": {
    "Hello": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:ap-northeast-1:xxxx:function:inputparameter-test",
      "Parameters": {
        "Num1.$": "$.num1",
        "Num2": "$.num2",
        "NumAll.$": "$"
      },
      "End": true
    }
  }
}
```

### StepFunctions実行入力
```json
{
  "num1": 1,
  "num2": 2
}
```

### Lambdaファンクション出力(event)

キーが `.$` で終わってない場合は固定文字列として扱われる。

```ruby
{
"Num1"=>1, 
"Num2"=>"$.num2"
"NumAll"=>{"num1"=>1, "num2"=>2}
}
```

## Parameters(コンテキストオブジェクト)

> コンテキストオブジェクトは、実行中に使用できる内部の JSON 構造です。これには、ステート定義の "Parameters" フィールド内からアクセスできるステートマシンと実行に関する情報が含まれています。これにより、ワークフローが特定の実行に関する情報にアクセスできるようになります。
（略）
> コンテキストオブジェクトにアクセスするには、パスを使用して状態の入力を選択したときと同様に、.$ を末尾に追加したパラメータ名をまず指定します。次に、入力の代わりにコンテキストオブジェクトデータにアクセスするには、 `$$`. をパスの先頭に追加します。これによって、パスを使用してコンテキストオブジェクト内のノードを選択するように Step Functions に指示します。
https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/input-output-contextobject.html

### ステートマシン定義

```json
{
  "Comment": "test",
  "StartAt": "Hello",
  "States": {
    "Hello": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:ap-northeast-1:xxxxx:function:inputparameter-test",
      "Parameters": {
        "ContextObject.$": "$$"
      },
      "End": true
    }
  }
}
```

### StepFunctions実行入力

```json
{
  "num1": 1,
  "num2": 2
}
```

### Lambdaファンクション出力(event)

コンテキストオブジェクトの形式
https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/input-output-contextobject.html

```ruby
{"ContextObject"=>{"Execution"=>{"Id"=>"arn:aws:states:ap-northeast-1:xxxxx:execution:input-parameter-sample:6026cee0-cd11-3527-42e3-03d40b886310", "Input"=>{"num1"=>1, "num2"=>2}, "Name"=>"6026cee0-cd11-3527-42e3-xxxxxxx", "RoleArn"=>"arn:aws:iam::xxxxxx:role/service-role/2019-12-042311", "StartTime"=>"2019-12-04T14:45:55.068Z"}, "StateMachine"=>{"Id"=>"arn:aws:states:ap-northeast-1:xxxxx:stateMachine:input-parameter-sample", "Name"=>"input-parameter-sample"}, "State"=>{"Name"=>"Hello", "EnteredTime"=>"2019-12-04T14:45:55.104Z", "RetryCount"=>0}}}
```