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

# <font color="Red">追記(2022.09.04)</font>
Step Functionsで組み込み関数が追加されるアップデートにより、本記事の内容ができるようになりました。
以下にて記事にしておりますので、ご参照ください。

https://qiita.com/a_b_/items/8e4cb983cd083357787d

# はじめに
以下のような経緯で、タイトルのことができなそうなのがわかったので、記事にしました。
（出来ることがわかる方いらっしゃいましたら、教えてください）

## 経緯

1. QuickSightのデータセットの更新を、S3のファイル作成/削除をトリガーにして自動実行する構成を検討していた。
1. データセット更新の際の`CreateIngestion`が、Step Functionsで実行できることを見つけた。
1. ノーコードで構築できると期待して試してみたが、`CreateIngestion`に、一意のIdを生成して渡す必要があった。
1. 「一意のId生成部分をLambdaで実装」とすると、ノーコードにはならない。
1. Lambdaで作るなら、`CreateIngestion`もLambdaで実装すればよいため、Step Functionsも不要と判断。

# （想定していた）構成

赤点線で囲んである部分が、今回の内容です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/0e216668-abef-ef95-63fd-f7cef670b442.png)


# わかったこと

## QuickSightのデータセット更新指示

[create-ingestion](https://docs.aws.amazon.com/cli/latest/reference/quicksight/create-ingestion.html)を使います。
[ここ](https://docs.aws.amazon.com/cli/latest/reference/quicksight/index.html#cli-aws-quicksight)とか[ここ](https://docs.aws.amazon.com/ja_jp/quicksight/latest/APIReference/API_Operations.html)を見ても、Ingestionについては、`cancel`、`create`、`describe`、`list`しかなく、再実行的なものが見当たりませんでした。
都度IngestionをCreateする必要があります。

## Step Functionsの、CreateIngestion

[ステートマシーンの作成]から、「ワークフローを視覚的に設計」でWorkflow Studioを開きます。
ingestionで検索するとQuickSightの処理が4つ出てきますので、CreateIngestionをドラッグします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/a1dae19f-8fd8-56ce-1408-9ac0ca5531c8.png)

右ペインでパラメータを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/365505f3-3652-eea8-c850-b8ef135c8a42.png)

### DataSetId
DataSetIdは、CloudShellで、以下のコマンドで分かります。

```
$ aws quicksight list-data-sets --aws-account-id <AWSアカウントID>
{
    "DataSetSummaries": [
        {
            "Arn": "arn:aws:quicksight:<リージョン>:<AWSアカウントID>:dataset/<DataSetId>",
            "DataSetId": "<DataSetId>",
            "Name": "<DataSet名>",
            "CreatedTime": "2021-01-13T00:35:28.982000+00:00",
            "LastUpdatedTime": "2021-01-13T00:35:29.208000+00:00",
            "ImportMode": "SPICE",
            "RowLevelPermissionTagConfigurationApplied": false,
            "ColumnLevelPermissionRulesApplied": false
        },
        {
...
```

### IngestionId
IngestionIdは公式の説明によると必須で、`^[a-zA-Z0-9-_]+$`の制限があるようです、「未指定だと自動でId付与」などはしてくれないです。

https://docs.aws.amazon.com/ja_jp/quicksight/latest/APIReference/API_CreateIngestion.html#API_CreateIngestion_RequestSyntax

1234567890 と入れておきました。

## 実行

実行結果は以下のようになりました。

| | IngestionId | Step Functionsのステータス | QuickSightのデータセット更新 |
|:-:|:-:|:-:|:-:|
| 初回 | 1234567890 | 成功 | 更新される |
| 2回目 | 1234567890 | 成功 | <font color="Red">**反応なし**</font> |
| 3回目 | <font color="Red">**2**</font>234567890 | 成功 | <font color="Red">**更新される**</font> |

IngestionIdが同じ場合、Step Functionsで実行する`CreateIngestion`は成功扱いですが、QuickSight側では2回目以降は無視されるようです。IngestionIdを変えれば更新されました。
IngestionIdを変えられるような方法がないか調べてみました。

## IngestionId変更方法

### 引数より

前の処理から渡された内容をパラメータに指定する方法が公式にありました。

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/input-output-inputpath-params.html#input-output-parameters

- "<セット対象のkey>**.\$**": "**\$.**<セットさせたい入力値のJsonパス>"
    - key名の末尾に`.$`
    - 値に、`$.`から始めたJsonパス

前の処理でIdを生成し、それを渡せばできそうです。
が、Id生成のLambda関数を作る時点でノーコードではなくなってしまいます。。。

### コンテキストより

ワークフローの状態に関する情報にアクセスする方法もありました。

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/input-output-contextobject.html#contextobject-access

- "<セット対象のkey>**.\$**": "**\$$.**<セットさせたい入力値のJsonパス>"
    - key名の末尾に`.$`
    - 値に、`$$.`から始めたJsonパス

コンテキストの中に、Idに使えそうな文字列があればよいのですが。。。

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/input-output-contextobject.html#contextobject-format

日時などは`:`が混じっているため、使えなさそうでした。

# 結論
- Step Functionsを用いて、ノーコードでQuickSightのデータセット更新はできない模様。
    - そのため、Lambda関数を自作することとしました。
 
# おわりに

ノーコードに憧れてQuickSightを操作しようと調べていましたが、無理そうでした。
Step Functionsにて入力値をパラメータへ渡す方法など知ることができたので、使う際にはスムーズに構築できそうです。