FJCT Tech blog

富士通クラウドテクノロジーズ公式エンジニアブログです

富士通クラウドテクノロジーズ

FJCT/Tech blog

Slack botをRTMからBolt(WebSocket)に書き直しました


f:id:h45unum4:20211202153145p:plain

こんにちは!富士通クラウドテクノロジーズの蓮沼です。

この記事は富士通クラウドテクノロジーズ Advent Calendar 2021の3日目の記事です。

2日目は @herietさんの GitLab Triageでプロジェクトの棚卸しを自動化する でした。 GitLab Triage便利そうですね。年末の時期ですしGitlab issueの大掃除...🤣

という事で今日はSlack botをRTMからBolt(WebSocket)に書き直した話を書きたいと思います。

そもそもサムネイル Boltに書き直した経緯

FJCTの社内コミュニケーションツールとしてSlackを導入しており、botを活用した運用オペレーション、売上データの分析など、ChatOpsとして様々な業務でbotを活用しています。
私もSlack botを2016年ぐらいから開発して使っており、当時RTMで実装していました。
Botの名前はその名もHaaS(Hasunuma as a Service)
私の代わりに24/365で仕事をしてくれます🤣
しかし最近では新しくSlack botを作成するとRTMは利用出来なく、より細かな権限管理が可能なEvents APIや、モーダルなど双方向の通信で役立つSocket ModeをサポートしているフレームワークBoltを使ったほうがモダンであるため、書き直してみました。

実際のところは

意図的にRTMから書き換える気は業務に追われていて特になく、これまで入社してから開発環境としてずっと使っていた検証環境のVMが、なんとストレージ故障によりデータロストになってしまい、泣く泣く細切れに社内Gitlabにpushしていたコード断片を集めてbotを再作成する事になったからでした

という事で旧来のRTM botからの移行で必要な手順と、併せてSocket Modeで気軽に利用出来るモーダルの使い方などを紹介したいと思います。

まずは権限の再設定を

これまでのbot設定では以下app directoryのbotsから設定を行っていましたが、 https://app.slack.com/apps-manage/

現在では以下urlからbot設定を行います。

https://api.slack.com/apps

大きな変更点として、以下が個人的に注目ポイントだと思います。

  • OAuth & Permissionsで細かな権限制御が可能になったこと
    • 例えばbot側でchannels:join 権限は制限し、他のチャンネルへのjoinはbotからは禁止し、ユーザからの操作に限定する
    • 3rdパーティ製のbotが権限制限により導入しやすくなった
  • App Manifestによるbotの設定をyaml or jsonで定義可能になっており、差分管理や移植、APIによる設定変更が可能になった
  • Socket ModeによりSlack botで公開エンドポイントが必要であったモーダルなどの双方向通信の機能が、WebSocketで公開エンドポイント不要で利用可能になった

これまでのbotsからの移行方法については以下のドキュメントにまとまっているので参照して下さい。

api.slack.com

はまりポイント

Socket Modeのメニューが表示されない

bot設定を行う中でSocket Modeのメニューが表示されなくしばらく悩んでいました。

f:id:h45unum4:20211203102838p:plain
Socket Modeが表示されない...

これはclassic botからの移行で OAuth & Permissions メニューのScopeでbotの権限設定があった事が原因でした。bot権限は広範囲な権限を含んでいるため、bot権限を削除し細かに権限設定を行えばSocket Modeのメニューが表示されました。権限は chat:write, commands(今回紹介するショートカット機能を利用する場合) などを付与すれば十分だと思います。

Squid Proxy経由でSocket Modeで通信が行えない

botを動かしている環境がSquidのProxy配下の場合、Squidの仕様でWebSocketの通信が通りません。 ただ以下の記事の通り、Squidへの通信をHTTPSとすれば回避可能でした。(こちらも地味に結構はまった..)

qiita.com

Boltを使ったbot開発

botの設定が終わればメインのbot開発に進みます。
これまでpython-rtmbotpythonを使って開発していたので、bolt-pythonを使って開発します。

github.com

基本的にはREADMEとBolt 入門ガイドを見れば分かりますが、bot tokenとApp-Level tokenがあれば実行出来ます。
bot tokenはInstalled App Settings、App-Level tokenはBasic Informationから設定、確認出来ます。 Socket Modeの場合には以下の通り、SocketModeHandler を使います。

slack.dev

モーダルを使ってみる

Socket Modeで双方向の通信が出来るため、モーダルを使ってみます。

f:id:h45unum4:20211203120412p:plain
モーダルのサンプル
このように入力値や画像など入力フォームが利用出来るのでワークフローなどの受付などで利用出来そうです。

Block Kit Builderが便利

モーダルはblocksというjsonで定義されたUIで構成されます。このUIをPC向け、スマホ向けなど確認しつつ、パーツを構成しながら設計出来るのがBlock Kit Builderです。

https://api.slack.com/tools/block-kit-builder

このツールを使う事で視覚的にUIが作れるので便利でした。

モーダルを開くショートカット

モーダルを開くにはHome tabやショートカットなど色々ありますが、今回はショートカットを使いたいと思います。
ショートカットは2種類あり、グローバルショートカットとメッセージショートカットがあります。

f:id:h45unum4:20211203112222p:plain
グローバルショートカットとメッセージショートカット

  • グローバルショートカット
    • slackの投稿欄の⚡から開くことが出来る。チャンネル、DMどこからでも開けるため、どこから送信されたのか message_action のpayloadにチャンネル情報が含まれない仕様
    • チャンネル情報を付与するには別途inputでチャンネル情報を含める必要がある
  • メッセージショートカット
    • メッセージに対して右上More actionsから開くことができる。message_actionにはどのメッセージに対してメッセージショートカットを実行したのかメッセージ情報が含まれたpayloadとなるため、チャンネル情報の特定が可能

と、上記の様にユーザの操作やチャンネル情報の有無などに違いがあります。 今回はメッセージショートカットを使ってbotの機能エンハンス要望を受け付け、該当チャンネルに投稿する機能を作ってみます。

f:id:h45unum4:20211203114734p:plain
メッセージショートカットの作成

メッセージショートカット作成後は一度Ctrl + Shift + Rでslackのリロードを行いましょう。

モーダルに入力し、slackチャンネルに投稿してみる

実際にモーダルに入力した内容をslack チャンネルに投稿するsampleをGithubで公開しました。

github.com

実際に実行してみるとこのように動きます。

f:id:h45unum4:20211203121701p:plain
モーダルに機能リクエストを入力

f:id:h45unum4:20211203121745p:plain
メッセージショートカットを実行したチャンネルに投稿されました!

ポイント

  • Block Kit Builderでjsonを生成すると block_id という要素が含まれていないため、ランダムなdict keyが割り当てられます。view_submissionでkeyの特定が大変なので追加で block_id を追加し、それぞれのinputのidを設定したほうが良いです。
  • メッセージショートカットでは実行したチャンネルの取得が出来ますが、モーダル入力後のview_submissionではチャンネル情報は含まれません。このためモーダルが開かれたタイミングで private_metadata にチャンネル情報を付与し、view_submissionで private_metadata を参照する事でチャンネルを特定してます。

まとめ

Slack botフレームワーク Bolt を使ってRTMから書き直してみました。Socket Modeでモーダルが気軽に使えるので、より社内の業務フローを効率化出来そうです。ほかにも/commandやモーダルの画面遷移など作りこみが出来るので出来る事が増えた印象です。
これからはBoltをベースに、より社内bot HaaS をエンハンスしていきたいと思います!
実際のところ、これまで作った機能を一から車輪の再発明をこれからやっていくのですが...😂

4日目は @o108minmin さんがお料理か何かを投稿されるそうです。 お楽しみに!

それではまた来年~!