AWS LightSail で hubot を動かしてサービス化して備える

# 動機

PaaS もいいけど無料枠であれこれするってのもつらそうだし、思い切ってインスタンス借りてやってしまおうという話。

とりあえず、簡単なChatOpsを全面的に導入したいので、慣れるまで (= 実際のボット作業のインプリをいろいろできるようになるまで) ちょっと生々しいLinuxがみえるところでやってみたいなあと。

# 参考

- [Hubotを使ってSlackへBotを投げる - Qiita](https://qiita.com/shosho/items/057d7b67d1dd3a700554)

- [hubotをデーモン化するだけならsystemdだけでよかった - Qiita](https://qiita.com/fruitriin/items/22f4075e2c9cf100d385)

- [hubot/hubot.service at master · hubotio/hubot](https://github.com/hubotio/hubot/blob/master/examples/hubot.service)

# LightSail を用意する

1. LightSail のコンソールにいって
2. インスタンスの作成ボタン
3. 設計図の選択 で Node.js 11.6.0 を選択して作成

以上で完了。

# Hubot 作成

前手順で用意した LightSail インスタンスに ssh して

1. `sudo npm install -g yo generator-hubot`
2. `mkdir ha4go-bot`
3. `cd ha4go-bot`
4. `yo hubot`

これで作成開始、とりあえず以下のように答えた

```
? Owner PharaohKJ
? Bot name ha4go-bot
? Description A simple helpful robot for your Company
? Bot adapter slack
```

# API Token 取得

1. botを置きたいslackにウェブブラウザでログイン
2. Search App Directory で `Hubot` を検索して追加
3. 名前をつける（私はBot name と同じにした)

これで API Tokenが表示される。

# トークンつきでHubot 実行 & TEST

1. ↑の `yo hubot` したシェルから `HUBOT_SLACK_TOKEN=<TOKEN> ./bin/hubot --adapter slack`
2. botを置きたいslackのAppsのところに `ha4go-bot` が登場する
3. ダブルクリックして会話モードに入って `ping` と話かける。 `PONG` と返ってくる
4. botを置きたいslackのチャンネルで `/invite @ha4go-bot` とすることで呼び込める
5. 呼び込んだら `@ha4go-bot ping` と話かけると `PONG` を返ってくる

できたぞー

# 自動実行 = サービス化

サービスファイルを作成して `systemd` にがんばってもらう。hubotコンソールを抜けて

`sudo vim /etc/systemd/system/ha4go-bot.service` 

参考サイトを参照して以下のように作った。実行ファイルをフルパスにしないといけなかった & 実行パスをいろいろ指定しないと npm が無いと言われたので `sudo su -` して `export` した `PATH` の中身をまるまるコピペした。あと、 `Environment="HUBOT_SLACK_TOKEN=<TOKEN>"` を `Environment="HUBOT_SLACK_TOKEN='<TOKEN>'"` ってやったらクオートがトークンにはいっちまってNGだったので注意。

```
[Unit]
Description=Ha4go-Hubot
Requires=network.target
After=network.target

[Service]
Type=simple
Restart=always
WorkingDirectory=/home/bitnami/ha4go-bot/
User=bitnami
ExecStart=/home/bitnami/ha4go-bot/bin/hubot --adapter slack
ExecStop=/bin/kill $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
Environment="HUBOT_SLACK_TOKEN=<TOKEN>"
Environment="PATH='/opt/bitnami/redis/bin:/opt/bitnami/python/bin:/opt/bitnami/nodejs/bin:/opt/bitnami/git/bin:/opt/bitnami/apache2/bin:/opt/bitnami/common/bin:/opt/bitnami/redis/bin:/opt/bitnami/python/bin:/opt/bitnami/nodejs/bin:/opt/bitnami/git/bin:/opt/bitnami/apache2/bin:/opt/bitnami/common/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin'"


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

このファイルができたら `sudo systemctl start ha4go-bot` で開始。slackにha4go-botがオンラインになったら大成功。ならなかったら

- `sudo systemctl status ha4go-bot` で確認
- `journalctl -e` とか `journalctl -xe` でログ確認

しながら対応すればOK。だいじょうぶそうなら `sudo systemctl enable ha4go-bot` して自動起動有効にしておく。

そして ssh を抜けてha4go-botがオンラインのままならとりあえず成功。やったね。

# ソースコードの管理

んんー↑の `Environment="HUBOT_SLACK_TOKEN=<TOKEN>"` は `EnvironmentFile` に置き換えてコード管理したほうがいいかもしれないね、、、。とりあえずserviceファイルは管理しないとして、ha4go-botディレクトリに移動して

1. `git init` # プリインストールだった、やったね
2. `git add .` # .gitignore も作ってくれているのでだいじょうぶなはず
3. `git commit -m '1st commit'`
4. GitHubでリポジトリ作成、リポジトリのssh URLゲット
5. いろいろやりかたけれど `ssh-keygen` で鍵ペアを作成して公開鍵をGitHubにコピペ
6. `git remote add origin <git@githのURL> `
7. `git push origin master`


できたのがこれ [PharaohKJ/ha4go-bot: CfK で使うボットです](https://github.com/PharaohKJ/ha4go-bot)

とりあえずこれで準備はできたな。とりあえずメモリの量とか気になるんでいったん `munin-node` 入れてウォッチしていく。

# httpd を止めておく

munin でみてたらもういきなりメモリないやんけ。ケチって512Mのインスタンス借りたからまぁしょうがないんだが・・・。

```
$ ps aux
(略)
root      1863  0.0  0.8 199192  4388 ?        Ss   11:19   0:00 /opt/bitnami/apache2/bin/httpd.bin -f /opt/bitnami/apache2/conf/httpd.conf
daemon    1870  0.0  2.4 568348 12000 ?        Sl   11:19   0:00 /opt/bitnami/apache2/bin/httpd.bin -f /opt/bitnami/apache2/conf/httpd.conf
daemon    1871  0.0  2.3 568544 11780 ?        Sl   11:19   0:00 /opt/bitnami/apache2/bin/httpd.bin -f /opt/bitnami/apache2/conf/httpd.conf
daemon    1872  0.0  2.6 568544 13452 ?        Sl   11:19   0:00 /opt/bitnami/apache2/bin/httpd.bin -f /opt/bitnami/apache2/conf/httpd.conf
daemon    1873  0.0  2.9 568680 14908 ?        Sl   11:19   0:00 /opt/bitnami/apache2/bin/httpd.bin -f /opt/bitnami/apache2/conf/httpd.conf
daemon    1874  0.0  2.9 568540 14460 ?        Sl   11:19   0:00 /opt/bitnami/apache2/bin/httpd.bin -f /opt/bitnami/apache2/conf/httpd.conf
(略)
```

んんん？httpdがバリバリ動いてますぞ。そうかNode.jsの設計図を使うとbitnamiさんが用意してくれたhttpdがデフォルトで動くようになってるのか。 `このサーバ:80` でwelcomeページも表示される。expressとか使うのにはいいんだろうが、今回はいらないんだなあ。

httpd (apache2) はうまいこと bitnami さんのスクリプトで処理されているようで httpd だけを disable する方法がわからん。中のスクリプト読む限り、まぁこれでいいんじゃないか、、、ってことで 

```
$ sudo systemctl stop bitnami
$ sudo systemctl disable bitnami
$ sudo systemctl status bitnami
```

ってやっとけば、再起動しても httpd があがってなくてメモリあいてるっぽいのでよしとする。