読者です 読者をやめる 読者になる 読者になる

Heroku で Hubot を動かしながら Mackerel で監視する

社内で Slack を普及させるための施策として ChatOps を推進しようと思っていて,その準備で Hubot を調べていたら,合わせて Heroku や Mackerel も調べたくなってしまって,ここ数日で試したりしていた.今日ちゃんと動くようになったので,簡単にまとめておこうと思う.

アジェンダ

大きく4部構成で段階を踏みながら進んでいく.

  1. ローカルで Hubot を動かす
  2. ローカルで動く Hubot と Slack を連携する
  3. Hubot を Heroku で動かす
  4. Heroku に Mackerel を導入する

1. ローカルで Hubot を動かす

最初 jarvis にしようと思ったけど,シンプルに botty と名付けた.Adapter は slack にしている.

➜  botty git:(master) yo hubot
                     _____________________________
                    /                             \
   //\              |      Extracting input for    |
  ////\    _____    |   self-replication process   |
 //////\  /_____\   \                             /
 ======= |[^_/\_]|   /----------------------------
  |   | _|___@@__|__
  +===+/  ///     \_\
   | |_\ /// HUBOT/\\
   |___/\//      /  \\
         \      /   +---+
          \____/    |   |
           | //|    +===+
            \//      |xx|

? Owner kakakakakku <xxx@gmail.com>
? Bot name botty
? Description A simple bot for me
? Bot adapter (campfire) slack

botty を起動して応答が返ってくれば正常に動いている.

➜  botty  ./bin/hubot
botty> botty ping
botty> PONG

2. ローカルで動く Hubot と Slack を連携する

Slack App で Hubot をインストールして HUBOT_SLACK_TOKEN を取得する.そして検証用に #playground チャンネルを作成して botty を招待しておく.

次に run.sh を新規作成する.ただし,環境変数を設定して GitHub に push してしまうと事故になるため,必ず .gitignore に追記して push しないようにしておく.そして取得した HUBOT_SLACK_TOKEN も指定しておく.もし GitHub や Twitter などの API を叩く場合も,同様に run.sh で環境変数として指定することになる.

#!/bin/sh

export HUBOT_SLACK_TOKEN=xxx

./bin/hubot -a slack

正常に起動すると Slack 側で botty がオンラインになる.さっきと同じように ping を送って応答が返ってくれば正常に動いている.

f:id:kakku22:20160129010606p:plain

3. Hubot を Heroku で動かす

今のままだと Hubot がローカルで動いているため,これを Heroku で動かせるようにする.

Hubot はバックエンドに Redis を使うため Heroku の Add-ons で Redis To Go - Add-ons - Heroku Elements を導入する必要がある.Heroku に push すると Hubot が簡単に動く.もし動かないなど困ったら heroku logs でログを確認するとエラーが出ていることもある.

➜  botty git:(master) heroku auth:login
➜  botty git:(master) heroku apps:create my-botty
➜  botty git:(master) heroku addons:create redistogo
➜  botty git:(master) git push heroku master

他には Heroku に30分間アクセスが無いと自動で Dyno が止まってしまうため,hubot-scripts/hubot-heroku-keepalive · GitHub で定期的に接続したり,6時間止まっている Dyno を起こすために Heroku Scheduler - Add-ons - Heroku Elements で curl をしたり,少し工夫している点はある.

➜  botty git:(master) heroku addons:create scheduler:standard
➜  botty git:(master) heroku config:add HUBOT_HEROKU_WAKEUP_TIME=8:00
➜  botty git:(master) heroku config:add HUBOT_HEROKU_SLEEP_TIME=24:00
➜  botty git:(master) heroku config:add TZ='Asia/Tokyo'
➜  botty git:(master) heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$(heroku apps:info -s | grep web-url | cut -d= -f2)

f:id:kakku22:20160129020003p:plain

4. Heroku に Mackerel を導入する

最近興味のある Mackerel を試してみようと思って Hubot を動かしている Heroku に導入してみた.ドキュメントの通りにスクリプトを書いたらすぐに導入できた.

help-ja.mackerel.io

まず Procfile を書き換える.

web: ./start.sh

次に Procfile から実行する start.sh を新規作成する.

# install mackerel-agent
cd /app/ && curl -O http://file.mackerel.io/agent/tgz/mackerel-agent-latest.tar.gz && tar xvfz mackerel-agent-latest.tar.gz
sh << SCRIPT
cat >/app/mackerel-agent/mackerel-agent.conf <<'EOF';
pidfile = "/app/mackerel-agent/mackerel-agent.pid"
root = "/app/mackerel-agent"
apikey = "${MACKEREL_API_KEY}"
roles = [ "${MACKEREL_SERVICE}:${MACKEREL_ROLE}" ]
[host_status]
on_start = "working"
EOF
SCRIPT
trap '/app/mackerel-agent/mackerel-agent retire -conf /app/mackerel-agent/mackerel-agent.conf -force' TERM
/app/mackerel-agent/mackerel-agent -conf /app/mackerel-agent/mackerel-agent.conf -v &

bin/hubot -a slack

ちなみに Mackerel で使う環境変数は事前に Heroku 側に設定しておく.

➜  botty git:(master) heroku config:add MACKEREL_API_KEY=xxx
➜  botty git:(master) heroku config:add MACKEREL_SERVICE=yyy
➜  botty git:(master) heroku config:add MACKEREL_ROLE=xxx

f:id:kakku22:20160129021112p:plain

そして Mackerel 側で閾値を低くしてアラートを飛ばしてみた.スゴイ!

f:id:kakku22:20160129021440p:plain

まとめ

来週の社内勉強会で ChatOps の紹介をする予定で,その準備として Hubot / Slack / Heroku / Mackerel を調べた.追加で AWS Lambda を使ってサーバレスな Bot も試してみようと思っている.あと今回は取り上げなかったけど Hubot の便利スクリプトやネタプラグインに関しても別でまとめようと思う.

ちなみに botty は以下のリポジトリで管理してるので,興味あったらどうぞ!

github.com