EC2上にhubotを設置してslackと連携させる

最近ChatOpsに興味が出てきたので、とりあえずEC2上にhubotが動作する環境を作り、slackと連携出来るようにしました。

# 前提
以下の環境が既にあること。

- EC2
- slack

# 環境構築
- nvm〜hubotの起動までは全てEC2上での作業です。

## nvmのインストール
- curlでインストールします

```
sudo curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
```

- .bash_profileに以下を追記します

```
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
```

- nvmコマンドが実行できることを確認します

```
nvm help
```

## nodejsのインストール
- nvmでnodejsのv6.11.0をインストールします
- 公式サイトを見ると `includes npm 3.10.10` と書いてあるのでnpmも一緒にインストールされます

```
nvm install 6.11.0
```

- インストールされたことを確認します

```
node -v
npm -v
```

## redisのインストール
- elasticacheは使わずAmazon Linux上にredisをインストールします
- epelだとバージョンが古いようなのでremiを利用します

```
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo yum --enablerepo=remi install redis
```

- redisを起動させます

```
sudo service redis start
```

## hubotのインストール
- hubotの環境を構築します
- npmでhubot,coffescript,redis,yo,generator-hubotをインストールします

```
npm install -g hubot coffee-script redis yo generator-hubot
```

- hubotをインストールします

```
mkdir -p ~/deploy-sushi
cd deploy-sushi
yo hubot
```

- 対話式で色々聞かれるので自身の環境に合わせて入力してください



```
? ==========================================================================
We're constantly looking for ways to make yo better!
May we anonymously report usage statistics to improve the tool over time?
More info: https://github.com/yeoman/insight & http://yeoman.io
========================================================================== Y/no


省略


? Owner (User <user@example.com>)
? Bot name (deploy-sushi)
? Description (A simple helpful robot for your Company)
? Bot adapter (campfire)
```

- 今回は？4つに以下のように答えました

```
? Owner {MY_EMAIL}
? Bot name deploy-sushi
? Description this is deploy boy
? Bot adapter slack
```

- hubotを立ち上げて動作確認をします

```
bin/hubot
```

- いろんなメッセージが出た後にEnterを押せば `deploy-sushi>` という対話が始まります

```
deploy-sushi> deploy-sushi ping
deploy-sushi> PONG
```

- hubot-slackをnpmでインストールします

```
npm install hubot-slack
```

## slackと連携させる
- slack上の操作に変わります
- slackのサイドメニューを開き `Configure Apps` を開きます

![スクリーンショット 2017-06-17 14.12.32.png](https://qiita-image-store.s3.amazonaws.com/0/71146/31696b9e-f98d-c4a4-8542-0c6eae38993e.png)

- 画面上部に `Hubot` を入力し、検索結果をクリックします

![スクリーンショット 2017-06-17 14.16.11.png](https://qiita-image-store.s3.amazonaws.com/0/71146/b6c153e8-f212-418b-ac5f-e6504151eb82.png)

- Installボタンをクリックします

![スクリーンショット 2017-06-17 14.17.17.png](https://qiita-image-store.s3.amazonaws.com/0/71146/64d3acc6-6361-9576-966f-7b9ca4984f1c.png)

- hubotの名前を入力して Add Hubot Integrationをクリックします

![スクリーンショット 2017-06-17 14.18.21.png](https://qiita-image-store.s3.amazonaws.com/0/71146/e9f71570-1991-267c-cc9d-955de3b06fb8.png)

- 作成が完了したらhubotの詳細画面に遷移するので画面上部の `Setup Instructions` のところに記載されている `HUBOT_SLACK_TOKEN={YOUR_API_TOKEN}` をコピーしておきます
- 画像を変更する・・・など何か編集を加えた場合、画面下部の保存ボタンをクリックして更新してください

- EC2に戻り以下の環境変数をexportします

```
echo 'export HUBOT_SLACK_TOKEN={YOUR_API_TOKEN}' >> ~/.bash_profile
source ~/.bash_profile
```

- アダプタを指定してhubotを起動します

```
bin/hubot --adapter slack
```

- slackのどこかのチャンネルにhubotをinviteして動作確認します

![スクリーンショット 2017-06-17 14.29.14.png](https://qiita-image-store.s3.amazonaws.com/0/71146/496ee44d-bf8e-21c2-30e2-d0f467e9ada9.png)

- 動作確認ができたらEC2起動時に自動でhubotが立ち上がるようにします

## hubotの永続実行
- foreverをnpmでインストールします

```
npm install -g forever
```

- `bin/hubot` を書き換えます

```
以下を追記
forever start -w -c coffee node_modules/.bin/hubot --adapter slack


以下をコメントアウト
exec node_modules/.bin/hubot --name "deploy-sushi" "$@"

```

- バックグラウンドで動くことを確認します

```
bin/hubot
ps aux | grep hubot
```

## EC2起動時のスクリプト作成

```
sudo vi /etc/init.d/start_deploy_hubot
```

- 以下を記述します
    - chkconfigのランレベルと優先度については以下参照
    - https://webkaru.net/linux/run-level/

```
#!/bin/bash
#chkconfig: 2345 99 10
#descpriction: start deploy hubot
DIR="/home/ec2-user/deploy-sushi"
cd $DIR
bin/hubot
```

- 実行権限を付与します

```
sudo chmod 755 /etc/init.d/start_deploy_hubot
```

- サービスに追加します

```
sudo chkconfig --add start_deploy_hubot
```

- EC2インスタンスを再起動してhubotが立ち上がっていることを確認してください

## hubotが起動しなかった・・・
- npm,foreverのパスがec2-userにしか通っていないかったのでrootでnpm,foreverするとコマンドが見つからない。
- トークンもec2-userの `.bash_profile` に記述していたので見つからない。
- とりいそぎ `bin/hubot` に以下を追記しました
    - `npm install` よりも前に追記してください

```
export PATH="/home/ec2-user/.nvm/versions/node/v6.11.0/bin:$PATH"
export HUBOT_SLACK_TOKEN={YOUR_API_TOKEN}
```

- EC2を再起動して、hubotが立ち上がっていることを確認してください
    - プロセスの確認をします

```
ps aux | grep hubot
```

- slackのチャンネルでもpingして返答があることを確認してください

# おわり
hubotがサーバ上で動き続けるようになったので、次回はslackからgit操作を出来るようにしようと思います。