藤原です。
カヤック社内では長らく社内のチャットシステムとして、Skype と IRC を併用してきました。Skype には一応全員アカウントを持っているのですが、IRCと比較すると
- botでの自動化が難しい
- 過去ログを参照しづらい
- 自分以外にだれもオンラインになっていないと発言できない (深夜の障害対応などで致命的)
という特性のため、エンジニアを中心に好んで IRC を使用していたチームも多く、分断されていた状態でした。
今年は Slack が一気に世間的に広まったこともあり、ここはひとつ全社のチャットシステムを Slack に移行しよう!という気運が盛り上がり、現在自社サービスのすべてと一部のクライアントワークチームが Slack に移行完了しています。 (以前から Skype を使用している部署はまだ移行し切れていないので、全社統一は来年の課題です)
このエントリでは、IRC から Slack へ移行したときにやったことをまとめます。
IRC 時代にあったもの
IRC は非常にシンプルなシステムのため、社内では各種サブシステムを整備して機能を補完し、便利に使えるようにしてありました。
素の IRC で課題になる点として、以下のようなものがあります。
- 過去ログを保存する機能がない
- 個人が znc, tiarra 等の bouncer を導入する必要がある
- ファイル送信ができない
- DCCはネットワーク設定によっては使用不可
- アカウント管理ができない
- 共通パスワードは望ましくない
- mobile pushなどの通知が難しい
それを解決するために、以下のような機能を整備してありました。
- ログ取得用 bot (tarra) による任意チャンネルの自動過去ログ保存
- 過去ログを HTML で参照可能にする Web UI
- Groongaによる全文検索
- nopaste によるテキストの保存と URL 生成
- (社内) Gyazo による画像 upload と URL 生成
- ファイルアップローダ
- znc によるマルチアカウント管理
- Web UI でアカウント作成すると自動的に znc.conf に設定を追加し、各自のユーザ名とパスワードで認証、接続維持する
- znc plugin による im.kayac.com 連携
- znc でのアカウントごとにキーワードを任意に設定し、im.kayac.com で push 通知を送信する
世間の IRC 環境に比べてもかなり頑張っている部類だと思います。
が、このほぼすべての機能を自分ひとりで実装、管理、運用していたのでこの先どうするんだ、というのがひとつ。
しかもここまで頑張っても、クライアントソフトの見た目があまりかわいくない、アイコンが見えない、というような理由で非エンジニア受けがどうしても悪く敬遠される、ということから、Slack に乗り換えることにしたわけです。
Slack 移行でやったこと
さて、先に書いた便利機能は Slack はすべてカバーしているわけで、移行に当たっての作業は実はそれほど多くありませんでした。人間向けには、Slack 利用にあたってのガイドラインを整備して共有、周知したぐらいです。
ただし機能は足りていたとしても、IRC 上で自動化運用していたチームのサービス運営が滞らないように移行する必要があります。人間は柔軟に使い方を変えられますが bot はそうではないので…
nopaste の IRC, Slack マルチポスト対応
社内 nopaste(というテキストを送信するとサーバに保存してURLを生成してくれるサービス)には IRC 投稿機能があり、各種プログラムから IRC に通知を送信する場合 (Zabbixのアラートなども含む) は基本的にこれを使用していました。
そこで、まず nopaste を Slack にも投稿できるように改造し、移行期間中は IRC, Slack の同名のチャンネルにそれぞれ投稿するようにしました。
以前は node.js の実装だったのですが、この機会に Go で実装しなおし、GitHubで公開しています。github.com/kayac/nopaste
nopaste の亜種として、テキスト保存せずに通知だけ行う msgr というプログラムも存在していたので、それもセットで実装してあります。
これで、プログラムからの通知類は何も変更せずに Slack へ投稿できるようになりました。
各種 bot 類の Slack 対応
いわゆる ChatOps を実践しているチームも多かったため、bot 類の Slack 対応も必要でした。
これはそれぞれの bot 作者に任せたのですが、
- IRC用の bot framework ape by @m0t0k1ch1 を Slack 対応させた ape-slack を @shogo82148 が書いたり
- ape を使用していた gopher by @Maco_Tasu を ape-slack に置き換えたり
- 指定時間になったら mention 飛ばして教えてくれる remember が remember(姉) になったり (@acidlemon)
- 他にもいろいろ
と、各エンジニアの協力により迅速に対応が進みました。
ただし、当面 bot を Slack 対応する時間が取れないが移行したい、ということもあるだろうということで、IRC と Slack の発言を相互にリレーする sirbot というのも用意しました。
これを使うと、bot は IRC に生息したまま、人間は Slack で発言して bot に指示を与えることができますし、bot は IRC へ post することで人間は Slack で読むことができます。
プロジェクトごとに先行して Slack を利用していたチームの統合
各プロジェクトごとに、個別にチームを作成して Slack を利用していたところも一部ありました。それらのチームでは、必要なチャンネルをアーカイブして過去ログを全社 Slack のほうへ取り込んでいます。
その他、GitHub や Jenkins の通知は znc にアカウントを個別に作って IRC 連携したものを解除し、公式の Slack integration に置き換えたりしています。
未解決問題
社内 Gyazo の URL を貼った場合に画像展開をしたいのですが、これができていません。
- Slack に URL を書き込むと、
Slackbot-Expanding
という User-Agent のリクエストが飛んできて取得しようとする - アクセス元は EC2 としか分からない (非公開)
- SlackBotのドキュメントによると “Responses to these requests are cached globally across the service for around 30 minutes.”
- グローバルに共用されてしまうので、社外に出せない画像を取得させるわけにはいかない
となると社内 Gyazo の URL を見つけたら取得してファイルアップロードする bot を動かすしかないのですが、今度は
- bot アカウントはファイルアップロードできない
- リアルアカウントは Google Apps での SSO をしているため安易に用意できない
という問題があり、現在未解決です。なにかいい方法ないですかね……
まとめ
ということで、9月末に本格移行を始めて、1ヶ月ほどの併用期間をもって IRC で運用していた社内チャットはすべて Slack に移行完了しました。スムーズな移行にご協力いただいた皆様、ありがとうございました。
だいぶ頑張って IRC 周辺環境整備してた身とするとなんだか寂しい気もしますが、古いものはちゃんと閉じていかないと前に進めませんからね。
明日は @m0t0k1ch1 です!