投稿者:中根 洋平

このBlogを書いている時点でNext'19 Tokyo開催中です。
弊社はBigQueryとLookerで実現するDXというテーマでブースを出展してます。
ご来場の際は是非お立ち寄りいただければと思います。

と、いうわけで今回はそのLookerを便利に使うためにLookerのSlackBotについて書いて行きたます。

目次

  1. Looker Botとは
  2. Looker BotをコンテナとしてCloud Runでゆる〜く試してみる
  3. Looker Botのfindロジックについて
  4. Looker Botの注意点
  5. まとめ

LookerBotとは

Githubで公開されているLooker用のSlack Botです。

機能についてはリンク先の動画を見ていただければと思います。

この動画の中で色々なコマンドを実行していますが、デプロイした段階ではLookを検索するfindコマンドのみとなります。

このfindコマンドですが一癖あったので後ほど後ほどご紹介します。

Looker Botをコンテナ化しCloud Runでゆる〜く試してみる

公開されているリポジトリですがDockerfileがあるのでサクッとコンテナ化してCloud Run環境で動かしてみましょう。  

注意
Slack BotのSlashコマンドは3秒でタイムアウトする仕様があります。
Cloud RunもSpin Upはそこそこ早いのですがBotが待機状態になるまで3秒以上かかる為実際の環境で利用する場合はSlackでも紹介しているように事前にStatus 200を返すような一工夫が必要となります。

今回はそういった対応を行わずゆる〜く試してみようの精神でいってみたいと思います。

Slack API Keyの取得

Slack API: Applications | Slackにアプリを作成しましょう。
Lookerbotで必要になるのは以下のAPI Keyです。

  • SLACK_API_KEY
    • OAuth & PermissionsのページのBot User OAuth Access Token
  • SLACK_SLASH_COMMAND_TOKEN
    • Slash CommandsのページよりCreate New Commandにてコマンドを作成します。
    • Request URLはCloud Runにデプロイするまでわからないのですが一旦仮のURLで作成することも可能です。

Looker Client IDおよびSecretの取得

Botが使用するユーザからIDおよびSecretを生成します。
基本的にBot専用のユーザを用意することが推奨されています。

該当ユーザの編集ページよりAPI3 KeysからIDとSecretを生成します。

コンテナの作成

以下のコマンドで作成します。
RepositryにはGCPなのでContainer Registryをぜひ利用してみてください。

git clone https://github.com/looker/lookerbot.git
cd lookerbot
docker build -t REPOSITORY[:TAG] ./
docker push REPOSITORY[:TAG]

Cloud Runへのデプロイ

今回環境変数として以下の値を指定します。

  • LOOKER_URL
    • LookerのURLになります。
  • LOOKER_API_BASE_URL
    • デフォルトであれば上記URLに:19999/api/3.0を付与したものになります。
  • LOOKER_API_3_CLIENT_ID
  • LOOKER_API_3_CLIENT_SECRET
    • Looker Client IDおよびSecretの取得
  • SLACK_API_KEY
  • SLACK_SLASH_COMMAND_TOKEN
    • Slack API Keyの取得で取得したAPI KeyとToken
  • LOOKER_SLACKBOT_EXPAND_URLS
    • これはSlackにLookのURLを貼った時に画像として投稿する機能を有効にするためにtrueを設定します。
  • GOOGLE_CLOUD_BUCKET
    • 上記の画像を保存するバケット名になります。
    • gs://は不要でバケット名だけでOKです。
    • Cloud RunのサービスアカウントにGCSへの書き込み権限があることを忘れずに確認しましょう。

それでは上記を踏まえCloud Runへデプロイします。
コマンドはベータなので今後変わる可能性がありますのでご注意ください。

gcloud beta run deploy lookerbot --image=REPOSITORY[:TAG]\
    --timeout=10\
    --memory=512Mi\
    --platform=managed\
    --region=asia-northeast1\
    --set-env-vars="LOOKER_URL"="VALUE","LOOKER_API_BASE_URL"="VALUE","LOOKER_API_3_CLIENT_ID"="VALUE","LOOKER_API_3_CLIENT_SECRET"="VALUE","SLACK_API_KEY"="VALUE","SLACK_SLASH_COMMAND_TOKEN"="VALUE","LOOKER_SLACKBOT_EXPAND_URLS"="true","GOOGLE_CLOUD_BUCKET"="VALUE"

デプロイは1分もかからず完了するかと思います。
デプロイ後URLが表示されるのでアクセスし**Lookerbot is go!**と表示されていればOKです。

またURLがわかったのでSlashコマンドの設定に戻りURLを設定しましょう。
この際設定するURLは<URL>/slack/recieveという形式になります。

この状態でLookerbotにメンションを飛ばしてみましょう。

looker-help.gif

反応しましたね。

それではLookのURLを貼ってみましょう。

looker-url.gif

うまく表示してくれています。

次にfindコマンドでLookを検索してみましょう。

looker-find.gif

候補がいくつか出てきましたね。

Looker Botのfindロジックについて

Findコマンドですがコードを見るとあいまい検索用のパッケージとしてfuzzysearch-jsを使用しています。
検索結果より類似度上位5件を表示します。
ですので本来調べたい検索ワード以外から遠い単語もマッチすることがあります。
検索用のパッケージをFuse.JSに変えることでチューニングをできるようにしたりしました。
Githubにコードがあるので拙いですが参考になればと思います。

Looker Botの注意点

複数のリプライが返ってくる

これはLooker BotというよりCloud Runで実行する場合の注意点になりますがSlackでコマンドやメンションを飛ばした際に複数のリプライが返ってくることがあります。
これはCloud Runの起動が間に合わず複数回リトライが走っているためです。
ですので先ほども述べましたが、一旦ステータス200を返却する仕組みや、GKEなどで使用することでこの問題を回避できます。

findコマンド実行時にCannot read property 'name' of nullというエラーが出る

弊社検証中に非常に悩まされた問題です。

Findコマンドでは内部的にGet All LooksというAPIを実行しています。
実はこのAPIはゴミ箱内のLookも検索しています。

もしLookを削除した後に、Lookが存在していたSpaceを消した場合このようなエラーが起きるようです。
Issueは発行したので修正したいです。

まとめ

Looker Botを使用することで普段のSlackでのコミュニケーションにLookを出せたりと非常に便利になるかと思います。
ただし機能としてはまだまだ痒いところに手が届かない印象もあるかと思います。

Lookerはどんどん機能が新しくなってきていますが、Botの方はそこまで早くはないようですがこれからの進化に期待ですね。

参考

GitHub - looker/lookerbot
Looker API 3.0 Reference
Slash Commands | Slack