データの民主化に向けて Lookerbot を導入した話と課題と今後

はじめまして、データエンジニアリングチームの @toohsk です。 今回は、データの民主化を推進するために導入した Looker 社の Lookerbot という Slack ボットをご紹介します。

Lookerbot ってなによ

Quipper では、先の記事「エンジニアを魅了する次世代 BI ツール『Looker』を Quipper が導入した理由(わけ)」でご紹介したように、BI ツールとして Looker を導入しています。

BI を導入した後、Slack などでの会話上でグラフやモニタリングした数値を共有したいと思うシーンはよくあると思いますが、Looker ではそのような用途のために Lookerbot と呼ばれるボットを公開しています

Lookerbot が提供する主な機能は Look (Looker におけるデータを可視化するコンポーネントの最小単位)に対する、下記の二つの操作です。

  • Slack 上で find コマンドを使って Look を検索
  • Slack 上でカスタムコマンドを使って Look を取得

これらの機能を使うことで、(Looker ユーザでなくても)Slack ユーザであればいつでも会話中にボットとの対話を通してグラフを呼び出したり、様々な指標を把握することができるようになります。

www.youtube.com

例えば、こちらの動画で紹介されているように、会議中に気になった KPI を Looker を開かずにボットへの呼びかけから確認できるようになります。シンプルなコマンドにしておけばダッシュボードの URL を覚える必要もありません。

Lookerbot はおそらくまだ国内での導入事例も、ましてや日本語の記事もありませんので、今回はその導入方法とカスタムコマンドなどの機能について紹介していきたいと思います!

導入方法

Lookerbot のリポジトリこちらになります。今回はこのリポジトリをフォークして利用しました。

Lookerbot の構成を示したのがこちらの図です。

f:id:beniyama:20190207122801p:plain
Lookerbot の構成

基本的には README の手順に沿って作業を実施しますが、今回は図中の番号に対応する形でご説明します。

1. Slack のボットユーザを作成

まずはじめに、Slack 上に Lookerbot 用のボットユーザを作成します。こちらは一般的なボットユーザを追加する方法と同じです。図中では @LookerBot となっていますが任意の名前をつけることができます。

また @LookerBot のようなメンションだけでなく、 /looker のような Slash コマンドを有効にするには、Slack 上で Slash コマンドを作成する必要があります。 この時発行されたトークンを環境変数 SLACK_SLASH_COMMAND_TOKEN に設定してください。

2. Lookerbot 実行環境を準備

Node.js アプリである Lookerbot のコードを実行するためのサーバを用意します。 今回は README でも例示されている Heroku を使用しました。

まずはじめに Create a new app から新しい環境を作成し、その環境に先程フォークしたコードをデプロイします。 次に 必須(required) となっている下記の環境変数を設定します。

  • SLACK_API_KEY : Slack の Bot User OAuth Access Token
  • LOOKER_URL : 利用している Looker インスタンスの URL
  • LOOKER_API_BASE_URL : 利用している Looker インスタンスAPI エンドポイント
  • LOOKER_API_3_CLIENT_ID : Looker ユーザのクライアント ID(後述)
  • LOOKER_API_3_CLIENT_SECRET : Looker ユーザのクライアントシークレット(後述)

3. ボット用 Looker ユーザを作成

上述の LOOKER_API_3_CLIENT_IDLOOKER_API_3_CLIENT_SECRET には Looker 内のユーザの API Key を指定するのですが、README にはボット用のユーザを新規作成することが推奨されています。

We suggest creating a Looker API user specifically for Lookerbot, and using that user's API credentials.

Slack 上で Lookerbot にアクセスできる人は皆、この Looker ユーザの権限で各種ダッシュボードや Look にアクセスできてしまいますので、既存ユーザの API Key を使い回さない方が望ましいでしょう。

この Looker ユーザにはコマンドからアクセスしたいスペース(後述)へのアクセス権限を振っておきます。

4. 画像アップロードのためのストレージを準備

Slack 上でグラフ画像を表示する場合、Look のスクリーンショットを格納・配信するためにストレージサービスを利用する必要があります。今回は S3 を利用しましたので、下記の4つの環境変数を設定しました。

  • SLACKBOT_S3_BUCKET : S3 のバケット
  • SLACKBOT_S3_BUCKET_REGION : S3 バケットのリージョン
  • AWS_ACCESS_KEY_ID : S3 バケットに画像ファイルを読み書きするためのアクセスキー
  • AWS_SECRET_ACCESS_KEY : S3 バケットに画像ファイルを読み書きするためのシークレットアクセスキー

以上が大まかな流れとなります。

あとは @<Lookerbot名> help/<LookerのSlashコマンド> help などをSlackから叩いて、 API が疎通できているか確認してください。

Lookerbot が提供するコマンドは二種類

ここでは Lookerbot がサポートしているコマンドについてご紹介します。Slash コマンドで例示してありますが、Slash コマンドを登録されていない場合は @<Lookerbot名> と読み換えてください。

find コマンド

素の Lookerbot が提供する唯一のコマンドです。Looker 上に登録されている Look を検索することができます。

  • /looker find <Look名>
  • /looker find look <Look名>
  • /looker find dashboard <Look名>

のような形で呼び出せますが、構文的に受け付けるというだけで挙動としてはどれも同じです。

また Look 名の検索には FuzzySearchJS のレーベンシュタイン距離が用いられているようですが、日本語の Look 名はあまりうまく取得できませんでした。 ですので、Lookerbot で検索したい Look には英語名を使うと良いかもしれません。

カスタムコマンド

Lookerbot の最大の魅力は欲しいデータをインタラクティブに取得できることですが、そのためにはカスタムコマンドと呼ばれるコマンドを登録する必要があります。

カスタムコマンドの概念を示したのが下の図になります。

f:id:beniyama:20190207122900p:plain
カスタムコマンドの設定イメージ

README 自体には詳しい説明がなくこれが少しわかりづらい(文中に貼ってある Discourse の方に説明がある)ので注意が必要です。

1. カスタムコマンド登録用のスペースを作成する

Looker には スペース(Space) という概念があり、ダッシュボードや Look をそこに紐づけてアクセス管理を行うことができます。

カスタムコマンドを使用するには、まず一つカスタムコマンド登録用のスペース(図中のスペースX)を用意しなければいけません。今回は Lookerbot Custom Commands という名前のスペースを作成しました。

f:id:beniyama:20190205143959p:plain
Lookerbot 用に作成したスペース

スペースを作成した後、当該スペースの ID を LOOKER_CUSTOM_COMMAND_SPACE_ID に設定する必要があるのですがスペースの ID は URL 中に <Looker URL>/spaces/XXX のような形式(数値)で表出しているのでそこから確認できます。

2. スペースにダッシュボードを登録する

続いて、作成したスペースにダッシュボードを登録します。このダッシュボード名がそのまま Slack コマンド名になります。

例えば、下の図中では ltv という名前のダッシュボードが例示されていますが、これで /looker ltv という Slack コマンドを呼び出せるようになります。

f:id:beniyama:20190205142200p:plain
ltv ダッシュボード

このため、コマンドとして覚えやすいダッシュボード名にするのがポイントです。また、ダッシュボードの Description は /looker help などとした時にコマンドの説明として表示されますのできちんと書いておいた方が良いでしょう。

例えば、上述のダッシュボードを登録した状態で help を見ると下記のように表示されます。

f:id:beniyama:20190205143421p:plain
help コマンドの実行結果

3. ダッシュボードに一つだけ Look を追加する

コマンドを打った時に呼び出す Look をダッシュボードに登録します。

このとき制約があり、今のところ単一の Look しか登録することができません。同一のダッシュボード中に複数の Look が登録されていると、どの Look を返せば良いかわからないためです。

一方で一コマンドにつき一ダッシュボードを登録するのは手間なので、今後 Lookerbot 側で何か対応がされるかもしれません。

4. ダッシュボード上でグローバルフィルタを設定する

最後に、ダッシュボードにグローバルフィルタを設定するとコマンドの引数としてフィルタを指定することができるようになります。グローバルフィルタも一種類しか設定できないようです。

フィルタは /looker <Dashboard名> <フィルタ> という形で指定することができます。

例えば、下記のように grade という項目でフィルタを設定した場合、

f:id:beniyama:20190205143304p:plain
grade フィルタを設定した ltv ダッシュボード

/looker ltv と呼び出すと全学年対象のデータが返ってきます。

f:id:beniyama:20190205142814p:plain
フィルタ指定なしの呼び出し結果

ここで /looker ltv 高校3年生 などとすれば grade == "高校3年生" で絞り込まれた結果が返ってきますし、あるいは複数の値を渡すことも可能で、例えば /looker ltv 高校3年生,高校2年生 などとしてカンマ区切りで複数文字列を渡せば grade == "高校3年生" OR grade == "高校2年生" という絞り込みになります。

f:id:beniyama:20190205142933p:plain
高校3年生と高校2年生でフィルタをかけた結果

このフィルタ記法は Lookerbot 特有のものではなく、Looker 自体がサポートしています。詳しくは Looker Filter Expressions をご確認ください。

これが少しややこしく、例えばデモ動画の中では /looker customer map in city NewYork という華麗なコマンドが出てきますが、これは customer map in city というダッシュボード(ここまでがコマンド)に対して NewYork(地名) というフィルタをかけていると解釈できます。

所感

当初、Lookerbot は既存のダッシュボードや Look を対話形式で自在に呼び出せるようなイメージだったのですが、実際に導入してみるとその認識はやや違っていました。

Lookerbot の活用シーンは大きく二つありそうです。

  • Looker 上に何の指標があるかわからない人に Slack から簡易検索インタフェースを提供する(find コマンドの活用)
  • 会話中で頻出する重要 KPI をコマンド化して誰でも Slack からチェックできるようにする(カスタムコマンドの活用)

コマンドごとにダッシュボードを登録しなければいけなかったり Look やフィルタも一種類という制約がありますが、一方でボットのプログラムをいじらなくても Looker 上でのダッシュボード・Look 登録操作だけでカスタムコマンドを増やしていけるというのはユーザーフレンドリーな設計思想だなと思います。

また、会話中でのボット呼び出しが浸透してくれば、いつ誰がどのような意思決定したかというデータも Slack 上に集積されていくのでダッシュボードのブラッシュアップにもつながりそうです。

あと、地味に Looker の URL を貼ると勝手に展開してくれるのは便利です。

f:id:beniyama:20190205150519p:plain
Looker の URL に反応する

まとめ

今回は Looker の活用事例として LookerBot をご紹介しましたがいかがでしたでしょうか? 今後も導入後、データの民主化がどう進んだかについてお伝えできればと思います!

Quipper のエンジニアリングチームでは BigQuery や Looker などを活用したデータ分析基盤を開発しています。 グローバルな環境で Quipper のミッションである Distributers of Wisdom をデータの観点から支えたいデータエンジニアを募集しております! 興味がある方はこちらからご応募ください!お待ちしております。

Icon made by Kiranshastry from www.flaticon.com