はじめまして、データエンジニアリングチームの @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 ユーザであればいつでも会話中にボットとの対話を通してグラフを呼び出したり、様々な指標を把握することができるようになります。
例えば、こちらの動画で紹介されているように、会議中に気になった KPI を Looker を開かずにボットへの呼びかけから確認できるようになります。シンプルなコマンドにしておけばダッシュボードの URL を覚える必要もありません。
Lookerbot はおそらくまだ国内での導入事例も、ましてや日本語の記事もありませんので、今回はその導入方法とカスタムコマンドなどの機能について紹介していきたいと思います!
導入方法
Lookerbot のリポジトリはこちらになります。今回はこのリポジトリをフォークして利用しました。
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 TokenLOOKER_URL
: 利用している Looker インスタンスの URLLOOKER_API_BASE_URL
: 利用している Looker インスタンスの API エンドポイントLOOKER_API_3_CLIENT_ID
: Looker ユーザのクライアント ID(後述)LOOKER_API_3_CLIENT_SECRET
: Looker ユーザのクライアントシークレット(後述)
3. ボット用 Looker ユーザを作成
上述の LOOKER_API_3_CLIENT_ID
と LOOKER_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 の最大の魅力は欲しいデータをインタラクティブに取得できることですが、そのためにはカスタムコマンドと呼ばれるコマンドを登録する必要があります。
カスタムコマンドの概念を示したのが下の図になります。
README 自体には詳しい説明がなくこれが少しわかりづらい(文中に貼ってある Discourse の方に説明がある)ので注意が必要です。
1. カスタムコマンド登録用のスペースを作成する
Looker には スペース(Space)
という概念があり、ダッシュボードや Look をそこに紐づけてアクセス管理を行うことができます。
カスタムコマンドを使用するには、まず一つカスタムコマンド登録用のスペース(図中のスペースX
)を用意しなければいけません。今回は Lookerbot Custom Commands
という名前のスペースを作成しました。
スペースを作成した後、当該スペースの ID を LOOKER_CUSTOM_COMMAND_SPACE_ID
に設定する必要があるのですがスペースの ID は URL 中に <Looker URL>/spaces/XXX
のような形式(数値)で表出しているのでそこから確認できます。
2. スペースにダッシュボードを登録する
続いて、作成したスペースにダッシュボードを登録します。このダッシュボード名がそのまま Slack コマンド名になります。
例えば、下の図中では ltv
という名前のダッシュボードが例示されていますが、これで /looker ltv
という Slack コマンドを呼び出せるようになります。
このため、コマンドとして覚えやすいダッシュボード名にするのがポイントです。また、ダッシュボードの Description は /looker help
などとした時にコマンドの説明として表示されますのできちんと書いておいた方が良いでしょう。
例えば、上述のダッシュボードを登録した状態で help を見ると下記のように表示されます。
3. ダッシュボードに一つだけ Look を追加する
コマンドを打った時に呼び出す Look をダッシュボードに登録します。
このとき制約があり、今のところ単一の Look しか登録することができません。同一のダッシュボード中に複数の Look が登録されていると、どの Look を返せば良いかわからないためです。
一方で一コマンドにつき一ダッシュボードを登録するのは手間なので、今後 Lookerbot 側で何か対応がされるかもしれません。
4. ダッシュボード上でグローバルフィルタを設定する
最後に、ダッシュボードにグローバルフィルタを設定するとコマンドの引数としてフィルタを指定することができるようになります。グローバルフィルタも一種類しか設定できないようです。
フィルタは /looker <Dashboard名> <フィルタ>
という形で指定することができます。
例えば、下記のように grade
という項目でフィルタを設定した場合、
/looker ltv
と呼び出すと全学年対象のデータが返ってきます。
ここで /looker ltv 高校3年生
などとすれば grade == "高校3年生"
で絞り込まれた結果が返ってきますし、あるいは複数の値を渡すことも可能で、例えば /looker ltv 高校3年生,高校2年生
などとしてカンマ区切りで複数文字列を渡せば grade == "高校3年生" OR grade == "高校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 を貼ると勝手に展開してくれるのは便利です。
まとめ
今回は Looker の活用事例として LookerBot をご紹介しましたがいかがでしたでしょうか? 今後も導入後、データの民主化がどう進んだかについてお伝えできればと思います!
Quipper のエンジニアリングチームでは BigQuery や Looker などを活用したデータ分析基盤を開発しています。 グローバルな環境で Quipper のミッションである Distributers of Wisdom をデータの観点から支えたいデータエンジニアを募集しております! 興味がある方はこちらからご応募ください!お待ちしております。
Icon made by Kiranshastry from www.flaticon.com