AppFlow を使って、Google Analytics 4 から S3 にデータを連携してみた

# はじめに

Amazon AppFlow では、2022 の re:Invent で [22 個の新しいコネクタ](https://aws.amazon.com/jp/blogs/aws/announcing-additional-data-connectors-for-amazon-appflow/)が発表されました。この新しい 22 個のコネクタの中には、Google Analytics 4 も含まれています。Google Analytics 4 に蓄積されているデータを、データ分析に活かしていきたいと思われている方もいるのではないでしょか。

Amazon AppFlow を使って Google Analytics 4 のデータを、Amazon S3 といった他のデータストアに連携することが出来ます。今回は、Google Analytics 4 のデータを、Amazon S3 に定期的に csv で出力する方法を紹介します。



# Google Cloud : API の有効化

Google Analytics 4 からデータを取得する API の有効化がまずは必要です。Google Cloud の画面を開きます。

https://console.cloud.google.com/welcome



この記事では、検証用に 新たな Project を作成します。

![image-20221231144729669.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/926f9a27-9409-2fee-044b-1c15d5fe4b2d.png)



適当に名前を付けて Project を作成します。

![image-20221231144808738.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/bb2d5e1b-64b0-bf69-baad-0479d0c234d8.png)



作成した Project を選択します。

![image-20221231145101797.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/1000782c-2b1a-1064-960d-8ba606b94089.png)



Google Analytics の API を有効化するため、有効な API とサービス を選びます。

![image-20221231145137990.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/09a60591-322a-2b74-ef26-476adeb027f0.png)



API とサービスの有効化を選択します。

![image-20221231145232380.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5161d126-445a-c826-15fb-89a5116393a8.png)



検索ボックスで `google analytics` と入れて検索します。

![image-20221231145338499.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/98b1a035-d4d7-6b47-074f-5c70c1f75964.png)





以下の 3 つを有効化します。

![image-20221231145421647.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b38e3aef-6431-8c21-7ab3-577810691f76.png)



各 3 つの API で、それぞれ有効にしていきます。

![image-20221231145445001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2770b9d3-1f5e-c045-013f-78b758bbc079.png)



# Google Cloud : OAuth 同意

次に、Google Cloud の OAuth 同意画面で、Google Cloud 側で利用できる API スコープなどを定義していきます。

User Type で外部を選択して、作成を押します。

![image-20221231145929746.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7563c266-8e5f-1920-5cfa-eda9e90fb9bf.png)



適当に名前とメールアドレスを入れます。

![image-20221231150118172.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/19bd8e7f-b56b-1a16-4c44-a5767e20e411.png)



ドメインの追加を押します。

![image-20221231150146561.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/db817009-dd20-8e0e-882e-94c492a92290.png)



`amazon.com` を入れて、次に進みます。

![image-20221231150241345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/13d7106c-405a-5abe-104b-5edecb1398df.png)



スコープを追加または削除を押します。

![image-20221231150345268.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/bcd89d53-02b7-5ca8-e8a0-81aabc74079e.png)



Google Analytics API の readonly なスコープを指定します。

![image-20221231150514010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/99724bd3-e907-8544-9056-f6412cd96b1b.png)



次へを押します。

![image-20221231150612172.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d23de543-e82d-3d1a-548a-67822f7c632d.png)



テストユーザーの Add Users を押します。

![image-20221231151718470.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e45a1af3-7363-9aba-f989-ebc1eb3277fe.png)



適当に追加します。

![image-20221231151755319.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/36e24ba6-6ed2-5a9c-6386-1115ffab4684.png)



次へを押します。

![image-20221231150715864.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c4e9b411-9c5c-dc7a-861a-79a2300b7cbb.png)



これで、OAuth 同意ができました。



# Google Cloud : OAuth 2.0 client ID を生成

AppFlow から Google Analytics の API を呼びだすために、認証情報の作成を押します。

![image-20221231150936562.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f6581335-af20-ca32-b9ed-c3292b3cd1d2.png)



適当に名前を指定します。

![image-20221231151017169.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f53771c3-ea36-985b-9d0a-87696fda1041.png)



次の 2 つの URL を入力します

`https://console.aws.amazon.com`

`https://ap-northeast-1.console.aws.amazon.com/appflow/oauth`

![image-20221231151116001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/795b77d9-2f9b-32a3-b66b-f5cb3c263a3f.png)



これで画面にクライアント ID とクライアントシークレットが表示されます。これは後で使うので、メモっておきます。

![image-20221231151301249.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8481988c-e287-36a0-b3be-dbb2860a71be.png)



# AppFlow 作成

メインテーマの部分です。AWS のマネージメントコンソールで、Create Flow を押します。

![image-20221231143412291.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/77d231fb-c708-b89e-9f53-534f6917f489.png)



適当に Flow の名前を入力します。

![image-20221231143447020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/62148c90-f2fe-4a01-9346-06962f4f06d8.png)



Next を押します。

![image-20221231143503775.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f2d4266f-855e-795a-b76a-3e44b9cd7090.png)



Source で Google Analytics 4 を選択します。

![image-20221231143543191.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/a2d86408-1e3f-6a54-1a81-0cffeb5baafe.png)



Connect を押します。

![image-20221231143606378.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2fd3e9df-542d-a1f0-efd8-729b7b9686e3.png)



Google Cloud 側で生成した Client ID や Client Secret を入力して、Connect を押します。

![image-20221231151852853.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f635ac4b-73ab-30ef-b2e1-461f34b164b3.png)



選択

![image-20221231151624613.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f773bdf8-0fcd-fa2c-5229-57c231da5073.png)



テスト用なので、このまま続行を押します。

![image-20221231151951999.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c3e93fc7-dc9a-0db6-149e-3a70425c3904.png)



続行を押します。

![image-20221231152022331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/116ef3d5-d639-8b08-5bf6-874f6514b12c.png)



Connection が作成されました。

![image-20221231152113949.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0ba17e6f-14c4-f883-2bd1-3457c3dbed07.png)



Google Analytics では、2 つの Object からデータを取得する対象を選びます。使い方的に、Core Report の方が一般的な選択肢だと思います。

- Real-Time Report : Google Analytics で直近 30 分のデータのみが保存されている。それ以前のデータは消える
- Core Report : スタンダードな Google Analytics のデータを取得。リアルタイムなデータは含まれない

![image-20221231154503494.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/749526f2-13c1-2cd8-b112-993a1b92fb14.png)



今回は、Core Report の方を選択します。

![image-20221231155339814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6cf680d9-5ddb-383f-7c05-447774432859.png)



出力先の S3 バケットやファイル形式を指定します。

- ファイル形式は、JSON, CSV, Parquet から指定可能

![image-20221231155453480.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/1d5d845f-4aa1-9d88-18d5-257ce8cdb948.png)



Flow の実行タイミングを、以下の 2 種類から選択が出来ます。

- Run on demand : 一回の実行
- Run flow on schedule : 定期実行

![image-20221231155734809.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/7279adff-7205-a899-e2c1-9b52ad2dc6ba.png)



定期実行を選んだときに、カスタマイズ可能な項目を整理します。

- Repeats : 毎週、毎日、毎月から選択できる。**一番短い期間は 1 日。1 時間ごとに実行といったことは出来ない。**
  - リアルタイムにデータを取得したい場合は、aws-samples で公開されているカスタムコネクタの利用が検討できる
  - https://github.com/aws-samples/appflow-custom-connector-for-google-analytics4-realtimereport
- Transfer mode : Full transfer (全データを毎回転送する) もしくは、Incremental transfer (差分データの転送) を選択可能

![image-20221231160140286.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/52f932a0-9bec-126b-f9f7-4896ce9023cd.png)



Incremental transfer (差分転送) を選択したときに、どのように差分か判断するかというと、`start_end_date` という項目を使って判断される (らしい)。このタイムスタンプフィールドを基に判断するとのこと。選択肢は `start_end_date` しかない。

![image-20221231160615622.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/69b0171b-ef13-d044-30b8-7b34f21aabde.png)



以下のように、1 日 1 回の定期実行、かつ、差分転送を選択してみます。

![image-20221231160749024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d4e7cec9-2dfa-ba1f-ce97-6521b05f9eb4.png)



どんなデータを取得対象にするか選択できます。**Map all fields directly の選択肢がありますが、2022年12 月現在選択するとエラーになります。Service Quota に引っかかりエラーになります。**

![image-20221231162849433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/9c3ee42e-6f58-b870-e066-ff6124b4eb00.png)



Service Quota について、次の Document で記載されています。

- https://docs.aws.amazon.com/general/latest/gr/appflow.html
![image-20221231164916467.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6aa125fa-a540-1d8f-5c95-097a265957d1.png)



上記の Document に書かれている通り、dimensions や metrics についての同時取得可能な上限が記載されています。1 個の flow run あたり、9 個の dimensions、10 個の metrics が上限です。Map all fields directly を選択するとエラーになります。(複数の flow を定義することで、上限を超えた取得は出来そう・・・？未確認)



ということで、Quota に収まるように、Metric と Dimension を選びます。

![image-20221231170549295.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b9765023-e65c-22a6-e898-3d5b446221df.png)



S3 に格納するときに、パーティショニングを意識した格納パスを指定可能です。Daily の指定ででやってみます。

![image-20221231163002476.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/6093818b-7c99-38a8-894d-d8290553bb09.png)



フィルター設定もありますが、何も設定を入れずに Next を押します。

![image-20221231163046917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/fc5e370f-d041-bc19-37bd-ca60a4379422.png)



Create flow を押して、flow を作成します。

![image-20221231163131778.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/539c935d-984d-ee29-130e-4eec3b8918b9.png)



Activate Flow

![image-20221231163148033.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f79edc8f-2f8d-2433-35bd-cf581ab5cde5.png)



Status が Active になりました。Last run は空白です。

![image-20221231163340827.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5c3b0658-b835-8913-8556-a15248fc4a95.png)



# 実行内容確認

スケジュールが来た後に確認すると、Last run に日付が表示されています。

![image-20221231174055589.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c5182413-f2b4-f87e-d4b0-366c64cf07da.png)



Run history の画面を開くと、正常に実行が出来ていることがわかります。

![image-20221231174119949.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/2f8af367-22fa-650e-25e0-06152fba327c.png)



実際に、S3 Bucket にファイルが生成されています。

![image-20221231171303107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/cb311658-f5c3-bf50-6cf2-86f51af4901a.png)



このファイルの中身は、指定したとおり csv ファイルになっています。

- 直近 30 日のデータを取得されている。
- これより古いデータを取得したい場合は、`firstExecutionFrom` を指定する方法がありそう？(未確認) 
  - https://docs.aws.amazon.com/appflow/1.0/APIReference/API_ScheduledTriggerProperties.html

```
"totalUsers","newUsers","itemViewEvents","activeUsers","date"
"221","129","0","177","20221221"
"183","85","0","139","20221215"
"182","81","0","132","20221222"
"174","55","0","126","20221206"
"174","67","0","124","20221216"
"172","58","0","114","20221214"
"167","69","0","127","20221209"
"162","39","0","95","20221205"
"162","64","0","115","20221220"
"160","52","0","111","20221208"
"156","53","0","103","20221223"
"153","39","0","92","20221213"
"152","47","0","106","20221207"
"151","43","0","105","20221202"
"149","44","0","92","20221219"
"139","39","0","98","20221212"
"139","62","0","102","20221227"
"137","68","0","100","20221228"
"136","61","0","100","20221226"
"133","35","0","85","20221201"
"80","43","0","63","20221229"
"61","22","0","39","20221211"
"58","32","0","47","20221225"
"57","18","0","36","20221218"
"52","23","0","33","20221204"
"51","13","0","35","20221217"
"51","26","0","37","20221224"
"49","22","0","40","20221230"
"48","21","0","33","20221203"
"31","9","0","17","20221210"
"8","3","0","6","20221231"
```





# 付録1 : GA4 から取得可能な項目について

GA4 では、Real-Time Report と、Core Report の 2 つの Object からデータ転送が可能です。それぞれの項目について調査してみます。

![image-20221231161149363.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5506b421-4aad-a575-0c28-8519fec964f6.png)



## Core Report を選んだときの取得可能な項目

Core Report は、Google Analytics 4 上のデータを取得する、スタンダード？な選択肢です。Real-Time Report は直近のデータを取得可能なメリットがある反面、直近 30 分を超えたデータは取得できません。Core Report は、それを超えた範囲でデータが含まれています。

AppFlow では、1日1回のスケジュール実行しかできないので、基本的には Core Report の方を利用するのではないかと思います。

Core Report を選んだときに取得可能な項目は、マネージメントコンソールで確認ができます。

![image-20221231162638192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d01002a1-fa56-0799-2e8f-89548c6d9a86.png)

　

この一覧は、次の Google Cloud の Document に公開されている、API Dimensions & Metrics の 項目と一致しています。項目の意味を調べたいときには、次の Document の Description を見るといいでしょう。

https://developers.google.com/analytics/devguides/reporting/data/v1/api-schema?hl=en

![image-20221231162736544.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/81fcc549-9669-77d3-8dcb-3ba310bae7a5.png)

## Real-Time Report を選んだときの取得可能な項目

Real-Time Report は、Google Analytics 4 上で、直近 30 分のリアルタイムデータを取得できるものです (時間を延ばす方法はあるみたいですが)。

Reat-Time Report を選んだときに取得可能な項目は、マネージメントコンソールで確認ができます。

![image-20221231161040334.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f43a3819-acf7-60f0-7d6b-9b10f56481de.png)

　

この一覧は、次の Google Cloud の Document に公開されている、Realtime Dimensions & Metrics の 項目と一致しています。項目の意味を調べたいときには、次の Document の Description を見るといいでしょう。

https://developers.google.com/analytics/devguides/reporting/data/v1/realtime-api-schema?hl=en

![image-20221231161540532.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c39277fd-c796-5a45-4c5a-b5b6b3d6e6bc.png)



# 付録2 : エラー発生

AppFlow を実行したときに、次のエラーが発生しました。

>  The request failed because the service Source Google Analytics 4 returned the following error: Details: Google Analytics 4 returned error message - Request failed with Status Code: 400, Error Reason: Bad Request, ErrorCode: ClientError.

![image-20221231165013904.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b2609fb5-1958-5158-4ad5-4044938f3257.png)



AppFlow で取得する項目を、Service Quota の範囲より少なくすると、正常に実行できました。

![image-20221231165434412.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5f73988f-10f6-2004-d551-39df3bef7b57.png)





# 付録3 : AppFlow で出来るデータ加工

Modify values という項目があります。

![image-20221231165501394.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/d69918dd-64c7-e3e5-39e4-65f5f1fbaf19.png)



どんなデータ加工が出来るか見てみると、Mask と Truncate の 2 種類です。データ加工は AppFlow の外側で、Lambda や Glue などで検討するのが良さそうです。

![image-20221231165536983.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/e100ed5a-6a2c-cce8-2575-488d1292a753.png)



# 検証を通じてわかったこと

- AppFlow を使って Google Analytics からデータを取得するとき、スケジュールベースで定期的にデータを取得できる。このスケジュールの最短期間が、1日1回 が上限になっている。
  - 以下の Document に書かれている
  - https://docs.aws.amazon.com/general/latest/gr/appflow.html
![image-20221231142643594.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/08c9cab8-514a-02fb-2b07-f52abab80845.png)
- ニアリアルタイムにデータを取得したい場合は、aws-samples で公開されているカスタムコネクタの利用が検討できる
  - https://github.com/aws-samples/appflow-custom-connector-for-google-analytics4-realtimereport
- サポートされている取得可能なデータ項目
  - https://docs.aws.amazon.com/ja_jp/appflow/latest/userguide/connectors-google-analytics-4.html
![image-20221231143133200.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/060ae83c-3f90-b8a9-c653-5298a22331ba.png)
- 取得可能な項目数の制限
  - 表現を変えると、Google Analyics 上の全データを一度に取得することは出来ない。エラーになる。
  - https://docs.aws.amazon.com/general/latest/gr/appflow.html
![image-20221231164916467.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/09e2ed14-0405-0f82-9cde-b4695c97bcdb.png)
- AppFlow で Schedule Base で取得するとき、デフォルトでは、過去 30 日のデータまで取得できる (Google Analytics 4 コネクタの場合)
  - それ以上古いデータを取得したい場合、マネージメントコンソールでは指定できない。
![image-20230102211437612.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/1ee5710a-c0ba-f561-6096-795ddabed1fd.png)
  - AWS CLI や SDK, CDK 経由で `firstExecutionFrom` を指定することで、30日以前のデータ取得出来そうな気がする (未確認)
    - https://docs.aws.amazon.com/appflow/1.0/APIReference/API_ScheduledTriggerProperties.html
- Real-Time Report は、現在時点から直近 30 分までの期間のイベントと使用状況を取得できるものらしい。
  - https://developers.google.com/analytics/devguides/reporting/data/v1?hl=en
- S3 に出力するときのファイル形式は、JSON, CSV, Parquet から指定可能
- AppFlow がエラーになったときに、エラーログを出してくれない
  - エラーになったときに詳細なデバッグが難しく、少し大変だった
- 差分取得のための機能はあるが、スケジュール実行のときだけ利用できる
  - 手動実行は差分取得はしてくれずに、全部のデータを取得する





# 参考 URL

https://dev.classmethod.jp/articles/amazon-appflow-released-google-analytics-4-connector/

https://qiita.com/myu_mx/items/9f288f9b4b86ebcd5ecf

https://docs.aws.amazon.com/ja_jp/appflow/latest/userguide/connectors-google-analytics-4.html