エムオーテックス株式会社が運営するテックブログです。

Amazon Athenaを利用して利用状況を可視化するシステムを作ってみた

Amazon Athenaを利用して利用状況を可視化するシステムを作ってみた

はじめに

こんにちは、アプリケーションチームの辻です。

前回の記事では、ユーザーの利用状況データを収集する部分で活用した「DynamoDB の S3 へのエクスポート」と「S3 のレプリケーション」についてお話をしました。
今回は、収集した利用状況データをどのように可視化しているのかに焦点を当ててお話したいと思います。

前回の記事はこちらをご参照ください。
tech.motex.co.jp

利用状況データの可視化システム - 全体像

前回の記事でも「分析用データの収集基盤 - 概要」にAWS構成図を記載しておりましたが、改めて、こちらでも記載しておきます。
本記事では、以下の構成図の赤枠で囲まれた部分についてお話していきます。

利用状況データの可視化システム - 全体構成図 -

利用状況データの可視化の仕組み

上述の構成図に記載の通り、利用状況データの可視化には Amazon S3(以下、S3), AWS Glue Crawlers(以下、Crawlers), AWS Glue Data Catalog(以下、Data Catalog), Amazon Athena(以下、Athena)を用いて実装しています。

大まかな流れとしては、

  1. 別の AWS アカウントの S3 に利用状況データをレプリケーション
  2. Crawlers を用いて Data Catalog のテーブルを自動作成・データ反映
  3. Athenaを用いて利用状況データを検索

となります。
それでは、各フェーズごとにもう少し詳細を説明していきます。

1. 別の AWS アカウントの S3 に利用状況データをレプリケーション

まず、S3 のレプリケーションを用いて、分析用の AWS アカウント上にある S3 バケットに利用状況データをレプリケーションします。
これにより、本番用の AWS アカウント上での処理が不要となり、AWS サービスのクォータに抵触するリスクやオペミスによるお客様への影響を防ぐことができます。

レプリケーション先の S3 バケットは以下の構成になっています。

S3 バケット内の構成

なぜこの構成にしたのかを説明していきます。

DynamoDB テーブル単位で S3 フォルダーを作成した理由

結論から述べると、DynamoDB テーブル単位で Data Catalog のテーブルを作成したかったからです。
「ん?どういうこと?」と思われるかもしれませんので、背景から説明していきます。

まず、弊社では、「LANSCOPE EM クラウド版の1機能 = Amazon DynamoDB テーブル1個」ではなく、データの内容や性質によって、Amazon DynamoDB(以下、DynamoDB)テーブルを複数使用して管理することが多々あります。
そのため、分析チームからは、「1つのDynamoDB テーブルのデータを見たい」という要望だけでなく、「複数の DynamoDB テーブルのデータを結合して見たい」という要望も上がってきます。
そこで、DynamoDB テーブル単位で Data Catalog のテーブルを作成し、Athenaのクエリを使用してデータ結合を行うことで、どちらの要望も満たせると考えました。

とはいえ、本システムでは今後、分析対象の DynamoDB テーブルが増えることが予想され、その度に手動で Data Catalog テーブルを作成するのは大変です。
そこで、何か方法がないか調べたところ、「Glue Crawlers を使用することで、S3 のフォルダー単位で Data Catalog テーブルを自動作成することができる」ことが分かりました。
これは素晴らしい!ということで即採用しました。
やり方は次の章で説明しますが、まずは DynamoDB テーブル単位で S3 フォルダーを作成しておく必要があるため、この構成にしました。

S3 にdate=YYYY-MM-DDというフォルダーを作成した理由

これはご存じの方も多いかと思いますが、Data Catalog の各テーブルにPartition keyを付与することで、データをパーティション化し、Amazon Athena のパフォーマンスを向上させるためです。
これにより、最新のデータや過去の特定日のデータ、推移データなどを出す際に全データを検索対象にしなくて済みます。

2. Crawlers を用いて Data Catalog のテーブルを自動作成・データ反映

次に、Athena で利用状況データを検索できるようにするために、Crawlers を使用して S3 のデータを Data Catalog に反映します。
ここで「Glue Crawlers を使用することで、S3 のフォルダー単位で Data Catalog テーブルを自動作成する」方法をお伝えします。
なんと・・・

Glue Crawlers の Data sources に「テーブルにしたいフォルダーの1階層上」のPrefixを設定するだけ!!

めっちゃ簡単ですね!
上述の「S3 バケット内の構成」を例に取ると、s3://<S3 バケット>/resources/になります。
Crawlers 画面上だと、以下のような感じになります。

Crawlers 画面

あとは、Crawlers を実行するだけでtest_databaseという Data Catalog データベース内に、dynamodb_table_1dynamodb_table_2という Data Catalog テーブルが自動作成されます。
ちなみに、test_databaseという Data Catalog データベースは事前に手動作成しています。

3. Athenaを用いて利用状況データを検索

最後に、Athena を用いて利用状況データを検索します。
以下の Athena クエリのように、複数の Data Catalog テーブル(=複数の DynamoDB テーブル)を結合して実行することもできます。

WITH
    table_1 AS (
        SELECT dynamodb_table_1.*
        FROM "test_database"."dynamodb_table_1" dynamodb_table_1
        WHERE dynamodb_table_1.date = '2024-01-01'
    ),
    table_2 AS (
        SELECT dynamodb_table_2.*
        FROM "test_database"."dynamodb_table_2" dynamodb_table_2
        WHERE dynamodb_table_2.date = '2024-01-01'
    ),
    table_3 AS (
        SELECT
            dynamodb_table_3.id AS id,
            COUNT(*) AS count
        FROM "test_database"."dynamodb_table_3" dynamodb_table_3
        WHERE dynamodb_table_3.date = '2024-01-01'
        GROUP BY dynamodb_table_3.id
    )
SELECT 
    table_1.id as "ID",
    table_2.license as "ライセンス数",
    table_3.count as "デバイス台数"
FROM table_1
LEFT JOIN table_2
ON table_1.id = table_2.id
LEFT JOIN table_3
ON table_1.id = table_3.id;

Athena 結果画面

また、Athena では、ワークグループという、作業場をグルーピングする機能が備わっています。
ワークグループを使うことで、アクセスできる Data Catalog のデータベース・テーブルを制御したり、データスキャン量を把握・制限することが可能になります。
他にも、Athena のエンジンバージョンをワークグループ単位で制御することが可能で、意図しないバージョンアップを防ぐことができます。
Athena のエンジンバージョンが変わると、クエリの構文に影響を与える可能性があるため、私たちはワークグループを使用することにしました。

おわりに

今回は Athena を使用して利用状況データを検索する仕組みについてお話しました。
他にも、Athena と QuickSight を使用することで、データをグラフなどにビジュアライズすることもできます。
今後は、取得対象の DynamoDB を増やしていくとともに、データビジュアライゼーションの仕組みも検討していこうと思います。

ここまでお読みいただき、誠にありがとうございました。
本記事がお役に立てれば幸いです。