Looker botをCloud Runでゆる〜く動かしてみる。
投稿者:中根
このBlogを書いている時点でNext’19 Tokyo開催中です。
弊社はBigQueryとLookerで実現するDXというテーマでブースを出展してます。
ご来場の際は是非お立ち寄りいただければと思います。
と、いうわけで今回はそのLookerを便利に使うためにLookerのSlackBotについて書いて行きたます。
目次
- Looker Botとは
- Looker BotをコンテナとしてCloud Runでゆる〜く試してみる
- Looker Botのfindロジックについて
- Looker Botの注意点
- まとめ
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
を付与したものになります。
- デフォルトであれば上記URLに
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
を設定します。
- これはSlackにLookのURLを貼った時に画像として投稿する機能を有効にするために
-
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にメンションを飛ばしてみましょう。
反応しましたね。
それではLookのURLを貼ってみましょう。
うまく表示してくれています。
次にfindコマンドでLookを検索してみましょう。
候補がいくつか出てきましたね。
Looker Botのfindロジックについて
Findコマンドですがコードを見るとあいまい検索用のパッケージとしてfuzzysearch-js
を使用しています。
検索結果より類似度上位5件を表示します。
ですので本来調べたい検索ワード以外から遠い単語もマッチすることがあります。
検索用のパッケージをFuse.JS
に変えることでチューニングをできるようにしたりしました。
Githubにコードがあるので拙いですが参考になればと思います。
Looker Botの注意点
複数のリプライが返ってくる
これはLooker BotというよりCloud Runで実行する場合の注意点になりますがSlackでコマンドやメンションを飛ばした際に複数のリプライが返ってくることがあります。
これはCloud Runの起動が間に合わず複数回リトライが走っているためです。
ですので先ほども述べましたが、一旦ステータス200を返却する仕組みや、GKEなどで使用することでこの問題を回避できます。
Cannot read property 'name' of null
というエラーが出る
findコマンド実行時に弊社検証中に非常に悩まされた問題です。
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