Amazon AppFlowでGoogle Analytics 4のデータをAmazon S3に連携する
データアナリティクス事業本部インテグレーション部コンサルティングチーム・新納(にいの)です。
先日開催されたAWSのカンファレンスイベント、re:Invent 2022にてAmazon AppFlowで新たに22個のコネクタが追加されたことが発表されました。
このアップデートにより、Google Analytics 4(以下、GA4)のコネクタがAppFlowに仲間入りしました。さっそくGA4のデータをAmazon S3に連携してみました。
GA4→AWSへのデータ連携のこれまで
これまではGA4のデータをAWSに連携するときはGA4のデータをBigQueryに連携し、AWS Glue Connector for Google BigQueryを使ってS3へ連携させる…といった手順がありました。この方法ではGA4からエクスポートされた生データをS3へ連携できます。
事前準備
AppFlow側でコネクタを利用する前にGoogle Cloud側での事前準備が必要となります。
必要なもの
- 1つ以上のデータ ストリームを持つ Google Analyticsアカウント
- Google Cloud Platformアカウント
- Google Cloudプロジェクト
Google CloudプロジェクトでAPIを有効化する
必要となる以下APIをGoogle Cloudプロジェクトで有効化します。
- Google Analytics API
- Google Analytics Admin API
- Google Analytcis Data API
2022年12月22日現在、ドキュメント上ではGoogle Analytics APIのみ記載されていますが、このAPIのみ有効にしているとAppFlowからGA4への接続時に下記のエラーが発生しました。
Error authenticating to connector: Failed to validate Connection while attempting "ValidateCredentials with CustomConnector" with connector failure 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: 403, Error Reason: Forbidden. (Service: null; Status Code: 400; Error Code: Client; Request ID: null; Proxy: null)
OAuth同意画面の設定をする
次に、OAuth同意画面設定をします。ユーザータイプは外部を選択します。今回は公開ステータスをテストで試しているため、テストユーザーに自身のメールアドレスを追加しています。
承認済みドメインにはamazon.com
を指定して次に進みます。
「スコープを追加または削除」より、Google Analyticsのreadonly権限を追加します。
OAuthクライアントIDを作成する
認証情報メニューの「認証情報を作成」よりOAuthクライアントIDを指定します。
アプリケーションの種類は「ウェブアプリケーション」を選択し、任意の名前を入力します。
承認済みのJavaScript生成元にはhttps://console.aws.amazon.com
を設定します。
承認済みのリダイレクトURIにはhttps://ap-northeast-1.console.aws.amazon.com/appflow/oauth
を指定します。今回は東京リージョンでAppFlowを使用しているため、ap-northeast-1
を指定しています。別リージョンで使用する際は該当リージョン名に書き換えて設定する必要があります。
設定が完了するとクライアントIDとシークレットが取得できます。この2つを使ってAppFlowからGA4へ接続をします。
AppFlowでフロー作成
AWSマネジメントコンソールからAmazon AppFlowの画面へ遷移し、フローを作成します。
送信元名にはGoogle Analytics 4を指定し、接続情報を設定します。一度設定してしまえば、次回からは既存の接続より選択できます。
新規接続を選ぶと以下のように接続設定画面が表示されます。以下の通り設定します。
Access type
: offlineクライアントID
: Google Cloudプロジェクトで設定した認証情報のクライアントIDクライアントシークレット
: Google Cloudプロジェクトで設定した認証情報のクライアントシークレット接続名
: 任意の接続名称。次回以降は既存の接続から設定した接続名称を選択可能になる。
接続するとGoogleの認証画面が表示されますので許可して次に進みます。
接続が完了すると前の画面に戻ります。APIバージョンは2022年12月現在、v1betaのみ指定可能です。Google Analytics 4オブジェクトには連携したいオブジェクトを指定します。
- Real-Time Report
- Google Analytics Data APIのrunRealtimeReportメソッドのディメンション・指標が取得可能(過去30分間のデータ)
- ディメンション・指標合わせて17項目
- API Dimensions & Metrics | Google Analytics Data API | Google Developers
- Core Report
- Google Analytics Data APIのrunReportメソッドのディメンション・指標が取得可能
- ディメンション・指標合わせて270項目
- Realtime Dimensions & Metrics | Google Analytics Data API | Google Developers
送信先には今回、Amazon S3を指定しています。
オプションではGlueデータカタログテーブルを作成するかどうか指定できます。ファイル形式はJSON・CSV・Parquetから、タイムスタンプをファイル名に付与するかどうかも選べます。
次にマッピングを設定します。マッピング方法は手動・CSVアップロードが選べますが、今回は手動で設定します。
どのディメンション・指標を連携するか選択します。GA4では連携可能なディメンション・指標の組み合わせが決められているため、有効な組み合わせとなるようにマッピングします。
有効な組み合わせは以下のサイトから確認可能です。
なお、無効な組み合わせを選んでマッピングするとフローの作成自体はできますが、フロー実行時に以下のようなエラーが発生します。
Amazon AppFlow received the following error: 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.
オプションでパーティションの設定が可能です。
フィルタリングや妥当性の設定も可能ですが、今回はデフォルトのままフロー作成します。作成されたフローを実行すると、Amazon S3に連携されていることが確認できました。
データを一部加工した例として、マッピングしたディメンションと指標が以下のような形で格納されていました。(今回はJSONで出力しています)
{ "activeUsers": "hoge", "city": "" } { "activeUsers": "huga", "city": "Minato City" } { "activeUsers": "piyo", "city": "Chiyoda City" } { "activeUsers": "hoge2", "city": "Osaka" } { "activeUsers": "huga2", "city": "Yokohama" }
最後に
Amazon AppFlowを使用し、コードの記述なしでGA4のデータをAmazon S3に連携できました。
ブログの中で言及した通り、AWSへGA4のデータを連携するには他にもGA4からBigQueryにエクスポートされたデータをAWS Glue Connector for Google BigQueryを使って取得する方法があります。GA4の生データを確認したいケースではGlueコネクタを使用し、すでに確認したいディメンションと指標が決まっているケースではAppFlowを使用する、といった使い分けができそうです。Glueコネクタでは場合によってはScriptの修正が必要となるケースがありますが、AppFlowはノーコードで簡単に設定できるという強みがあります。担当者のスキルセットや利用シーンに合わせて使い分けを考えていきましょう。