nato243 weblog.n-jitter brand iconweblog.n-jitter
Web

GA4 x AWS AppFlow でサイト別のアクティブユーザーをS3やAthenaに読み込む

2024.11.30
AWS
GA4 x AWS AppFlow でサイト別のアクティブユーザーをS3やAthenaに読み込む アイキャッチ

お仕事でamazon quicksight 利用してるので、ga4のデータをAthenaに定期的に連れてくる必要があります。

今回はその設定の過程の一部を、特にまとめることなく試行順にスクラップしていきます。

テーマは、Webサイトごとの日別のアクティブユーザー数です。


1. GA4とAWS間の連携

いきなりですが、Google API側の設定はできてるものとします(笑)
公式記事なりクラスメソッドさんなりの記事なりに書いてあるので、最初の設定だけはどこかのタイミングでやっておきましょう。

2. AppFlow側設定

まずはAppFlowでフロー作成します。

対象のGA4プロパティを連携します。

適当な解析用のS3Bucketにimportする設定をします。

今回はあとでAthenaでデータをクエリできるようにしたいので、ついでにGlueでカタログテーブルの設定もやってもらいます。膨大なデータになる見込みもないので、JSONにしておきます。

まずは動作確認したいので、定期実行でなくオンデマンドにしておきます。


GA4のフィールドを連携設定します。
ディメンションはDateとhostName
メトリクスとしてはtotalUsers
を選択します。

Date,hostNameごとに1日分が1行になる想定ですね。

いざフローを実行すると、totalUsersの使用でエラーでした。

active1DayUsersってのがあったのでそっちにしてみます。

フローを実行すると、今度こそS3にファイルが配置されました。

このファイルには、こんなかんじのJSON Linesが配置されてました。

{"date":"20241025","hostName":"mysite.com","active1DayUsers":"1025"}
{"date":"20241026","hostName":"mysite.com","active1DayUsers":"870"}
{"date":"20241113","hostName":"your.mysite.com","active1DayUsers":"790"}
{"date":"20241030","hostName":"your.mysite.com","active1DayUsers":"176"}

ほしいデータ連携自体はうまくいってそうなので、定期的な増分更新の設定をします。
設定をしたらフローのアクティブ化も忘れずに

3. Glueクローラ実行

本来ここまでで勝手にGlueがカタログ作ってくれているはずですが、ごちゃごちゃいじってるとその設定が消えてることもあるため、その場合は自分でGlueのクローラーを使ってTableを作りましょう。
Glueクローラー自体も定期実行しておきましょう。

Glueカタログ/Athenaのテーブル名はここでは my_ga4_metrics.ga4_unique_userとしておきました。

4. Athena / Quicksightでの重複差分の排除

数日後、どうしても同じ日 x 同じサイトデータのデータを複数回受信してしまう現象を確認しました。

これが1hごとのPVなどのデータなら多少重複してもまあ許せてしまうのですが、activeUserなどすでにサマライズされたメトリクスとなると雑に合算するのも少し気が引けます。

僕はBIツールに Amazon QuickSightを利用しているので、そちら側でAthenaに重複排除のクエリを書き、SPICEに格納しておくこととしました。

SELECT 
    date, 
    hostname, 
    MAX(CAST(active1dayusers AS INT)) AS active_1day_users
FROM 
    my_ga4_metrics.ga4_unique_user
GROUP BY 
    date, 
    hostname
ORDER BY 
    date, 
    hostname

ここまででアクティブユーザー数のAWSの連携が完成しました。Glue周りがまだ不透明なことが多いので修行が要りますね...