Amazon Web Services ブログ

Amazon QuickSight の利用状況分析とライセンスコスト最適化の方法

本ブログは 2025 年 3 月 21 日に公開された Blog “Optimize your Amazon QuickSight implementation: a guide to usage analytics and cost management” を翻訳したものです。

組織全体で Amazon QuickSight の利用状況を正確に把握し、最適化することは、コストを無駄なく管理し、BI への投資効果を最大化するためにとても重要です。QuickSight の導入が進み、さまざまな役割のユーザーが利用するようになるにつれて、「誰がどのように使っているか」を明確に可視化することの重要性が一層高まっています。

一方で、多くのお客様から、「ユーザーの利用状況を把握するのが難しい」というお声を頂いております。例えば、「過去90日間で追加された リーダープロ ライセンスの数は?」「セッションの利用パターンはどうなっているのか?」といった内容です。

こうしたニーズに応えるべく、QuickSight の利用状況を簡単に把握し、QuickSight のライセンスの棚卸しや最適化の意思決定をよりデータドリブンに行えるようにするソリューションをご紹介します。

AWS CloudFormation テンプレートを使って、以下のソリューションを簡単に導入できます。

  • AWS Glue と QuickSight API を活用して、QuickSight ユーザー情報を自動で抽出
  • Amazon Athena テーブルを作成し、QuickSight アカウントのユーザーデータや、コストと使用状況レポート(AWS CUR)に基づいた集約ビューの作成
  • 事前構築された QuickSight ダッシュボードをセットアップし、次のようなインサイトを提供
    • リーダーの利用状況と、非アクティブユーザーの特定
    • セッションの消費パターン(リーダー・匿名ユーザーの両方)
    • SPICE(超高速インメモリ計算エンジン)、アラート、ピクセルパーフェクトレポート、Amazon Q の利用状況
    • コスト最適化に向けたインサイト

少人数のチームを管理している場合でも、企業全体に展開している場合でも、この分析ソリューションを活用することで、QuickSight の導入状況を把握し、データに基づいたライセンスの棚卸しが可能になります。さらに、今後予定されている価格変更への備えにもなります。

ソリューションの概要

このソリューションは、QuickSight と他の AWS サービスを組み合わせて、分析用データを作成します。導入をシンプルにするために、必要なリソースをすべて自動で作成する CloudFormation テンプレートを用意しています。

  1. AWS Glue ジョブ:qs-usage-users-info という Python シェルスクリプトが毎日実行されるようにスケジューリングされており、QuickSight API を呼び出して、QuickSight アイデンティティリージョン内のユーザー情報を取得します。
  2. S3バケット:Glue ジョブが取得した結果は、qs-usage-{AWS::AccountId}-{AWS::Region} という名前の新しい Amazon Simple Storage Service (Amazon S3)  バケットに保存されます。
  3. Athena テーブル・ビュー:上記の S3 データをもとに、Athena データベース qs-usage-db にテーブルが作成され、さらに AWS アカウント内の コストと使用状況レポート (CUR) データをベースにビューが作成されます。
  4. QuickSight ダッシュボード:Athena のテーブルと ビュー を元にしたデータセットを使って、QuickSight ダッシュボードがデプロイされます。このダッシュボードが実際のデータを取り込み、視覚的なインサイトを提供します。

上記のアーキテクチャ図は、主に次の3つのステップで構成されています。

  1. ETL(抽出・変換・ロード)ジョブによる QuickSight ユーザー情報の収集
    AWS Glue が毎日 ETL ジョブを実行し、QuickSight アカウントに登録されているユーザー情報を収集します。これにより、常に最新の情報が意思決定者の手元に届くようになります。
  2. Athena 上に集計ビューを作成し、QuickSight の利用傾向を可視化
    既存の コストと使用状況レポート (CUR) データを元に、Athena に集計ビューを構築します。これにより、すべてのプロダクトグループを横断して、QuickSight の利用状況を俯瞰的に把握できます。
  3. データを SPICE に取り込み、QuickSight Usage Analytics ダッシュボードで利用状況を分析
    集めたデータを SPICE にインポートすることで、高速な分析が可能になります。QuickSight の使用状況を視覚的に分析できるダッシュボードを使って、利用パターンやコスト最適化のためのインサイトを得られます。

前提条件

この手順を進める前に、以下の準備が整っていることを確認してください。

  • AWS IAM(Identity and Access Management)の権限
    CloudFormation を使って AWS リソースを作成するために、必要な IAM 権限を持っていることを確認してください。
  • コストと使用状況レポート (CUR) の設定
    AWS Data Exports を使って AWS CUR を有効化してください。
    ※ エクスポートタイプについては、レガシーCUR エクスポート標準データエクスポートのどちらの CUR でも対応可能ですが、本投稿で提示している手順はレガシーCUR エクスポートを前提としています。標準データエクスポートを利用される場合は、後述する Athena ビュー作成 SQL を修正頂く必要がございます。

    • 詳細なデータを取得するために、リソースIDの出力を有効化しておくことが重要です。
    • CUR の Glue テーブル化
    • CUR ファイルを Amazon Simple Storage Service (Amazon S3) にエクスポートするジョブが作成されます。S3 に保存されたファイルは、AWS Glue のクローラなどを使ってカタログ化し、Glue Data Catalog 上のテーブルとして利用できる状態にしておく必要があります。このテーブルは、後述のステップ2で使われる重要なデータソースとなります。
  • 以下の AWS サービスにアクセス可能であること

導入

提供されているテンプレートを使えば、このソリューションは 次の3つのステップ で簡単にセットアップおよびデプロイできます。

ステップ 1: S3 バケットと Glue ETL ジョブの作成

この CloudFormation テンプレートを使用する際には、QuickSight のアイデンティティリージョン(アカウントが属するリージョン)を正しく指定することが重要です。このステップを適切に行うことで、QuickSight アカウント内のユーザー情報を正確かつ網羅的に取得できるようになります。
※アイデンティティリージョンは必須であり、省略することはできません。

このテンプレートによって作成されるリソースは以下の通りです。

  • IAMロール: qs-usage-glue-role-{AWS::AccountId}-{AWS::Region}
    • QuickSight と Amazon S3 にアクセスするための権限を持つ、AWS Glue ジョブ用の IAM ロール
  • AWS Glue ジョブの Python シェルスクリプト: qs-usage-users-info
    • QuickSight API を使用してユーザー情報を取得するスクリプト
  • AWS Glue トリガー: QuickSightUsersExtractDailyTrigger
    • 上記の Glue ジョブを米国東部時間(ET)で毎朝6時に自動実行するスケジュール設定
    • ※ こちらはデプロイ完了後に日本時間 (JST) でのスケジュール設定に変更をお願いいたします。
  • S3 バケット: qs-usage-{AWS::AccountId}-{AWS::Region}
    • QuickSight ユーザー情報の抽出結果を保存するための専用バケット
  1. 以下、「Launch Stack」をクリックし、画面の指示に従ってこれらのリソースを作成してください。
  2. QuickSight のアイデンティティリージョンを選択してください。
    このパラメータは必須であり、QuickSight アカウントに登録されているユーザー情報を取得するために必要です。
  3. 「AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。」にチェックを入れ、「Next (次へ)」を選択してください。
  4. スタックの作成が完了したら、AWS Glue コンソールに移動し、ナビゲーションペインから 「ETL Jobs (ETL ジョブ)」「Visual ETL」 を選択します。
    次に、qs-usage-users-info ジョブを選択し、「Run job」 をクリックしてください。これにより、次回のスケジュール実行を待たずに、データセットをすぐに生成できます。
  5. ETL ジョブの実行が完了すると、ユーザー情報が抽出され、qs-users-info.csv というファイルとして、S3 バケット qs-usage-{AWS::AccountId}-{AWS::Region} に保存されます。
    S3 コンソールに移動し、該当のバケット内にデータファイルが正しく作成されていることを確認してください。

複数の AWS アカウントで QuickSight を管理している場合でも、このソリューションを使えば、自動化された ETL プロセスによりユーザー管理をシンプルに行えます。

それぞれのリンク済みアカウントにこのテンプレートをデプロイすることで、すべての QuickSight ユーザーデータを中央のアカウントに集約することができます。

このようにデータを一元管理することで、CUR(コスト&使用状況レポート)との連携による包括的な分析が可能になり、QuickSight ダッシュボードを通じて全社レベルでの使用状況を可視化できます。
結果として、組織全体の利用傾向を把握しやすくなり、最適化やモニタリングが格段に効率化されます。

ステップ2: Athena テーブルを作成する

2つ目の CloudFormation テンプレートは、Athena に次の2つのオブジェクトを作成します。

  • Athena テーブル: qs_users_info
    • このテーブルには、QuickSight のアイデンティティリージョンに存在するすべてのユーザープロファイルと、それぞれのロールが含まれています。
  • Athena 保存済みクエリ: qs_usage_cur_vw_query
    • このクエリは、アカウント内の AWS CUR テーブル上に作成され、QuickSight のさまざまな機能(アラート、ピクセルパーフェクトレポート、Amazon Q、セッション消費など)の使用傾向を分析するのに役立ちます。
    • このクエリは、次のステップで Athena のビューを作成する際に利用します。
    • 以下は、アカウント内で確認できる保存済みクエリの例です。
      CREATE OR REPLACE VIEW "AwsDataCatalog"."qs-usage-db"."qs_usage_cur_vw" AS
                SELECT
                  bill_payer_account_id,
                  line_item_usage_account_id,
                  concat(DATE_FORMAT(line_item_usage_start_date, '%Y-%m'), '-01') AS month_line_item_usage_start_date,
                  line_item_usage_type,
                  CASE
                    WHEN LOWER(line_item_usage_type) LIKE 'qs-user-enterprise%' THEN 'Users - Enterprise'
                    WHEN LOWER(line_item_usage_type) LIKE 'qs-user-standard%' THEN 'Users - Standard'
                    WHEN LOWER(line_item_usage_type) LIKE 'qs-reader%' THEN 'Reader Usage'
                    WHEN LOWER(line_item_usage_type) LIKE '%spice' THEN 'SPICE'
                    WHEN LOWER(line_item_usage_type) LIKE '%alerts%' THEN 'Alerts'
                    WHEN LOWER(line_item_usage_type) LIKE '%-q%' THEN 'QuickSight Q'
                    WHEN LOWER(line_item_usage_type) LIKE '%-report%' THEN 'Paginated Reporting'
                    WHEN LOWER(line_item_usage_type) LIKE '%-reader-pro%' THEN 'Reader PRO'
                    WHEN LOWER(line_item_usage_type) LIKE '%-author-pro%' THEN 'Author PRO'
                    WHEN LOWER(line_item_usage_type) LIKE '%-reader-enterprise%' THEN 'Reader Usage'
                    ELSE line_item_usage_type
                  END AS qs_usage_type,
                  line_item_line_item_description,
                  line_item_line_item_type,
                  product_group,
                  pricing_unit,
                  line_item_resource_id,
                  product_usagetype,
                  line_item_unblended_rate,
                  line_item_blended_rate,
                  line_item_operation,
                  SUM(CAST(line_item_usage_amount AS DOUBLE)) AS sum_line_item_usage_amount,
                  SUM(CAST(line_item_unblended_cost AS DECIMAL(16, 8))) AS sum_line_item_unblended_cost,
                  SUM(CAST(line_item_blended_cost AS DECIMAL(16, 8))) AS line_item_blended_cost
                FROM "billing"."cur"   --  This is replaced by ${CURSourceTable} with your CUR database.table name provided as Input to a parameter
                WHERE
                  (CAST(year AS INTEGER) >=2024 )
                  AND product_product_name = 'Amazon QuickSight'
                  AND line_item_line_item_type IN ('DiscountedUsage', 'Usage')
                GROUP BY
                  bill_payer_account_id,
                  line_item_usage_account_id,
                  DATE_FORMAT(line_item_usage_start_date, '%Y-%m'),
                  4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
                ORDER BY
                  month_line_item_usage_start_date ASC,
                  sum_line_item_unblended_cost DESC
      ORDER BY month_line_item_usage_start_date ASC, sum_line_item_unblended_cost DESC
      SQL
    1. 以下、「Launch Stack」をクリックし、画面の指示に従ってこれらのリソースを作成してください。
    2. このスタックをデプロイするには、AWS CUR のデータベース名とテーブル名を、データベース名.テーブル名 の形式で指定する必要があります(※アカウント内で表示されている名称に従って入力してください。)
    3. スタックのデプロイが正常に完了すると、qs-usage-db という名前のデータベースが作成されます。
      このデータベースには、QuickSight アカウント内のすべてのユーザー情報を含む qs_users_info テーブルが作成されており、ユーザーの一覧とそのロールを確認できるようになります。

スタックによって Athena の保存済みクエリが作成されたら、次にビューを作成します。

  • Athena コンソールに移動し、ナビゲーションペインから 「Query editor(クエリエディタを起動)」 を選択します。
  • 「Saved queries(保存したクエリ)」タブを開き、qs_usage_cur_vw_query という名前のクエリを選択してください。
  • クエリエディタで「Run(実行)」をクリックして、ビューを作成します。
  • クエリの実行が完了すると、qs_usage_cur_vw という名前のビューが Athena に作成されます。このビューには、QuickSight ダッシュボードでの分析に必要な AWS CUR データがすべて含まれており、詳細な利用状況の把握に役立ちます。
  • Athena へのアクセスを有効にし、QuickSight に対して S3 バケット qs-usage-{AWS::AccountId}-{AWS::Region} へのアクセス権限を付与するため、以下の手順を実施します。
    • QuickSight コンソールにアクセスし、画面右上に表示されているユーザー名をクリックします。
    • ドロップダウンメニューから 「Manage QuickSight (QuickSight を管理)」 を選択します。
    • 左側のナビゲーションペインから 「Security & Permissions(セキュリティとアクセス許可)」 をクリックします。
    • 「管理」をクリックし、Amazon Athena のチェックボックスを有効にします。
    • 同様に「Amazon S3」をクリックし、CURが格納されているバケットにチェックを入れます。

ステップ3: QuickSight データセットとダッシュボードをデプロイする

3つ目の CloudFormation スタックでは、QuickSight に以下 3つのデータセットを作成します。

  • qs_usage_cur_vw:Athena のビューに対応するデータセット
  • qs_users_info:Athena のテーブルに対応するデータセット
  • qs-usage-custom-inactive:Athena のテーブルとビューを参照して、QuickSight アカウント内の非アクティブなユーザーを特定するためのデータセット
    このデータセットの作成には、以下のようなサンプルクエリが使用されています。

    SELECT
        u.userarn,u.username,u.useremail,u.userrole,u.useridentitytype,u.usernamespace,CAST(COALESCE(a.last_login, DATE '2020-01-01') AS DATE) as last_login
    FROM "AwsDataCatalog"."qs-usage-db"."qs_users_info" u
    LEFT JOIN (
        SELECT
            line_item_resource_id,
            MAX(date_parse(month_line_item_usage_start_date, '%Y-%m-%d')) as last_login
        FROM "AwsDataCatalog"."qs-usage-db"."qs_usage_cur_vw"
        WHERE (
            product_group = 'Reader Usage'
            OR product_group = 'Reader Subscription'
        )
        AND LOWER(line_item_resource_id) NOT LIKE '%anonymous%'
        GROUP BY line_item_resource_id
    ) a ON u.userarn = a.line_item_resource_id
    WHERE u.userrole = 'READER'
    SQL

そして、3つのデータセットをもとに、テンプレートが 「QuickSight Usage Analytics Dashboard」 を自動的に作成し、リーダーアカウントのアクティビティなどを可視化します。このダッシュボードを活用することで、QuickSight アカウント内で非アクティブな リーダーアカウントを特定し、ライセンスの最適化などに役立てることができます。

以下、「Launch Stack」をクリックして、QuickSight のデータセットとダッシュボードをデプロイしてください。

その際、QuickSight 管理者ユーザーの ARNを以下の形式で指定する必要があります。
arn:aws:quicksight:us-east-1:12345678910:user/default/admin/xyz

※上記の例にある AWS アカウントID(12345678910)、リージョン(us-east-1)、および ユーザー名(admin/xyz) はダミー(プレースホルダー)です。ご自身の環境に合わせた実際の値に置き換えて入力してください。

3つのスタックのデプロイがすべて正常に完了すると、SPICE データセットの更新スケジュールをお好みの頻度で設定できるようになります。また、作成されたダッシュボードを、組織内の適切なメンバーと共有することも可能です。これにより、常に最新の利用状況を基にした分析や意思決定が行えるようになります。

このダッシュボードには 5つのシートがあり、シームレスに画面を行き来できる構成になっています。各シートをクリックするだけで、簡単に別のビューへ移動できます。

  • 以下の図に示されているダッシュボードビューでは、QuickSight アカウント全体の主要な KPI(重要業績評価指標) や利用状況の概要を把握できます。
  • 以下の図に示されているダッシュボードビューでは、リーダーセッションの利用状況(キャパシティ使用量)に関する詳細や、すべてのリンク済みアカウントのリソース情報を確認することができます。
  • 以下の図に示されているダッシュボードビューでは、アラート、レポート機能、SPICE、PROユーザーなどの各種機能の利用状況を、より詳細に確認できます。さらに、すべてのリンク済みアカウントにおける該当リソースの情報もあわせて表示されます。
  • 以下の図に示されているダッシュボードビューでは、QuickSight アカウント内に存在するすべてのユーザー一覧が表示されます。
  • 以下の図に示されているダッシュボードビューでは、すべてのリンク済みアカウントにおける、アクティブな登録済みリーダーユーザーの情報が表示されます。この情報をもとに、非アクティブなリーダーアカウントの一覧が自動的に抽出され、必要に応じてどのユーザーを削除すべきか判断する際の参考として活用できます。

クリーンアップ

このソリューションで作成されたすべてのリソースを削除する手順について

1. ダッシュボードスタックの削除

QuickSight の各種リソースをデプロイした CloudFormation スタック(デフォルト名は qs-usage-dashboard-stack、またはデプロイ時に指定したカスタム名)を削除します。これにより、以下が削除されます。

  • QuickSight ダッシュボード: QuickSight Usage Analytics Dashboard
  • 3つのデータセット: qs-usage-custom-inactiveqs-usage-cur-vwqs-users-info
  • QuickSight のテーマ: qs-usage-theme
  • QuickSight の Athena データソース接続: qs-usage

2. Athena オブジェクトのスタックの削除

Athena リソースを作成した CloudFormation スタック(デフォルト名は qs-usage-athena-stack またはカスタム名)を削除します。これにより、以下のリソースが削除されます。

  • 保存済みクエリ: qs_usage_cur_vw_query
  • テーブル: qs_users_info
  • ビュー: qs_usage_cur_vw
  • Athena データベース: qs-usage-db

3. AWS Glue ジョブと S3 バケットのスタックの削除

まず、S3 バケット qs-usage-{AWS::AccountId}-{AWS::Region} の中身が空であることを確認してください。その後、Glue ジョブなどの基盤インフラを作成した CloudFormation スタック(デフォルト名は qs-usage-glue-stack またはカスタム名)を削除します。これにより、以下が削除されます。

  • Glue ジョブ qs-usage-users-info
  • Glue トリガー QuickSightUsersExtractDailyTrigger
  • IAM ロール qs-usage-glue-role-{AWS::AccountId}-{AWS::Region}
  • S3 バケット qs-usage-{AWS::AccountId}-{AWS::Region}

※このクリーンアップ作業は、既存の AWS CUR の設定や QuickSight サブスクリプションには影響しません。

まとめ

本投稿では、Amazon QuickSight の利用状況を可視化し、特にリーダーアカウントに関するコスト最適化方法をご紹介しました。

コストと使用状況レポート (CUR) のデータを活用し、データ収集のプロセスを自動化することで、以下が可能になります。

  • リーダーの利用状況を把握し、活用されていないアカウントを特定
  • SPICE、アラート、Amazon Q、ピクセルパーフェクトレポートなど、QuickSight 機能ごとの使用傾向を分析

提供されている CloudFormation テンプレートを使えば、容易に本ソリューションを環境にデプロイでき、QuickSight の利用状況を 一元的に可視化 できるようになります。BI の導入規模が拡大する中で、こうした自動化された使用状況分析ツールは、コスト効率を保つためにますます重要な存在となってきています。

ご質問やご意見があれば、ぜひコメントをお寄せください。
また、さらに情報交換や質問をしたい場合は、QuickSight コミュニティ もぜひご活用ください。

本ブログは プロフェッショナルサービス本部の 西澤 が翻訳しました。