データセットを更新したユーザを確認したい

QuicksightのSPICE空き容量が急に圧迫してしまうことがあり、追加購入の対応で応急処置しています。
どのユーザのデータセット更新が起因しているかをすぐに確認したいのですが、方法があればご教示いただけないでしょうか?

※500GBほどSPICE空き容量があった翌日いきなり容量が足りなくなり、他ユーザのデータセット自動更新もSTOPしてしまうといったことがあり、ユーザ影響が大きく困っています。
そのため原因となった容量を圧迫したデータセットを迅速に特定したいです。

ご質問ありがとうございます。

QuickSight としての機能提供はございませんが、データセットの更新は create-ingestion で行われており、この API の実行履歴は CloudTrail でご確認いただくことが可能でございます。

具体的には、CloudTrail のコンソールで以下の条件を指定することで、問題が発生した期間のデータセット更新を確認できます:

  • イベント名:CreateIngestion
  • 対象期間:容量不足が発生した時間帯

そのため、CloudTrail で記録されているイベント情報を何らかの方法で検知する実装をしていただき、その実装で更新されたデータセットのデータ増加量が多い場合には QuickSight 管理者に通知する実装をしていただけると幸いです。

以下のAPIを活用することで、データセットの更新状況を確認できます:

それぞれの API のレスポンスとしては以下の内容が実行結果として返ってきます。そして返ってきた IngestionSizeInBytes キーがデータセットの容量になりますので、この値が一定の容量(例:100GB)を超えた場合に管理者に通知する処理を実装していただければと思います。

~ $ aws quicksight create-ingestion --data-set-id <value> --ingestion-id <value> --aws-account-id 123456789012
{
    "Status": 201,
    "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/<value>/ingestion/<value>",
    "IngestionId": "<value>",
    "IngestionStatus": "INITIALIZED",
    "RequestId": "d052565c-b15d-413f-ad33-c60eb107a77b"
}
~ $ aws quicksight list-ingestions --aws-account-id 123456789012 --data-set-id <value>
{
    "Ingestions": [
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/<value>/ingestion/0206-v01",
            "IngestionId": "0206-v01",
            "IngestionStatus": "COMPLETED",
            "ErrorInfo": {},
            "RowInfo": {
                "RowsIngested": 1461,
                "RowsDropped": 0,
                "TotalRowsInDataset": 1461
            },
            "CreatedTime": "2025-02-06T03:00:30.324000+00:00",
            "IngestionTimeInSeconds": 15,
            "IngestionSizeInBytes": 365982,
            "RequestSource": "MANUAL",
            "RequestType": "FULL_REFRESH"
        },
        {
            "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/618a67fd-149a-4f54-9afe-9b13bb39185f/ingestion/2feba5c3-fb04-4aef-ae5e-80c4c1fef18e",
            "IngestionId": "2feba5c3-fb04-4aef-ae5e-80c4c1fef18e",
            "IngestionStatus": "COMPLETED",
            "ErrorInfo": {},
            "RowInfo": {
                "RowsIngested": 1461,
                "RowsDropped": 0,
                "TotalRowsInDataset": 1461
            },
            "CreatedTime": "2025-02-05T07:47:59.937000+00:00",
            "IngestionTimeInSeconds": 15,
            "IngestionSizeInBytes": 365982,
            "RequestSource": "MANUAL",
            "RequestType": "INITIAL_INGESTION"
        }
    ],
    "Status": 200,
    "RequestId": "4c43761b-b954-47fa-bcd4-1731963b39db"
}
~ $ aws quicksight describe-ingestion --aws-account-id 123456789012 --data-set-id <value>  --ingestion-id <value>
{
    "Status": 200,
    "Ingestion": {
        "Arn": "arn:aws:quicksight:ap-northeast-1:123456789012:dataset/<value>/ingestion/<value>",
        "IngestionId": "<value>",
        "IngestionStatus": "COMPLETED",
        "ErrorInfo": {},
        "RowInfo": {
            "RowsIngested": 1461,
            "RowsDropped": 0,
            "TotalRowsInDataset": 1461
        },
        "CreatedTime": "2025-02-06T03:00:30.324000+00:00",
        "IngestionTimeInSeconds": 15,
        "IngestionSizeInBytes": 365982,
        "RequestSource": "MANUAL",
        "RequestType": "FULL_REFRESH"
    },
    "RequestId": "510cb402-2942-470a-9fe8-bf56b2555018"
}

また、将来的な実装としては、CloudTrail → EventBridge → Lambda → SNS という構成で自動監視の仕組みを構築することをご検討いただければと思います。

1 Like

ありがとうございます。
上記ご提案頂いた方法で通知機能の実装を進めてみたいと思います。
実装に際してまた不明な点が出てきましたら改めてご相談させてください。

1 Like

どのユーザのデータセット更新が起因しているかをすぐに確認したいのですが、方法があればご教示いただけないでしょうか?

@Iwaki さん、もしまだ該当のデータセットが特定できずお困りの場合、お手元でAWS CLIが使えるようでしたら以下のコマンドでSPICEデータセットの一覧が取得できますので、ご参考までに共有いたします。

これはSPICEデータセットのID(DataSetId)、名前(Name)、作成日時(CreatedTime)、最終更新日時(LastUpdatedTime)、SPICE消費サイズ(ConsumedSpiceCapacityInBytes)をCSV形式で一覧出力するものになります。最終更新日時とSPICE消費サイズを確認することで対象データセットを特定できるのではないかと思います。そのうえでデータセットIDに対しListIngestions API(list-ingestions)を実行すると契機となった更新の特定が早くなります。

(aws quicksight list-data-sets --aws-account-id $AID | jq -r '.DataSetSummaries[] | select(.ImportMode == "SPICE") | .DataSetId' | while read ID; do aws quicksight describe-data-set --aws-account-id $AID --data-set-id $ID | jq -r '.DataSet | [.DataSetId, .Name, .CreatedTime, .LastUpdatedTime, .ConsumedSpiceCapacityInBytes] | @csv' & done) >>./spice-data-set.csv 2>>error.log

補足:

  • $AIDは12桁のAWSアカウントIDで置き換えてください。
  • コマンド内でDescribeDataSet APIを並列で実行する都合、お持ちのデータセット数によっては多数のリクエストが流れAPIがスロットルされる可能性があります。AWS CLI v2はデフォルトで最大2回までリトライを行いますしますが(つまり計3回実行)、必要に応じてAWS CLIの設定で一時的にリトライ回数を増やしてください。方法は以下リンクの「AWS 設定ファイルでの再試行設定の定義」の項をご覧ください。なお、このAPIはQuickSightのコントロールプレーンに対して行われるもので、仮にAPIがスロットルされても実際のエンドユーザーへの性能影響などはございませんのでご安心ください。
    AWS CLI での AWS CLI の再試行 - AWS Command Line Interface
  • DescribeDataSet APIの実行はバックグラウンドで行うことで並列化しています。データセットの数量によって全コマンドの終了までに時間がかかりますので、Linuxの場合はpsコマンドで実行状況を確認し、全てのコマンドが終了しらたらファイルを確認ください。
  • error.log には以下のエラーが記録されている可能性があります。これはファイルアップロードで作成したデータセットの場合、DescribeDataSet APIが対応していないためです。しかしファイルアップロードの場合はそもそも最大1GBまでと言う制約があるため、今回の目的においては無視していただいて構いません。つまり、spice-data-set.csvに記録されるのはSPICEデータセットかつファイルアップロードでないもの、となります。
    An error occurred (InvalidParameterValueException) when calling the DescribeDataSet operation: The data set type is not supported through API yet
    
  • 同様の処理をLambdaなどで定期実行し、データセット化してQuickSight上に管理用のダッシュボードを作るといったことも可能ですのでご検討ください。

以上、ご参考になれば幸いです。

1 Like

↑あくまで一時切り分けのための参考情報になりますので、恒久的な監視の仕組みについては keien-nishikawa さんご案内の方法を参考にしてみてくださいませ。

1 Like

直ぐに確認できる方法も教えて頂きありがとうございます。非常に助かります。

こちらである程度データセットを絞り込めました。ありがとうございます。
1点質問させてください。
SPICE消費サイズ(ConsumedSpiceCapacityInBytes)は最終更新日時(LastUpdatedTime)に更新によって新たに消費された容量になりますでしょうか?
それともデータセット自体の総容量になりますでしょうか?

@Iwaki さん、データセット自体の総容量になります。
更新によって新たに消費された容量については、特定したデータセットIDに対しListIngestions API(list-ingestions)を実行し、IngestionSizeInBytesをご確認ください。

1 Like

ありがとうございます。
無事対象のデータセットを特定できました。

1 Like