Edited at

Slackboard〜Slackプロキシサーバ in Go〜

More than 3 years have passed since last update.


Slackboard

https://github.com/cubicdaiya/slackboard

昨年末の話だけどSlackへの通知をプロキシするサーバをGoで書きました。如何せん1〜2時間で書いたので一部洗練されてない箇所があるかもしれませんが、 今年のはじめからすでに実運用をはじめています。


Slackboardの役割

SlackboardはSlackへのプロキシサーバであるslackboardとそのためのクライアントであるslackboard-cliの2つから構成されています。↓の図のようにSlackへの通知をクライアントが行うのではなく、クライアントからのリクエストを受け取ったプロキシサーバであるslackboardが行うという仕組みです。

image

このように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で記述します。


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-clislackboardの関連づけられたタグに対してメッセージを送るというわけです。


slackboardのWeb UI

slackboardには非常に簡素なWeb UIが付属しています。Web UIのドキュメントルートは設定ファイルで指定します。(↓の${slackboard-src-dir}を適切なパスに直してください)

[ui]

root = "${slackboard-src-dir}/ui"

image


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への通知プログラムを一本化できる

といった特徴を持つプロダクトです。メルカリの中でも利用しています。詳しくはこちら