StepFunctionsで、サービスAPIに渡すパラメーターの、フィールド名の記述方法

# はじめに

StepFunctionsを使っていて、パラメーターを指定する際、フィールド名にAPIリファレンスの文字列を使うように指示されます。しかしそれでは動かない場合もあるため、個人的に分かりづらい点を備忘録的にまとめました。

# 概要

- `.N`の場合は複数形にする
- ネストしている構造でも、同様に指定
- 指定したパラメーターがエラーになる場合、CLIやSDKのリファレンスのフィールド名を試す


# 指定の仕方


## パラメーターが配列".N"の場合

公式の解説にあるように、APIリファレンスのパラメーター名を複数形にします。

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/connect-parameters.html


例として、`DescribeSnapshots`の`SnapshotId.N`を指定してみます。

https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSnapshots.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/a4ab9d5e-6651-5a3c-edcc-35a78cfad288.png)




パラメーターには、フィールド名を`SnapshotIds`として指定します。
```json
    "DescribeSnapshots": {
      "Type": "Task",
      "Parameters": {
        "SnapshotIds": [
          "snap-xxxxxxxxxx",
          "snap-yyyyyyyyyy"
        ]
      },
      "Resource": "arn:aws:states:::aws-sdk:ec2:describeSnapshots",
      "End": true
    }
```

:::note
配列の中がすべて固定であれば、`['hoge','moge']`で指定します。
`$`マークを使ってパスを指定する場合は、`States.Array($.hoge,$.moge)`で指定します。
:::




## パラメーターがネストしている場合
パラメーターがネストしている場合でも、落ち着いて作っていきます。

https://repost.aws/questions/QUraP7F2T0STe0vdntoAJEhA/how-to-pass-blobattributevalue-to-step-function


ここでは、`ModifyNetworkInterfaceAttribute`の`Attachment`を指定して、(EC2の)終了時にENI削除のON/OFFの設定を変更します。

https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyNetworkInterfaceAttribute.html


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/18976d78-d980-bff3-cfa6-183a1c6724f1.png)

`Attachment`に指定する内容は、以下を使います。

https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_NetworkInterfaceAttachmentChanges.html

```json
    "ModifyNetworkInterfaceAttribute": {
      "Type": "Task",
      "End": true,
      "Parameters": {
        "NetworkInterfaceId": "eni-xxxxxxxxxx",
        "Attachment": {
          "AttachmentId": "eni-attach-yyyyyyyyyyyy",
          "DeleteOnTermination": "true/false"
        }
      },
      "Resource": "arn:aws:states:::aws-sdk:ec2:modifyNetworkInterfaceAttribute"
    }
```


## フィールド名がない、とエラーになる場合

APIリファレンスにあるパラメーターを指定しても、`The field hogehoge is not supported by Step Functions.`とエラーになってしまう場合があります。

例として、`CreateNetworkInterface`の`SecurityGroupId.N`を指定してみます。ENIの作成の際にSecurityGroupを指定するパラメーターです。

https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/6d837dba-e6e5-8bb9-aef0-418eb705d6bd.png)

最初の例のように、複数形にして`SecurityGroupIds`を指定しようとします。

```json
    "CreateNetworkInterface": {
      "Type": "Task",
      "End": true,
      "Parameters": {
        "SubnetId": "subnet-xxxxxxxxxx",
        "SecurityGroupIds": [
          "sg-yyyyyyyyyy"
        ]
      },
      "Resource": "arn:aws:states:::aws-sdk:ec2:createNetworkInterface"
    }
```
エラーになってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/ae267b29-57ae-34b8-4096-6f369d28a3c8.png)

正しいパラメーター名は、CLIリファレンスにある`Groups`(キャメルケースで表記する模様）になります。

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/create-network-interface.html


```json
    "CreateNetworkInterface": {
      "Type": "Task",
      "End": true,
      "Parameters": {
        "SubnetId": "subnet-xxxxxxxxxx",
        "Groups": [
          "sg-yyyyyyyyyy"
        ]
      },
      "Resource": "arn:aws:states:::aws-sdk:ec2:createNetworkInterface"
    }
```

そのため、APIリファレンスでうまくいかない場合は、CLIやSDKのリファレンスのフィールド名を試してみてください。

# おわりに

フィールド名でわかりづらい点をまとめてみました。これがわかっておけば、StepFunctionsは色々な場面で使っていけるかと思います。
この記事がどなたかのお役に立てれば幸いです。