Hubot を Amazon EC2 にセットアップし、Slack と連携する！


![スクリーンショット 2014-08-16 14.16.42.png](https://qiita-image-store.s3.amazonaws.com/0/35733/53168a16-5904-e71d-9598-75595d07caab.png "スクリーンショット 2014-08-16 14.16.42.png")![スクリーンショット 2014-08-16 14.22.19.png](https://qiita-image-store.s3.amazonaws.com/0/35733/584dec1f-1276-1307-392c-f49a6c154589.png "スクリーンショット 2014-08-16 14.22.19.png")![スクリーン
ショット 2014-08-16 14.17.01.png](https://qiita-image-store.s3.amazonaws.com/0/35733/2fd45c86-9eda-192b-a3c3-0796d5e0ca74.png "スクリーンショット 2014-08-16 14.17.01.png")

# はじめに

Hubot は Heroku に構築するのが主流らしいのですが、Heloku のアカウント持ってないし、このためにクレジットカードを新しく登録するのも嫌だったので、既にアカウントがある AWS の Amazon EC2（OS：Amazon Linux）上に構築し、更に Slack と連携する、ということをしてみました。

Amazon Linux のクリーンインストール状態から次の手順で上手くいったので（AWSのセキュリティグループとか Node.js の起動の方法とか、細かいところは気になりますが）、これから導入される方の参考になれば。

# 前提

- 前述のとおり、サーバは Amazon EC2 （OS は Amazon Linux）を利用します。
	- ここでは EC2 のセットアップ手順については言及しません。
	- 今回、私が使った AMI は、Quick Launch の一番上にあるこれです。

		![スクリーンショット 2014-08-15 20.09.32.png](https://qiita-image-store.s3.amazonaws.com/0/35733/5c78e883-3840-9cac-e993-390468564d80.png "スクリーンショット 2014-08-15 20.09.32.png")

	- セキュリティグループの設定で、HTTP の 80番ポートへのアクセスを許可してください。
		- <del>本当はポート番号を変えたかったのですが、ELB(Elastic Load Balancing)か何かを使わないと、EC2 単体では 80番から変更できないようです..</del> **追記：** `Type` で TCP を選択すれば、任意のポート番号で HTTP通信できるようです。
		- 接続元の IP も、本当は絞りたいところですが、Slack 経由のアクセスになってしまうから絞るのは難しい？

			![スクリーンショット 2014-08-16 0.17.33.png](https://qiita-image-store.s3.amazonaws.com/0/35733/31cbc4eb-59fb-9290-e6fd-86e83bc202dd.png "スクリーンショット 2014-08-16 0.17.33.png")

# 手順

以降、Amazon Linux にログインしてからの手順です。

## Node.js、npmコマンドツールをインストール

- 下記コマンドを実行。

	```shell
	$ sudo yum -y install nodejs npm --enablerepo=epel
	```

	※ `npm` は、次節の Hubot、CooffeeScript をインストールするのに利用します。

- 確認してみます。

	```shell
	$ node -v
	v0.10.29
	```

	```shell
	$ npm -v
	1.3.6
	```

## Hubot、CoffeeScript をインストール

- 下記コマンドを実行。

	```shell
	$ sudo npm install -g hubot coffee-script
	```

- 確認してみます。

	```shell
	$ hubot -v
	2.8.0
	```

	```shell
	$ coffee -v
	CoffeeScript version 1.7.1
	```

## Redis をインストール

- 下記コマンドを実行。

	```shell
	$ sudo yum -y install redis --enablerepo=epel
	```

- 起動します。

	```shell
	$ sudo /etc/init.d/redis start
	redis-server を起動中:      [  OK  ]
	```

	※ ちゃんとやるなら、自動起動とかを設定した方がいいです。

## Hubot を作成


以降、`$ sudo -s` で root ユーザになり作業します。
(理由：個人ユーザだと、Node.js が起動した際に、外部からの HTTPリクエストを listen できなかったため.. Node.js 詳しくないけど、やり方はあるのかな？)

- 下記コマンドを実行。

	```shell
	# hubot --create test_bot
	```

- 動かしてみます。

	```shell
	# cd test_bot
	# bin/hubot
	```

	上記の `bin/hubot` は中身をみるとスクリプトファイルで、中で npm install が走っている模様。
	いろいろインストールされましたが、終わると次のようにプロンプトが表示されます。

	```shell
	Hubot> 
	```

	Hubot の基本コマンドである ping をしてみます。

	```shell
	Hubot> hubot ping
	Hubot> PONG
	```

	上記のように `PONG` と返ってこればOKです^^ `exit` でいったん抜けます。

## Slack用アダプタのインストール

- 下記コマンドを実行。

	```shell
	# cd test_bot
	# npm install hubot-slack --save
	```

> **補足：**
> 前回まで `npm` コマンドは、`-g` オプションをつけてグローバル領域にインストールしていました。今回は `-g` をつけず、このディレクトリ配下のプロジェクトだけに nodeモジュールをインストールしています。また `--save` オプションにより、ディレクトリ配下の package.json に `hubot-slack` が依存モジュールとして追記されます。

## Slack 側の設定

- Slack の Integrations ページの Add Service Integrations メニューで、Hubot を選択します。

	![スクリーンショット 2014-08-15 21.09.02.png](https://qiita-image-store.s3.amazonaws.com/0/35733/bf4e97de-45ef-6f90-0739-330711412c64.png "スクリーンショット 2014-08-15 21.09.02.png")

- 環境変数が 3つ、表示されます。上の 2つ は、後で Hubot を起動する際に利用することになります。
- Hubot URL には、EC2 の Public DNS を入力します。
	- 例：`http://ec2-111-222-333-444.us-west-2.compute.amazonaws.com/`
	- 今回、使うポートは 80番 なので、特に指定は不要です。
- Label は Slack の設定メニュー上の表示のみで利用するものなので、何でもいいです。

	![スクリーンショット 2014-08-16 0.13.04.png](https://qiita-image-store.s3.amazonaws.com/0/35733/d21dd9e2-c784-2248-39ed-2c6130547de4.png "スクリーンショット 2014-08-16 0.13.04.png")

- すべて入力したら、画面下の Save Integration ボタンで保存します。

## Hubot の起動

- EC2 に戻り、Slackの画面で表示された内容を元に、次のように環境変数を設定。

	```shell
	# export HUBOT_SLACK_TOKEN=[Slackの画面に書いてあった値]
	# export HUBOT_SLACK_TEAM=[Slackの画面に書いてあった値]
	# export HUBOT_SLACK_BOTNAME=[任意のボット名(例：hogebot)]
	# export PORT=80
	```

	※ もしくは、`/bin/hubot`(スクリプトファイル)に上記を記載してもOKです。
	※ ポートは何も指定していないとデフォルトの 8080番 ポートとなってしまうので、AWS のセキュリティグループの設定と合わせて、80番ポートを指定します。
	※ 上記のボット名は、Slack 上で語りかけるボット名となります。

- Hubot を起動。

	```shell
	# bin/hubot -a slack
	Successfully 'connected' as hogebot
	```

	※ ちゃんとやるなら、バックグラウンドで起動したり、デーモン等にした方がいいです。

- Node.js の HTTPのサービスが起動しているはずなので、ブラウザで EC2 の Public DNS にアクセスしてみます。
	- 例：`http://ec2-111-222-333-444.us-west-2.compute.amazonaws.com`
	- 次のように表示されれば、Node.js が HTTPリクエストをハンドリングできています。

		![スクリーンショット 2014-08-15 23.11.54.png](https://qiita-image-store.s3.amazonaws.com/0/35733/b6d596c1-a3dc-963f-1daf-3328ba9128b8.png "スクリーンショット 2014-08-15 23.11.54.png")

# 動作確認

Slack のオープンな CHANNELS で、ping してみます。ボット名は、Hubot を起動した時に環境変数で指定したものです。@はつけなくても大丈夫です。

![スクリーンショット 2014-08-16 0.09.37.png](https://qiita-image-store.s3.amazonaws.com/0/35733/0b8fc289-8bac-54de-46ec-1f61f17f95a7.png "スクリーンショット 2014-08-16 0.09.37.png")

応答が返ってきました^^

> **注意：**
> Slack は、オープンな CHANNELS でないと、Hubot が応答しないらしい。ずっと PRIVATE GROUPS で試してて、3時間ぐらい無駄にしました..。

# おわりに

Hubot の挙動は CoffeeScript で拡張できるので、これから色々ためしてみようと思います。