QuickSightのデータセットの更新をStep Functionsでノーコードで出来るようになった話

# はじめに
先日、AWS Step Functionsで使える組み込み関数が増えました。

https://dev.classmethod.jp/articles/aws-step-functions-14-new-intrinsic-features-process-data-workflows/

https://aws.amazon.com/jp/about-aws/whats-new/2022/08/aws-step-functions-14-new-intrinsic-features-process-data-workflows/

以前、「Step FunctionsでQuickSightのデータセット更新を行う際、ランダム文字列が必要でLambdaを使う必要がある」という内容の記事を書きました。

https://qiita.com/a_b_/items/2adee15fc693307f95da

今回のアップデートで追加された組み込み関数を用いることで、ノーコードでStep FunctionsからQuickSightを更新できるようになりました。

# やったこと

`States.UUID`を使い、IngestionIdに一意の文字列を渡すだけです。

参考（日本語のページはまだ更新されていません。英語のページで確認ください）

https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-intrinsic-functions.html#asl-intrsc-func-uuid-generate


## 関数だけ使ってみる

Workflow Studioで Pass をドラッグアンドドロップし、入力のParametersの中に以下の様に記載します。

```json
{
    "param.$": "States.UUID()"
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/c0f61b9e-2cdf-9a6e-d503-3eeee430b66b.png)

あとは保存して実行するだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/d67b4622-ea45-d84b-cb81-7f00ede9fdc7.png)

UUIDが生成されているのがわかります。


## QuickSightデータセット作成

次に正常にデータセット更新が行われることを確認するために、サンプルを作成します。

今回はS3に置いた以下のデータを直接読み込み、表として表示させます。
```text:members.csv
名前,年齢,誕生日,血液型,身長(cm),好きなもの,嫌いなもの,口癖
青天国 春,16,4月28日,A,160,カレーライス(甘口),長いも,春ちゃんにお任せあれ！
玉城 杏夏,15,1月17日,A,158,チーズバーガー,ヨーグルト,お茶目なジョークです
聖舞 理王,14,9月23日,AB,155,プリン(甘天堂),ピーマン,なぜなら私は、理王様だから！
祇園寺 雪音,16,8月8日,AB,164,カレーライス(激辛),無し,私様にお任せだ！
伊藤 紅葉,14,8月15日,A,146,梨,無し,いとおかし
```

読み込ませる場所を示すマニフェストファイルのサンプルです。
```json:manifesto.json
{
	"fileLocations": [
		{"URIPrefixes": ["s3://<S3バケット名>/testspace/tings/"]}
    ]
}
```

QuickSightから新規でデータソースを作成し、ビジュアルで表を作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/786b3beb-60cf-e77d-ec9b-40077a98304d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/76295273-e446-103f-074d-ba686f1ef03f.png)

この次に使うデータセットIDを取得します。

```
$ aws quicksight list-data-sets --aws-account-id <AWSアカウントID>
{
    "DataSetSummaries": [
        {
            "Arn": "arn:aws:quicksight:<リージョン>:<AWSアカウントID>:dataset/<DataSetId>",
            "DataSetId": "<DataSetId>",
            "Name": "tings_members",
            "CreatedTime": "2022-09-03T01:51:00.339000+00:00",
            "LastUpdatedTime": "2022-09-03T01:51:00.339000+00:00",
            "ImportMode": "SPICE",
            "RowLevelPermissionTagConfigurationApplied": false,
            "ColumnLevelPermissionRulesApplied": false
        },
        {
...
```

## ステートマシン作成

CreateIngeestionにパーツを変えてパラメータに、アカウントID、先に取得したデータセットIDを設定し、IngestionIdには組み込み関数の結果が渡るようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/24e211c1-ea94-4085-084c-365b0a640c23.png)

ステートマシンにアタッチさせているIAMロールに、CreateIngestionの権限を付与しておいてください。

```json:IAMロール例
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "quicksight:CreateIngestion",
            "Resource": "arn:aws:quicksight:<リージョン>:<AWSアカウントID>:dataset/<DataSetId>/ingestion/*"
        }
    ]
}
```

実際にファイルから2行を削除し、同名でアップし上書きします。
```diff:members.csv
名前,年齢,誕生日,血液型,身長(cm),好きなもの,嫌いなもの,口癖
青天国 春,16,4月28日,A,160,カレーライス(甘口),長いも,春ちゃんにお任せあれ！
玉城 杏夏,15,1月17日,A,158,チーズバーガー,ヨーグルト,お茶目なジョークです
聖舞 理王,14,9月23日,AB,155,プリン(甘天堂),ピーマン,なぜなら私は、理王様だから！
- 祇園寺 雪音,16,8月8日,AB,164,カレーライス(激辛),無し,私様にお任せだ！
- 伊藤 紅葉,14,8月15日,A,146,梨,無し,いとおかし
```

準備ができたら、ステートマシンを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/c69e7d87-7af5-469c-b6b8-88cdc40c7539.png)

結果をみると、IngestionIdに生成されたUUIDが渡り実行されているのが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/afda46ac-1dce-4998-7012-56fa2da9082c.png)

QuickSightの更新履歴から、指示を受け付けたことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/f1b2129d-4b09-a454-3599-43454fd87d91.png)

表の方も反映されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/c07b18b8-a4d0-95f5-755a-c4ce142a26d0.png)

## 2回目以降の実行
以前は都度、IngestionIdに渡すパラメータを変更する必要がありましたが、今回はステートマシンに何も変更を加えず、更新されるか確認してみます。
対象のS3のフォルダに、以下のファイルを置きます。
```text:yukimoji.csv
名前,年齢,誕生日,血液型,身長(cm),好きなもの,嫌いなもの,口癖
祇園寺 雪音,16,8月8日,AB,164,カレーライス(激辛),無し,私様にお任せだ！
伊藤 紅葉,14,8月15日,A,146,梨,無し,いとおかし
```

再度、ステートマシンを実行します。
結果を確認すると、先ほどと異なるIngestionIdが渡っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/84d6f8b9-c5d1-3638-b182-b12e64cdd827.png)


QuickSightの更新履歴から、更新指示を受け付けたことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/d07acfad-1104-9384-c1d1-7b98c0b0f1af.png)

表も更新され、5行になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/52c5afc8-9631-64e1-d864-b40154262967.png)

変更なしで、データセット更新が確認できました。

# おわりに

Step Functionsの新しい組み込み関数を用いて、以前できなかったノーコードでのQuickSightのデータセット更新ができるようになりました。

組み込み関数を駆使すれば、今までLambda等が必要だった処理も、Step Functions単体でできるようになるかもしれず、より使いやすくなったと思います。