💬

専門用語を教えてくれるSlack Botを作った

3 min read

こんにちはしかじろうです。
新しい会社や部署に転属すると知らない用語が沢山でてきますよね。
業界用語だけでなくその部署だけで使われる言い回しがあったりして、その用語に慣れるだけで一苦労だったりします。用語集をwikiにまとめたりもしますが、テレビ会議などをしながら探すのはなかなか骨が折れる作業で、探してる間に次の話題に進んでいったりしてしまいます。

そこで、知らない用語を教えてくれるSlackBotを作ってみました。予め用語を登録しておくことで、slackから簡単に呼び出すことができます。

https://github.com/shikajiro/term-slack-bot

以下の手順でソースコードの実装なしで利用できるので、ご自由にご利用ください。

使うもの

  • Slack
  • 用語をまとめるSpreadSheet
  • SlabkBotを実行するGAE(Google App Engine)Flex

下準備

SpreadSheetに用語をまとめる

まずはデータとなる情報をSpreadSheetにまとめます。SpreadSheetを選んだのは誰でも追加編集削除が簡単なためです。A列に用語、B列にその説明を記載していきます。会社内で権限をオープンにしてどんどん用語を集めるのがいいでしょう。

SpreadSheetのKeyを取得する

SpreadSheetのURLに含まれるKeyをメモしておきます。画像はモザイクを掛けていますが、今回の例だと 10g~Y-c の部分がKeyになります。

SlackAPIの作成

SlackにBotを追加します。ワークスペースで利用するボットの作成 | Slackなどを参考に作ってください。

tokenが作成できたらメモしておきます

GCPプロジェクトの準備

GAEを実行するためのGCPプロジェクトを準備します。作り方などは公式ドキュメントがあるので割愛します。

サービスアカウントの作成

SlackBotがSpreadSheetの情報を取得するのにサービスアカウントが必要なので作ります。権限はとりあえず 閲覧者 にしています。
この時のサービスアカウントのメールアドレスをメモしておき、クレデンシャルファイルをjsonでダウンロードしておきます。

SpreadSheetの共有権限を付与する

先程のサービスアカウントでSpreadSheetを読み取りできるように設定します。共有設定でサービスアカウントのメールアドレスを入力し、閲覧者権限を付与します。

ここまでの設定で、SpreadSheetのデータをSlackBotが読み取れるようになりました。

サービスアカウントの保存

SlackBotがSpreadSheetにアクセスするためにサービスアカウントのクレデンシャルが必要です。秘密鍵が含まれるためgitで保存したくありません。SecretManagerを使ってサービスアカウントのクレデンシャルを保持しておき、CloudBuildを実行する際に取り込むようにしたいと思います。
先程作成したサービスアカウントのクレデンシャルをダウンロードして、シークレットの値として保存します。ここで作ったシークレットの名前を後ほど利用します。

CloudBuildの設定

ビルドとデプロイを行うCloudBuildのトリガーを作ります。

イベント

手動呼び出しにします。

構成

クラウドビルド構成ファイルを選択し、以下のファイルを指定します。
infra/cloudbuild.yaml

代入変数

大事な環境変数は代入変数で指定できるようにしています。ここに今までメモしてきた値を入力します。

変数名
_API_TOKEN SlackのAPIトークン
_SPREADSHEET_KEY SpreadSheetのKey
_CREDENTIALS SecretManagerに保存したクレデンシャルの名前
_LOGGER_CHANNEL_ID オプション:用語検索のログを出力するslack channnel IDを指定する

デプロイ

先程作ったCloudBuildを使ってビルドとデプロイを行います。実行ボタンを押してビルド・デプロイを行います。

これで用語を説明してくれるbotの完成です。アプリケーションを作るより用語集をみんなで育てて行く方が大変なので、みんなでがんばりましょう。

番外編

GASは権限で詰まる

当初GASのwebアプリケーションで作ろうとしました。GCPプロジェクトを作る必要がなくシンプルなのです。しかし、SpreadSheetが会社アカウントの場合SlackからGASにアクセスする際に認証を通す必要があり、Slackの仕組み上解決することができませんでした。SpreadSheetを完全に公開してもいい場合はGASだけで実装できます。