Amazon QuickSightのSPICEへのデータ取り込みをAPI(AWS CLI)からやってみる

2022.08.18

こんにちは、CX事業本部 IoT事業部の若槻です。

Amazon QuickSightでは、Datasetへのデータソース(AthenaやS3 Bucketなど)からのデータ取り込み(Ingestion)方式として、分析時に毎回直接クエリする方式の他に、SPICEにインポートする方式を選択できます。

SPICEとはSuper-fast, Parallel, In-memory Calculation Engineの略で、データソースから取り込まれたデータがメモリ上で再利用されるため、直接クエリする場合に比べて分析時に高速にデータを読み込み可能となります。

このSPICE上のデータのリフレッシュ(フルまたは増分でのデータ取り込み)は、手動またはスケジュールで実施が可能です。

そして手動リフレッシュの場合は、データソースの更新をフックにして自動でLambdaやStep FunctionsからAPI経由で行いたい場合がありそうですね。

そこで今回は、Amazon QuickSightのSPICEのデータ取り込み(ingestion)をAPI(AWS CLI)から手動で実行する方法を確認してみました。

やってみた

AWS CLIコマンドの確認

AWS CLIのドキュメントを見ると、Datasetへのデータの取り込み(ingestion)を操作するコマンドは以下の4つがあります。

  • create-ingestion
  • cancel-ingestion
  • describe-ingestion
  • list-ingestions

データのingestionはcreate-ingestionコマンドを使えば良いらしい。(1日毎のリフレッシュ回数に上限があることに注意)

Creates and starts a new SPICE ingestion for a dataset. You can manually refresh datasets in an Enterprise edition account 32 times in a 24-hour period. You can manually refresh datasets in a Standard edition account 8 times in a 24-hour period. Each 24-hour period is measured starting 24 hours before the current date and time.

コマンドのSynopsisは下記とのこと。--data-set-id--aws-account-idは分かるが、--ingestion-idというのがよく分からない。

  create-ingestion
--data-set-id <value>
--ingestion-id <value>
--aws-account-id <value>
[--ingestion-type <value>]
[--cli-input-json | --cli-input-yaml]
[--generate-cli-skeleton <value>]

そこでlist-ingestionsコマンドを実行してみると、ingestionの履歴が取得できました。IngestionIdはユニークな値を指定すれば良さそうですね。

$ aws quicksight list-ingestions \
  --data-set-id ${DATA_SET_ID} \
  --aws-account-id ${AWS_ACCOUNT_ID}
{
    "Ingestions": [
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:XXXXXXXXXXXX:dataset/quickSightAthenaDataSet/ingestion/c5e41e60-a944-44cd-9881-db9246bc85c2",
            "IngestionId": "c5e41e60-a944-44cd-9881-db9246bc85c2",
            "IngestionStatus": "COMPLETED",
            "ErrorInfo": {},
            "RowInfo": {
                "RowsIngested": 5,
                "RowsDropped": 0,
                "TotalRowsInDataset": 5
            },
            "CreatedTime": "2022-08-18T01:42:15.562000+09:00",
            "IngestionTimeInSeconds": 19,
            "IngestionSizeInBytes": 363,
            "RequestSource": "MANUAL",
            "RequestType": "FULL_REFRESH"
        },
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:XXXXXXXXXXXX:dataset/quickSightAthenaDataSet/ingestion/4bbfe54c-1ac0-4c57-bd94-235d5c11e05a",
            "IngestionId": "4bbfe54c-1ac0-4c57-bd94-235d5c11e05a",
            "IngestionStatus": "COMPLETED",
            "ErrorInfo": {},
            "RowInfo": {
                "RowsIngested": 5,
                "RowsDropped": 0,
                "TotalRowsInDataset": 5
            },
            "CreatedTime": "2022-08-18T01:41:57.388000+09:00",
            "IngestionTimeInSeconds": 19,
            "IngestionSizeInBytes": 363,
            "RequestSource": "MANUAL",
            "RequestType": "FULL_REFRESH"
        },
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:XXXXXXXXXXXX:dataset/quickSightAthenaDataSet/ingestion/3d77beaf-9efd-4c10-8763-870b207d1f1e",
            "IngestionId": "3d77beaf-9efd-4c10-8763-870b207d1f1e",
            "IngestionStatus": "COMPLETED",
            "ErrorInfo": {},
            "RowInfo": {
                "RowsIngested": 0,
                "RowsDropped": 0,
                "TotalRowsInDataset": 0
            },
            "CreatedTime": "2022-08-18T01:08:09.015000+09:00",
            "IngestionTimeInSeconds": 47,
            "IngestionSizeInBytes": 0,
            "RequestSource": "MANUAL",
            "RequestType": "EDIT"
        },
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:XXXXXXXXXXXX:dataset/quickSightAthenaDataSet/ingestion/35b6efee-0f77-49b7-b95f-352ff7d861e2",
            "IngestionId": "35b6efee-0f77-49b7-b95f-352ff7d861e2",
            "IngestionStatus": "COMPLETED",
            "ErrorInfo": {},
            "RowInfo": {
                "RowsIngested": 0,
                "RowsDropped": 0,
                "TotalRowsInDataset": 0
            },
            "CreatedTime": "2022-08-17T23:35:27.752000+09:00",
            "IngestionTimeInSeconds": 17,
            "IngestionSizeInBytes": 0,
            "RequestSource": "MANUAL",
            "RequestType": "INITIAL_INGESTION"
        }
    ],
    "Status": 200,
    "RequestId": "9f8b1faa-5efb-4296-99e6-a868e2bb66a8"
}

ingestionしてみる

現在、SPICEに取り込まれているレコード数は5です。

データソースはAthena(S3 Bucket)なので、対象のBucketにデータ(3レコード)を追加します。

aws s3 cp data2.json s3://${BUCKET_NAME}/data/data2.json

create-ingestionコマンドを実行すると、"IngestionStatus": "INITIALIZED"となりingestionが開始されたようです。

$ ingestionId=$(date +%s)
$ aws quicksight create-ingestion \
--data-set-id ${DATA_SET_ID} \
--ingestion-id ${ingestionId} \
--aws-account-id ${AWS_ACCOUNT_ID}
{
    "Status": 201,
    "Arn": "arn:aws:quicksight:ap-northeast-1:XXXXXXXXXXXX:dataset/quickSightAthenaDataSet/ingestion/1660833098",
    "IngestionId": "1660833098",
    "IngestionStatus": "INITIALIZED",
    "RequestId": "46dd624f-ef33-40c1-9b19-33cbf8b3c2e0"
}

コンソールからDatasetの詳細を見ると、2分前にリフレッシュが行われ、レコード数が8に増えています!増分取り込みがちゃんと行われていますね。

おわりに

Amazon QuickSightのSPICEのデータ取り込みをAPI(AWS CLI)から手動で行う方法を確認してみました。

SPICEについてあまり詳しく調べたことが無かったので、データの取り込み(ingestion)の履歴の概念など勉強になりました。

余談ですが、SPICEはADMINコンソールからワンクリックで追加容量を購入できちゃうんですね。間違えて1GB分買っちゃいました。禊としてQuickSightのブログをもう何本か書こうと思います。

参考

以上