この記事は富士通クラウドテクノロジーズ 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設定を行います。
大きな変更点として、以下が個人的に注目ポイントだと思います。
- OAuth & Permissionsで細かな権限制御が可能になったこと
- App Manifestによるbotの設定をyaml or jsonで定義可能になっており、差分管理や移植、APIによる設定変更が可能になった
- Socket ModeによりSlack botで公開エンドポイントが必要であったモーダルなどの双方向通信の機能が、WebSocketで公開エンドポイント不要で利用可能になった
これまでのbotsからの移行方法については以下のドキュメントにまとまっているので参照して下さい。
はまりポイント
Socket Modeのメニューが表示されない
bot設定を行う中で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とすれば回避可能でした。(こちらも地味に結構はまった..)
Boltを使ったbot開発
botの設定が終わればメインのbot開発に進みます。
これまでpython-rtmbot でpythonを使って開発していたので、bolt-pythonを使って開発します。
基本的にはREADMEとBolt 入門ガイドを見れば分かりますが、bot tokenとApp-Level tokenがあれば実行出来ます。
bot tokenはInstalled App Settings、App-Level tokenはBasic Informationから設定、確認出来ます。
Socket Modeの場合には以下の通り、SocketModeHandler
を使います。
モーダルを使ってみる
Socket Modeで双方向の通信が出来るため、モーダルを使ってみます。
Block Kit Builderが便利
モーダルはblocksというjsonで定義されたUIで構成されます。このUIをPC向け、スマホ向けなど確認しつつ、パーツを構成しながら設計出来るのがBlock Kit Builderです。
https://api.slack.com/tools/block-kit-builder
このツールを使う事で視覚的にUIが作れるので便利でした。
モーダルを開くショートカット
モーダルを開くにはHome tabやショートカットなど色々ありますが、今回はショートカットを使いたいと思います。
ショートカットは2種類あり、グローバルショートカットとメッセージショートカットがあります。
- グローバルショートカット
- slackの投稿欄の⚡から開くことが出来る。チャンネル、DMどこからでも開けるため、どこから送信されたのか message_action のpayloadにチャンネル情報が含まれない仕様
- チャンネル情報を付与するには別途inputでチャンネル情報を含める必要がある
- メッセージショートカット
- メッセージに対して右上
More actions
から開くことができる。message_actionにはどのメッセージに対してメッセージショートカットを実行したのかメッセージ情報が含まれたpayloadとなるため、チャンネル情報の特定が可能
- メッセージに対して右上
と、上記の様にユーザの操作やチャンネル情報の有無などに違いがあります。
今回はメッセージショートカットを使ってbotの機能エンハンス要望を受け付け、該当チャンネルに投稿する機能を作ってみます。
メッセージショートカット作成後は一度Ctrl + Shift + Rでslackのリロードを行いましょう。
モーダルに入力し、slackチャンネルに投稿してみる
実際にモーダルに入力した内容をslack チャンネルに投稿するsampleをGithubで公開しました。
実際に実行してみるとこのように動きます。
ポイント
- 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 さんがお料理か何かを投稿されるそうです。 お楽しみに!
それではまた来年~!