🕌

ヘッドレスBIツール Cube Cloud を Google BigQuery と連携して使ってみる

2022/08/10に公開

Cube Cloud という存在を知りました。オープンソースのヘッドレスBIツールだそうです。

https://cube.dev/

まずは使ってみます。使い方にはふたとおりあるようです。

  1. Cube がホスティングするサーバーで動く Cube Cloud
  2. 自分でサーバーをたてる Cube

今回は Cube Cloud を試します。

Cube の特徴

まだ調査段階ですが、次のような優位性がありそうです。

  • Athena や BigQuery にある分析データを、Cubeのモデルに従うことにより、一貫性のある書き方で抽出できる
  • 抽出したデータはCubeの仕組みでキャッシュできる
  • 抽出したデータはAPIとしてフロントエンドやBIツールから利用できる

複数の分析データソースを利用している状況だと、サービスごとにクエリが違ったりメンテナンスが大変になる印象ですので、それを解消しようというのは理解できます。


Cube: API-First Business Intelligence

目標

わたしはこのあたりのツールに詳しくないので、Cubeが他のBIツールに対してどのくらい優位性があるかはわかりません。まずは使ってみようと思います。

本稿では BigQuery の公開データセット「新型コロナウィルス感染者情報」を使って、Cube Cloud でグラフを作るところまでを目標にします。もうほとんどこのブログをなぞるだけなのですが、せっかくなので記録を残しておきます。

https://cube.dev/blog/google-bigquery-public-datasets

Cube Cloud に登録する

こちらのページ から登録できます。GitHub か Google アカウントが使えます。

Deploymentを作成する

このような画面に移ります。クラウドプラットフォームを指定するようです。どうやらVPC内に用意してくれる機能もあるようで(Enterpriseプランぽいですが)その絡みかもしれません。

deploymentの名前はなんでもいいですが test-covid19 とかにしておきます。デプロイ先には Google Cloud を選択しました。残念ながら、日本リージョンはデプロイ先として選択できないようですね。アイオワにしました。

次に、Cube.js をどうやって作りますかという画面になります。今回はスクラッチで、かつブラウザ上で試すので、+ Create を選択しました。

データベースは、BigQueryを選択します。

Google Cloud の Project ID を入力し、さらに BigQuery へアクセスするためのキーファイルが求められます。

Google Cloud 側で Cube Cloud専用のサービスアカウントを作るのが無難だと思います。このとき、以下のロールが必要です。

  • BigQuery Data Viewer
  • BigQuery Job User

Google Cloud でこんなイメージでサービスアカウントを作り、JSONキーファイルを生成します。

キーファイルをアップロードしたら、Apply します。接続がうまくいったら、Generate Data Schemaという画面で対象のデータセットを聞かれますが、今回は公開データに対して作業を行うのでSkip & Deployします。しばらく待機です。

Schema を編集する

deployment が終わったら、Schema を編集できます。JavaScript のファイルを用意して、そこでcube()関数を実行することで、Cube.jsサーバー経由でBigQueryとやりとりできるようです。まず、画面上部Enter Development Modeを押して、編集モードへ入ります。次に、schema/配下にMeasures.jsファイルを作ります。中身はブログから引用した以下です。

schema/Measures.js
cube(`Measures`, {
  sql: `
    SELECT *
    FROM \`bigquery-public-data.covid19_govt_response.oxford_policy_tracker\`
  `,

  measures: {
    confirmed_cases: {
      sql: `confirmed_cases`,
      type: `max`
    },

    cancelPublicEvents: {
      sql: `CAST(cancel_public_events AS NUMERIC)`,
      type: `max`
    },
  },

  dimensions: {
    country: {
      sql: `country_name`,
      type: `string`
    },

    date: {
      sql: `TIMESTAMP(${Measures}.date)`,
      type: `time`
    },
  },
});

正直あまりDSLはわかっていませんが、ひとまずブログに従います。こんな感じになればOKです。画面右上のSave Allを押して保存してください。

Playground で試す

左ペインでPlaygroundを押してください。今作ったMeasures.jsが試せます。Queryを選択するような見た目の画面にいくはずですので、以下のように選択していってください。

  • Measures: Confirmed Cases
  • Time: All time by Day
  • Filters: Country equals Japan

日本国内の日毎の累計陽性者数が出るはずです。

2021年9月8日時点の累計感染者数が1,617,099で、これはNHKによる感染者数データともだいたい一致していそうです。

Cube Cloud のさわりを試した

まずは、Cube Cloud と BigQuery を連携して使ってみました。まだまだほんの一部しか試せていません。今後も調査を続けていきます。具体的には、以下のような点が気になっています。

  • APIでどんなデータが呼べるのか
  • ブラウザや他のサーバーかからAPIをコールするとき、認証はどうするのか
  • Cube Cloud ではなく Cloud Run にデプロイして使ってみたい

参考

https://cube.dev/blog/google-bigquery-public-datasets#how-to-define-a-data-schema

Discussion