MinecraftサーバーのイベントをSlackに通知する


# はじめに
Slackというチャットツールに

* 誰かログイン/ログアウトした
* 誰か死んだ

みたいなイベントを通知するようにします。

前回書いた[CentOS7 + Systemd でMinecraftサーバーの起動/自動起動/自動再起動](http://qiita.com/nownabe/items/ca45bb4829d75460b31e)の続きです。

# Slackとは？
[Slack](https://slack.com/)は今イケイケなナウいチャットツールです。
Skypeとかの仲間ですね。かなり使いやすいです:smile: 

色々なサービスと連携できるようになっているのでその仕組み利用します。

# ログを見る方法
前回systemdを使ってMinecraftサーバーを起動するようにしました。
ログもよろしくやってくれると書いておきながらログを見る方法を紹介してませんでした。

次のコマンドでログを表示することができます。

```bash
journalctl -a -o cat -u minecraft_server
```

systemdを使うとjournaldというやつがログを取るようになります。
`journalctl`コマンドはjournaldで貯めたログを見るためのコマンドです。

# 通知の仕組み
ログの確認方法もわかったところで、今回つくり上げる仕組みの全体像です。

![スクリーンショット 2015-09-19 22.45.52.png](https://qiita-image-store.s3.amazonaws.com/0/43208/a3db42d7-079e-26e7-df54-767619fb4104.png "スクリーンショット 2015-09-19 22.45.52.png")

journaldで貯めているログをfluentdというツールを使ってSlackに投げます。
fluentdはログ収集ツールです。収集だけでなく、集めたログをまたどこかへ転送するような中継もしてくれます。

# SlackのIntegration設定
Slackへ通知するための、Incoming Webhook URLというものを取得します。

まずはSlackのメニューの「Configure Integrations」をクリックしてIntegrationの設定画面を開きます。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/43208/312a7d52-6521-60b4-5cc0-abe7ed373f70.png "1.png")

下の方に「Incoming Webhooks」というのがあるので「View」ボタンをクリックしてください。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/43208/e2444315-6bc5-c02c-6bb2-4fe589a7a63a.png "2.png")

設定画面が表示されます。
通知したいチャンネルを選択して「Add Incoming WebHooks Integration」ボタンをクリックしてください。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/43208/5ba1a266-8f63-36fd-a903-bb2fd8a69654.png "3.png")

これでWebhook用のURLができました。
下の方の「Copy URL」をクリックするとURLがクリップボードにコピーされます。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/43208/d6386021-ef02-6c24-9f5f-85a03863fb32.png "4.png")


# fluentdセットアップ
では早速fluentdをMinecraftサーバーにインストールしましょう。

```bash
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
```

fluentd用のプラグインを2つインストールします。

```bash
td-agent-gem install fluent-plugin-grep
td-agent-gem install fluent-plugin-slack
```

fluentdの設定ファイルを編集してください。

```:/etc/td-agent/td-agent.conf
<source>
  type tcp
  port 24425
  format json
  tag minecraft.raw
</source>

<match minecraft.raw>
  type grep
  input_key MESSAGE
  regexp joined|left|drown|slain
  tag minecraft.greped
</match>
# regexpに通知したいメッセージの条件を正規表現で書く

<match minecraft.greped>
  type slack
  webhook_url https://hooks.slack.com/services/XXX/YYY/ZZZ
  channel minecraft
  username Minecraft Server
  icon_emoji :metal:
  message_keys MESSAGE
  flush_interval 1s
</match>
# webhook_urlは取得したWebhook URL
# channelは通知するチャンネル
# usernameは通知するときに表示するユーザー名
# icon_emojiは通知するときに表示するアイコンを絵文字で指定できる
```

最後に、fluentdを有効化して起動します。

```bash
systemctl enable td-agent
systemctl start td-agent
```

# 通知設定
journaldのMinefraft Serverログをfluentdに送信する設定をします。
これにもsystemdを使います。

送信するためにNetcatというソフトをインストールします。

```bash
yum install -y nc
```

次のようなログを送信するスクリプトを`/home/minecraft/minecraft/transfer_log`に作成してください。

```bash:/home/minecraft/minecraft/transfer_log
#!/bin/bash

/usr/bin/journalctl -af -o json -u minecraft_server | /usr/bin/nc 127.0.0.1 24425
```

スクリプトに実行権限をつけます。

```bash
chmod +x /home/minecraft/minecraft/transfer_log
```

次のような`/etc/systemd/system/transfer_minecraft_log.service`というファイル作成してください。

```:/etc/systemd/system/transfer_minecraft_log.service
[Unit]
Description=Transfer Minecraft Server Log
After=minecraft_server.service td-agent.service

[Service]
ExecStart=/home/minecraft/minecraft/transfer_log
Restart=always

[Install]
WantedBy=multi-user.target
```

最後に通知用スクリプトを起動しましょう！

```bash
systemctl daemon-reload
systemctl enable transfer_minecraft_log
systemctl start transfer_minecraft_log
```

以上です！
うまくいっていればこんな感じでSlackに通知されます。

![スクリーンショット 2015-09-20 0.10.47.png](https://qiita-image-store.s3.amazonaws.com/0/43208/6f421b53-9a01-855e-d7ec-bf84aaeb51c5.png "スクリーンショット 2015-09-20 0.10.47.png")