[アップデート] Amazon QuickSight で API でデータセット更新スケジュールを管理出来るようになったので AWS CLI から使ってみた

2023.04.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

先日 AWS API のアップデートで QuickSight 上でいくつかの機能が追加されていることがアナウンスされていました。
タグベース RLS の Condition 追加については What's New でアナウンスがありましたが、それとは別で SPICE 取り込み関係の API も更新されていることに気がつきました。

この記事では何が出来るようになったかをまとめたいと思います。

先にまとめ

従来は データセット(SPICE) のデータ更新をスケジュール設定する場合は、QuickSight コンソール画面からしか設定が出来ませんでした。
これが、今回のアップデートで API (SDK や CLI など)から設定出来るようになりました。

本日時点では CloudFormation ではまだサポートされていませんが、API が対応したのでサポートされる可能性がかなり高くなりました。
SPICE の定期更新を含む QuickSight ソリューションを自動でデプロイしたい場合は、従来は取り込み部分を EventBridge や Lambda で別途スケジューリングする必要があったと思いますが、そういった自動展開を行う際に QuickSight 標準の SPICE 取り込みを導入しやすくなりました。

2023.04.15 追記

CloudFormation でもサポートされました。

データセット (SPICE) 更新

初めにおさらいですが、QuickSight ではデータソースのタイプに SPICE かダイレクトクエリか選択が出来ます。

ダイレクトクエリは分析やダッシュボードがデータを必要とするタイミングで都度データソース(Athena や S3、Redshift など)へのデータ取得操作が発生します。
データソースに対するリアルタイム性がありますが、レイテンシやデータソース側のコンピューティングリソースなどの考慮が必要です。

SPICE (Super-fast, Parallel, In-memory Calculation Engine) は QuickSight 上に存在するインメモリエンジンです。
高速な SPICE からデータを計算&ロードすることで分析やダッシュボードで多くの場合はダイレクトクエリよりもレンダリングが高速になります。
ただし、データソースから SPICE へ取り込んだ時点のデータを表示するため、データソースよりも古い情報を表示している可能性があります。
そのため、データセットの要件に併せて定期的に SPICE のデータ更新を行う必要があります。

QuickSight のデータセットでは以下にて更新スケジュールを設定することが出来ます。

この場合は、毎週火曜日の1:00AM (JST) に自動で更新されます。

今回のアップデート

本日時点では AWS CLI の v1.27.109 or v2.11.12 以上から次の新しいコマンドが利用出来るようになっています。

  • create-refresh-schedule
  • delete-data-set-refresh-properties
  • delete-refresh-schedule
  • describe-data-set-refresh-properties
  • describe-refresh-schedule
  • list-refresh-schedules
  • put-data-set-refresh-properties
  • update-refresh-schedule

実際に使ってみました。

スケジュールを取得

次のようにフル更新と増分更新が設定されているデータセットを指定してスケジュールを取得してみます。

% cat list-refresh-schedules.json
{
    "AwsAccountId": "123456789012",
    "DataSetId": "1e2b0065-6b11-4b21-a8b8-5c39bd31be7d"
}
% aws-v1 quicksight list-refresh-schedules --cli-input-json file://list-refresh-schedules.json
{
    "Status": 200,
    "RefreshSchedules": [
        {
            "ScheduleId": "13552f21-17a8-40df-b6ee-8f0ced472435",
            "ScheduleFrequency": {
                "Interval": "WEEKLY",
                "RefreshOnDay": {
                    "DayOfWeek": "MONDAY"
                },
                "Timezone": "Asia/Tokyo",
                "TimeOfTheDay": "05:00"
            },
            "StartAfterDateTime": 1681329600.0,
            "RefreshType": "FULL_REFRESH",
            "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/1e2b0065-6b11-4b21-a8b8-5c39bd31be7d/refresh-schedule/13552f21-17a8-40df-b6ee-8f0ced472435"
        },
        {
            "ScheduleId": "89b249ff-d853-4fc5-8da5-98103beaff8d",
            "ScheduleFrequency": {
                "Interval": "MINUTE30",
                "Timezone": "Asia/Tokyo",
                "TimeOfTheDay": "12:00"
            },
            "StartAfterDateTime": 1681354800.0,
            "RefreshType": "INCREMENTAL_REFRESH",
            "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/1e2b0065-6b11-4b21-a8b8-5c39bd31be7d/refresh-schedule/89b249ff-d853-4fc5-8da5-98103beaff8d"
        }
    ],
    "RequestId": "3f944c0e-11dd-4110-aed8-d7da10c0893b"
}

スケジュール一覧画面を同じ構造ですね。
RefreshTypeでフル更新か増分更新か判別出来るようになっています。

更新構成

describe-data-set-refresh-propertiesで対象データセットに設定されているスケジュール共通の更新構成値を取得出来ます。
本日時点では次のような増分更新時のウィンドウサイズ設定と日付列が取得出来ます。

% aws-v1 quicksight describe-data-set-refresh-properties --cli-input-json file://list-refresh-schedules.json
{
    "Status": 200,
    "RequestId": "2e93814f-3e8c-4bf6-a979-fe487fef6bc9",
    "DataSetRefreshProperties": {
        "RefreshConfiguration": {
            "IncrementalRefresh": {
                "LookbackWindow": {
                    "ColumnName": "UsageDateTime",
                    "Size": 4,
                    "SizeUnit": "HOUR"
                }
            }
        }
    }
}

コンソールでいうと以下の設定箇所になります。

put-data-set-refresh-propertiesでこの構成を変更することが出来ます。

% cat put-data-set-refresh-properties.json
{
    "AwsAccountId": "123456789012",
    "DataSetId": "1e2b0065-6b11-4b21-a8b8-5c39bd31be7d",
    "DataSetRefreshProperties": {
        "RefreshConfiguration": {
            "IncrementalRefresh": {
                "LookbackWindow": {
                    "ColumnName": "UsageDateTime",
                    "Size": 2,
                    "SizeUnit": "HOUR"
                }
            }
        }
    }
}
% aws-v1 quicksight put-data-set-refresh-properties --cli-input-json file://put-data-set-
refresh-properties.json 
{
    "Status": 201,
    "RequestId": "0a917279-d53c-4c96-bdc3-0fb39ce21bdb"
}

注意点として、増分更新設定の変更後はフル更新が強制的に発生します。
本日時点ではput-data-set-refresh-propertiesで設定出来るのは増分更新のもののみなので、更新後にデータセットの手動フル更新が走ることになります。
データソース側への負荷などに注意してください。

フル更新後、次のようにウィンドウサイズが 2 に更新されていました。

スケジュールを追加

create-refresh-scheduleでスケジュールを追加出来ます。
日付の範囲や登録可能な上限数などいくつか画面と同じように入力制限があり、問題がある場合はコマンド実行時にエラーとなります。

% cat create-refresh-schedule.json
{
    "AwsAccountId": "123456789012",
    "DataSetId": "1e2b0065-6b11-4b21-a8b8-5c39bd31be7d",
    "Schedule": {
        "ScheduleId": "hoge0412schedule1",
        "ScheduleFrequency": {
            "Interval": "DAILY",
            "Timezone": "Asia/Tokyo",
            "TimeOfTheDay": "10:00"
        },
        "StartAfterDateTime": "2023-04-15T00:00:00",
        "RefreshType": "FULL_REFRESH"
    }
}
% aws-v1 quicksight create-refresh-schedule --cli-input-json file://create-refresh-schedule.json
{
    "Status": 201,
    "RequestId": "8f936297-eed5-43ca-8bdb-ac448859a207",
    "ScheduleId": "hoge0412schedule1",
    "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/1e2b0065-6b11-4b21-a8b8-5c39bd31be7d/refresh-schedule/hoge0412schedule1"
}

上記では次のようにフル更新の日次スケジュールを追加してみました。
ScheduleIdが通常は UUID が自動で設定されていますが、CLI から実行時は任意で設定することが出来ます。

逆にスケジュールを削除する場合はdelete-refresh-scheduleが利用出来ます。
ここで、先程使ったScheduleIdを指定します。

% cat delete-refresh-schedule.json
{
    "AwsAccountId": "123456789012",
    "DataSetId": "1e2b0065-6b11-4b21-a8b8-5c39bd31be7d",
    "ScheduleId": "hoge0412schedule1"
}
% aws-v1 quicksight delete-refresh-schedule --cli-input-json file://delete-refresh-schedu
le.json
{
    "Status": 200,
    "RequestId": "eafad7c4-4c0a-42c9-badf-a9503e496d56",
    "ScheduleId": "hoge0412schedule1",
    "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/1e2b0065-6b11-4b21-a8b8-5c39bd31be7d/refresh-schedule/hoge0412schedule1"
}

削除されましたね。

さいごに

本日は Amazon QuickSight で API でデータセット更新スケジュールを管理出来るようになったので AWS CLI から使ってみました。

有効なユースケースはまだ多くないと思いますが、例えば AWS DevOps Monitoring Dashboard のような形でダッシュボードやテンプレートを配布したいけどもコード化して全て配布したいとか、Organizations やマルチテナントな環境で横展開するときに作成済みのデータセットテンプレートではなくてコードを使いたい場合などは API を経由してスケジュールも配布することが出来そうです。

CloudFormation すぐ対応するんじゃないなぁという気はしますが、それまでにどうしても使いたければカスタムリソースですね。 → 対応されました!