カテゴリー
自宅Slackサーバーの作り方②〜Bolt-jsをソケットモード(WebSocket)で試す
※ 当ページには【広告/PR】を含む場合があります。
2022/02/05

このブログでも
デフォルトではソケットモード機能はオフになっていますので、今回は前回のブログの内容の補講的な内容として、ソケットモードからSlackサーバーを構築する手順にも触れてみようと思います。
ソケットモード用のSlackボットの準備
この記事の執筆時で、ソケットモード機能が2021年1月から正式にリリースされてちょうど1年たった頃合いですので、まだまだ認知度の低い機能かと思います。
Slackアプリの通常モードを用いる場合、自宅のローカル機で構築しオンプレで運用をさせることを考慮したSlackサーバーを構築する際には、
通常モードでは、外部のTCPトンネリングサービスを利用するのがもっとも早い方法なのですが、ソケットモード登場以前ではSlackとは別のサービスに登録する必要があって、それが手間と場合によっては費用のかかるのが問題になっていました。
とはいえ、ここ数年でWebSocketやWebRTCなどのTCP/UDPベースの通信プロトコルの整備や対応するブラウザ・通信速度の飛躍的な向上も相まって、NAT越えの手段の選択肢も大幅に増えてきています。
こうした風潮にSlackも例外ではなく対応する必要もあり、外部サービスに依存しないSlackの提供するサービスドメイン内で完結させるため、
以下の図はSlackサーバーを自宅や職場のローカル機で起動させることを考えたときの構成を模式的に示したものです。

前回説明した通常モードでは、ngrokに代表されるような外部のTCPトンネリングサービスからSlackサーバー機を監視してもらい、オンラインのSlackはエンドポイントとしてngrok側のアドレスを踏むことで通信が確立するような構成になっています。 これはSlackサーバーに限らず、自宅にSSHサーバーなどを立てるときにも使える汎用な方法です。
対してソケットモードでは、Slackのローカルとリモートを先にWebSocketコネクションを確立させておくことで、サードパーティのサービスを利用すること無しにSlackクライアントとの通信が容易に可能となります。
Slackアプリを使っている開発者からすると、ngrokのようなサービスを既にガッツリ使われていたり、SaaS上で常時動作させていたりするので、今更無理にソケットモードへ移行するような必要もないでしょう。
他方、これからSlack Boltフレームワークを勉強してみたい開発者の方たちにとっては、NAT越えという忌まわしき呪縛から解放され、かなりお手軽にSlackアプリ開発ができるようになった恩恵がかなりあるものと思います。
企業や組織で働いている方でも、従来のSlackアプリをちょっとしたチーム業務で使いたいツールを使うのにも、会社の情報管理部門にお伺いを立てて、IPを割り当てもらったり、ポートを開けてもらったり、稟議書を提出してみたり...と非常に面倒な手続きもあったかも知れません。
ソケットモードならば、ようはブラウザとSlackの一機能を使っている訳ですので、こういう社内申請は無用です。
Slackボットを作成する
前置きはさておき、まずはSlackボットを一つ作成します。
とはいえ、こちらの手順は
ただし、通常モードではSlackアプリの認証キー(Credentials)として、
つまり、通常モード・ソケットモードともボットトークンは共通して利用しますが、ソケットモードで使う場合において、サイン認証キーは必要ありません。
そこでこのSlackボットが作成できたなら、次の項目で
アプリレベルトークンを取得する
それでは
ちなみにソケットモードで利用するSlackボットはソケットモード専用のアプリになり、そのアカウントで横断的に利用できるようになります。 一つのボットで通常モードとソケットモードの兼用は出来ませんのでご注意ください。
左側のペインから
[Socket Mode]
[Enable Socket Mode]

これで、
Event Subscriptions
ソケットモードへと移行した初回は、

ここではアプリレベルトークンのタイトルを適当に
MySocketMode
アプリレベルトークンに付与するアクションスコープは基本的に
connections:write
またアプリレベルトークンは
[Basic Information]
[App-Level Tokens]

説明書きの通りで、アプリレベルトークンは最大10個まで登録できます。
つまり、組織ごとにアプリレベルトークンを一つで使い分けることで、同じSlackアプリを最大10の組織で利用管理できることになります。
ソケットモードでは11以上の組織をアプリレベルトークンで管理することが難しいので、そうなってくると通常モードで個別にドメイン管理する必要はあります。
何はともあれ、これでアプリレベルトークンが発行されました。
発行されたアプリレベルトークンを見ると、Tokenの項目に、
xapp-...

ついでに左のペインから
[Event Subscriptions]

ソケットモードが有効になって、リクエストURLは必要ないよ、という文言が確認できます。
Slackアプリの実装(Typecript対応)
TypesciptプロジェクトでのSlackアプリの始め方は前回のほうで詳しく解説しましたので、ここでは手順の異なる点だけを説明していきます。
Credentials(アプリレベルトークンとボットトークン)を変数に設定
ここでも環境変数に埋め込んで、自分だけが使えるようにしておきます。
$ export SLACK_BOT_TOKEN="ボットトークン(xoxbから始まるもの)"
$ export SLACK_APP_TOKEN="アプリレベルトークン(xappから始まるもの)"
これでシェルから参照することができれば準備完了です。
$ echo $SLACK_APP_TOKEN
<アプリレベルトークン...>
$ echo $SLACK_BOT_TOKEN
<ボットトークン...>
Typescriptコードの修正
ソケットモードへ移行する場合、アプリのインスタンスのコンストラクタ引数だけが違うだけです。
import { App } from '@slack/bolt';
const app = new App({
token: process.env.SLACK_BOT_TOKEN,
appToken: process.env.SLACK_APP_TOKEN,
socketMode: true,
});
//...以下略
と、通常モードからソケットモードへの移行はとても簡単です。
ソケットモードの動作確認
ということで、最後に通常モードからソケットモードに移行したソースコードで、Slackサーバーを起動してみます。
$ yarn build && yarn start
node dist/index.js
⚡️ Bolt app is running!
で、見た目や挙動は通常モードの時と全く変わりません。
hello

のように、レスポンスURLの経由なしに、Slackサービスだけで完結したアプリに仕上がりました。
まとめ
今回は、前回説明した
ソケットモードが通常モードよりも優れているとか、そういう話ではありませんので、ご自分の置かれたシチュエーションに合った開発環境で使い分けて頂くと良いでしょう。
ソケットモードがもっと流行っていけば、開発者にとって、Slackアプリでの業務ツール製作がより身近になっていくのではないかと思います。
参考サイト
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー