esaの更新通知を適切なチャンネルに振り分ける

こんにちは、mzpです。

先日、Misocaオフィスでesa meetupを開催しました。当日お越しいただいた方々ありがとうございます。 会の様子は以下のような記事にまとめられています。

f:id:mzp:20170126111947j:plain

最近、esaの更新通知を1つのチャンネルに流すのではなく、適切なチャンネルに振り分けるようにしたのでその話を書きたいと思います。

これまでのMisoca

これまでesaの更新通知をSlackの単一のチャンネル(#now_esa)に流していましたが、日報のような更新頻度の高いものの通知で、更新頻度の低い文書の通知が埋もれてしまうという問題がありました。

初期: 標準のWebhook

標準のWebhookの設定を変更して「日報」カテゴリ以下の更新を #now_nippou チャンネルに通知するようにしました。

f:id:mzp:20170126154224p:plain

これにより、日報の更新通知と、それ以外の記事の更新通知が分かれるため、日報がとても読みやすくなりました。 他のメンバーにもかなり好評でした。

f:id:mzp:20170126172149p:plain

同じように、「プロジェクト/なんとか」カテゴリ以下の更新はこのチャンネル、「プロジェクト/かんとか」カテゴリ以下の更新はこのチャンネルという設定をどんどん増やしていきました。こちらもなかなか好評でした。

f:id:mzp:20170126173847p:plain

問題点

しかし通知先が増えるにつれて、以下のような問題が生じました。

  • 「他の箇所で通知してないやつ」という設定ができないので、通知が二重で届くことがある。*1
  • 通知先のチャンネルを変えるには個別にincomming webhookを作る必要があるため、大量のincomming webhookを管理しないといけない。

通知が二重で届くことについては、他のメンバーからも不満がで始めました。

f:id:mzp:20170126173035p:plain

解決策: AWS Lambda

じゃあ自分でやるか、ということでAWS lambdaでルーティングする仕組みを作りました。 名前は伝書鳩からの連想でhatoにしました。

https://github.com/mzp/hato

hatoを使うと、以下のようなことができるようになります。

  • どのパターンをどのチャンネルに通知するかを一箇所で設定できる
  • Slackのincomming webhookは1つあればよい
  • 一致するパターンがあった場合はそこで処理をやめるため、重複して通知されない

今のところ以下のような設定にしています。

module.exports = [
  // 日報は更新量が多いので専用のチャンネルに流す
  { pattern: '^日報', channel: '#now_nippou' },

  // 各プロジェクトの通知はそれぞれのチェンネルに流す
  { pattern: 'プロジェクト/2017/採用', channel: '#talk_recruit' },
  { pattern: 'プロジェクト/2016/xxx', channel: '#talk_xxx' },

  // どこにも通知してないやつは、esaチャンネルに流す
  { pattern: '', channel: '#now_esa' }
]

余談

Webhookの通知テストをしていたら、会社のチャンネルに@さんのアイコンがまざってきておもしろかったです。

f:id:mzp:20170126174158p:plain

採用

Misocaでは情報共有ツールを大事にするソフトウェアエンジニアを募集しています。

*1:厳密にはできないのではなく、「それ以外」を表現する正規表現を簡潔に書くことができない、です