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への通知プログラムを一本化できる
といった特徴を持つプロダクトです。メルカリの中でも利用しています。詳しくはこちら。