Slackboard
昨年末の話だけどSlackへの通知をプロキシするサーバをGoで書きました。如何せん1〜2時間で書いたので一部洗練されてない箇所があるかもしれませんが、 今年のはじめからすでに実運用をはじめています。
Slackboardの役割
SlackboardはSlackへのプロキシサーバであるslackboardとそのためのクライアントであるslackboard-cliの2つから構成されています。↓の図のようにSlackへの通知をクライアントが行うのではなく、クライアントからのリクエストを受け取ったプロキシサーバであるslackboardが行うという仕組みです。
このようにSlackへの通知を直接ではなくプロキシを介して行うのには以下のメリットがあります。
- Slackへの通知設定をプロキシサーバで一元管理できる
- Slackへの通知リクエストをロギングできる
- 各サーバに散らばったSlackへの通知プログラムを一本化できる
- そのための
slackboard-cli
具体的にはSlackのAPIエンドポイントやチャンネルの情報を記述した設定ファイル(slackboard.toml)を用意してslackboardを起動します。
[10.0.0.2] $ slackboard -c slackboard.toml
そして別のホストからslackboardに対してslackboard-cliでメッセージを送るというわけです。
[10.0.0.3] $ echo "notify" | slackboard-cli -s 10.0.0.2:29800 -t random
これにより各所にバラバラに散ったSlackへの通知メカニズムを一元化できるというわけです。
Slackboardのダウンロードとインストール
go getでできます。
go get -u github.com/cubicdaiya/slackboard/...
完了するとslackboard(プロキシサーバ)とslackboard-cli(クライアント)が利用出来ます。
Slackboardの設定ファイル
Slackboardはプロキシサーバ(slackboard)の設定ファイルをTOMLで記述します。
[core]
port = "29800"
slack_url = "https://hooks.slack.com/services/..."
[[tags]]
tag = "general"
channel = "#general"
[[tags]]
tag = "random"
channel = "#random"
username = "slackboard"
icon_emoji = ":clipboard:"
parse = "full"
[log]
access_log = "stdout"
error_log = "stderr"
level = "error"
[ui]
root = "/var/www/slackboard/ui"
各パラメータの解説はslackboard/CONFIGURATION.mdにまとめているので、ここでは主要なパラメータについてのみ解説します。
core.port
slackboardがListenするポート番号です。UnixドメインソケットでもListenできるようにするために文字列型で指定します。
[core]
port = "29800"
# port = "unix:/tmp/slackboard.sock"
core.slack_url
core.slack_urlにはSlackのAPIエンドポイントURLを指定します。
[core]
port = "29800"
slack_url = "https://hooks.slack.com/services/..."
Slackのチャンネルにタグ付け
slackboard.toml中に出てくるtagsのセクション一覧は実在するSlackのチャンネルに関連づけられたタグの配列です。slackboardがSlackのチャンネルへ通知を送るのに対してslackboard-cliはslackboardの関連づけられたタグに対してメッセージを送るというわけです。
slackboardのWeb UI
slackboardには非常に簡素なWeb UIが付属しています。Web UIのドキュメントルートは設定ファイルで指定します。(↓の${slackboard-src-dir}を適切なパスに直してください)
[ui]
root = "${slackboard-src-dir}/ui"
slackboardのHTTP API
通常slackboardとの通信はslackboard-cliを使って行うのでその詳細について意識する必要はありません。しかし、リクエストの実態はただのJSONボディなので自分でslackboardと通信するクライアントを書くこともできます。APIの仕様はslackboard/SPEC.mdにまとめてあります。
slackboard-cliを同期/非同期に実行する
slackboard-cliはつい昨日まで同期的に実行されるように実装されていました。しかし、隣の隣に座っている人から「同期だと遅いから非同期にして」とリクエストが来たので速攻で対応してデフォルトだと非同期で通知するように変更しています。なお、slackboard-cliからslackboardへの通知を同期的に行うには-syncオプションを指定します。
[10.0.0.3] $ echo "notify" | slackboard-cli -s 10.0.0.2:29800 -t random -sync
Slackへの通知が完了するまでレスポンスが返ってこないので数百msecから数秒単位の遅延が発生しますが、非同期で行う場合と違ってSlackへの通知が失敗したかどうかをslackboard-cli側で検知できるというメリットがあります。
まとめ
Slackboardは、
-
slackboard(プロキシサーバ)とslackboard-cli(クライアント)の二つで構成 - Slackへの通知設定をプロキシサーバで一元管理できる
- Slackへの通知リクエストをロギングできる
- 各サーバに散らばったSlackへの通知プログラムを一本化できる
といった特徴を持つプロダクトです。メルカリの中でも利用しています。詳しくはこちら。

