EmbulkでGoogle AnalyticsのレポートをTreasure Dataへ送る

## 概要
Google Analyticsで計測しているページビューを自動で毎日Treasure Dataへ送信したいので調べたことをメモしておく。

## ファイル構成

```:ファイル一覧
├ diffs
│  │ # 最後に登録したレコード情報を保持する(自動作成されます)
│  └ daily_ga_pageview.yml
│
├ credencials
│  │ # GoogleAPI認証情報 (Google Service Account)
│  └ google-service-account.json
│
│ # 環境変数の定義スクリプト
├ secrets.sh
│
│ # レポート取得 & TDへの送信処理
└ daily_google_analytics_pageviews_to_td.yml.liquid
```

## 環境変数
下記シェルスクリプトを作って環境変数を自動定義する。

```bash:./secrets.sh
#!/bin/bash

# 環境設定(production, testing, development, local)
export EMBULK_ENV='local'

# 出力DBのプレフィックス (local: replace with environment)
export DB_PREFIX='local_'

# GoogleAPI認証情報
export GOOGLE_API_JSON=`cat ./credencials/google-service-account.json`

# TreasureData API Key
# ※ https://console.treasuredata.com/app/users/current
export EMBULK_TREASURE_DATA_API_KEY='1000/******************************'
```

## クレデンシャル情報
Google Analyticsへアクセスするため、GCPでサービスアカウントを発行して権限を付与する。
※ 設定方法は省略します

- [Google Cloud Platform のサービスアカウントキーを作成する](https://www.magellanic-clouds.com/blocks/guide/create-gcp-service-account-key/)

```json:./credencials/google-service-account.json
{
  "type": "service_account",
  "project_id": "hoge-00",
  "private_key_id": "*********************************",
  "private_key": "-----BEGIN PRIVATE KEY-----**************-----END PRIVATE KEY-----\n",
  "client_email": "fuga@hoge-00.iam.gserviceaccount.com",
  "client_id": "************************",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/fuga%hoge-00.iam.gserviceaccount.com"
}
```

## 処理
下記２種類のコマンドを作成します。

- 通常実行コマンド（差分追加）
- 期間を指定して強制的に登録するコマンド

```yml:./daily_google_analytics_pageviews_to_td.yml.liquid
#
# ページビューをGoogleAnalyticsから取得し、TreasureDataへ送信する
#
# ex) 通常コマンド （昨日のレポートを登録する - 差分追加）
# $ source ./secrets.sh; embulk run ./daily_google_analytics_pageviews_to_td.yml.liquid -c diffs/daily_ga_pageview.yml
#
# [オプション]
# ・ 開始日: START_DATE=YYYY-MM-DD
# ・ 終了日: END_DATE=YYYY-MM-DD
#
# ex) 指定期間のデータを強制的に登録する
# $ source ./secrets.sh; START_DATE=2018-05-20 END_DATE=2018-05-30 embulk run ./daily_google_analytics_pageviews_to_td.yml.liquid
# ※ 注意: -c オプションは付けない
#
{% if env.EMBULK_ENV == 'production' %}
    {% assign view_id = '100000000' %}
{% else %}
    {% assign view_id = '100000001' %}
{% endif %}
in:
    type: google_analytics'
    auth_method: 'service_account'
    json_key_content: {{ env.GOOGLE_API_JSON }}
    view_id: {{ view_id }}
    time_series: 'ga:date'
    start_date: {{ env.START_DATE | default: 'yesterday' }}
    end_date: {{ env.END_DATE | default: 'yesterday' }}
    incremental: true
    metrics:
      - "ga:pageviews"
out:
    type: td
    apikey: {{ env.EMBULK_TREASURE_DATA_API_KEY }}
    endpoint: api.treasuredata.com
    database: '{{ env.DB_PREFIX }}hoge'
    table: 'daily_google_analytics_pageviews'
    mode: append
    default_timezone: 'Asia/Tokyo'
    default_timestamp_format: '%Y-%m-%d'
```

## 実行
下記コマンドで実行してみる。

```bash:ターミナル
$ source ./secrets.sh; embulk run ./daily_google_analytics_pageviews_to_td.yml.liquid -c diffs/daily_ga_pageview.yml
```
※ 昨日(2018-05-20)のページビューが登録される。


再実行 (差分追加なので登録されない)

```bash:ターミナル
$ source ./secrets.sh; embulk run ./daily_google_analytics_pageviews_to_td.yml.liquid -c diffs/daily_ga_pageview.yml
```
※ ./diffs/daily_ga_pageview.yml に最後に登録されたデータの情報があるので、昨日(2018-05-20)のデータはスキップされて登録されません。

期間指定をして、強制的に登録してみる。

```bash:ターミナル
$ source ./secrets.sh; START_DATE=2018-05-01 END_DATE=2018-05-19 embulk run ./daily_google_analytics_pageviews_to_td.yml.liquid
```
※ 2018-05-01〜2018-05-19が登録される。
※ -c オプションは付けない （付けると登録されないので注意！！）

## 参考サイト
* [treasure-data/embulk-input-google_analytics](https://github.com/treasure-data/embulk-input-google_analytics)
* [Embulkの設定ファイルをincludeで共有化する方法](https://qiita.com/hiroysato/items/e7987e71a8112584b748)
* [Liquid / date](https://shopify.github.io/liquid/filters/date/)
* [Getting Yesterdays or Tomorrows Day With Bash Shell Date Command](https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html)