stackstorm

【初心者向け】AWS+Hubot+Slackで自動返信するBOTの作り方(後半)

AWS+Hubot+Slackを使ってBOTを作る方法(後半)を投稿します:)

前半はこちら
http://qiita.com/ShirakawaYoshimaru/items/dc79b9548a43f9c6fe9f

構成はこんな感じ
(前半)1.EC2サーバー作成のための下準備
(前半)2.EC2サーバーを立てる
(後半)3.SlackのBOT設定
(後半)4.EC2サーバーに入ってHubotを作る
(後半)5.Tips


間違いやアドバイス等があったら気軽にコメントください><
では始めて行きます 🙂

3.SlackのBOT設定

Slackに追加するBOTは、最初にSlackに登録し、チャンネルに招待する必要があります。

3-1.BOTをSlackチームに登録する

このurlを開いてくか、
https://slack.com/apps

もしくは、
Slackのチーム名をクリックして、メニューを開いて「Apps & integrations」をクリックしてください。
Slack 2016-04-15 10-59-33.jpg

ブラウザでこんな画面が開きます。
検索バーに「Hubot」を入力して検索しましょう。Hubot導入画面に遷移できます 🙂
App Directory | Slack 2016-04-15 11-05-07.jpg

Hubot導入画面でHubotをインストール(追加)したいチームを選択します。
Hubot | Slack 2016-04-15 11-12-41.jpg

チームの選択ができたら、まずはBotの名前を入力します。
Botの名前は小文字/数字/ドット/アンダーバー/スラッシュしか使えないので注意です。
(大文字は使えません)
Hubot | tech_salon Slack 2016-04-15 11-18-45.jpg

次の画面に行くと、Hubotの詳細設定ができるようになります。
BOTのICONはこの画面で変更できます。
ここに後で使う API TOKEN があるので必ずメモっておきましょう。
TOKENをメモったら、画面下部にある Save Integrationボタン を押してBot情報を保存します。 (Save Integrationボタンを選択しても画面は特に変わりません)
Hubot | tech_salon Slack 2016-04-15 11-24-08.jpg

3-2.BOTをチームのチャンネルに招待する

BOTをチャンネルに招待しましょう。
Slackに戻り、画面右上のメニューボタンを選択して Team Directory を選択します。
Slack 2016-04-15 11-37-25.jpg

Teamに入っているメンバー全員の一覧が見れます。先ほど追加したBOTを選択しましょう。
Slack 2016-04-15 11-38-43.jpg

BOTの詳細が見れます。下矢印?マークを選択し、 Invite to a channel を選択します。
Slack 2016-04-15 11-39-20.jpg

どこのチャンネルに招待するか選択しましょう。#randomや#generalでもいいのですが、BOTの動作テストをすることを考えると、#bot みたいなテスト用チャンネルを作成してそこに招待する方が良いでしょう。
ちなみに招待先を間違えると管理者権限がない限りremoveできないので注意してください。
僕は今回#botチャンネルを作ってそこに招待しました。
Inviteボタンを選択すれば招待完了です。
Slack 2016-04-15 11-41-18.jpg

先ほどのBOT設定画面にもどり、所属チャンネル一覧に招待したチャンネルが表示されていればokです。
(間違えて#randomに招待してしまったので、スクショでは#randomと#botの二つに所属していることになっています)
Hubot | tech_salon Slack 2016-04-15 12-00-05.jpg

4.EC2サーバーに入ってHubotを作る

ここまでくれば後は簡単です!
やることは
4-1.EC2にssh接続(ログイン)する
4-2.必要なものをinstallする
4-3.Hubot作成
4-4.Hubot実行
4-5.動作確認テスト
になります 🙂
ある程度のUnixコマンドの知識は必要ですが、基本コピペでも大丈夫です 🙂

4-1.EC2にssh接続(ログイン)する

EC2へのssh接続は割と簡単です。
前半でEC2サーバーを建てる時にダウンロードしたpemファイルを使用するので用意しておきましょう。

ssh接続はこのコマンドでできます。
pemファイルのパスは自分の環境に合わせて変えてください。
userNameはEC2サーバーの場合「ec2-user」が用意されているのでそれを使います。
ipアドレスも自分のEC2サーバーに合わせて用意してください。

ssh接続コマンド
$ ssh -i pemファイルのパス userName@ipアドレス

EC2サーバーのipアドレスを確認しましょう。
AWSにログインして、EC2管理画面から自分のEC2を選択し、 パブリックIP をメモりましょう。パブリックIPを使ってssh接続します。
EC2 Management Console 2016-04-15 12-17-30.jpg

pemファイルのアクセス権限の設定が弱いとssh接続ができないのでアクセス権限を変えます。
ちなみにファイルパスを手入力するのは大変です。Finderからターミナルにファイルをドラック&ドロップすると勝手にファイルパスが記入されるので是非使ってみてください。
pemファイルのアクセス権限を強くする
$ chmod 400 pemのファイルパス

僕の場合こんな感じになりました。
shirakawayoshimaru1 — bash — 120×24 2016-04-15 12-21-31.jpg

それではターミナルを使って実践していきます。

ssh接続コマンド
$ ssh -i pemファイルのパス userName@ipアドレス

僕の環境ではこうなりました。
shirakawayoshimaru1 — bash — 120×24 2016-04-15 12-24-17.jpg

初めて接続するipアドレスには「本当にここに接続していいの?」的な確認がでるのでyesと入力しましょう。
shirakawayoshimaru1 — ssh — 120×24 2016-04-15 12-24-57.jpg

無事ssh接続ができた場合は、こんな感じになります。
shirakawayoshimaru1 — ec2-user@ip-172-16-0-10:~ — ssh — 120×24 2016-04-15 12-28-55.jpg

4-2.必要なものをinstallする

nodesとreisとnpm をインストールしてください。
コマンドを入力したらいろいろ聞かれますが全てyを入力してください。

$ sudo yum install nodejs redis npm --enablerepo=epel

次にcoffee-scriptとhubをインストールしてください。
コマンドを入力したらいろいろ聞かれますが全てyを入力してください。

$ sudo npm install -g coffee-script hubot yo generator-hubot

これで必要なものは全てinstallすることができました。

4-3.Hubot作成

まずはHubotの作業フォルダを作成しましょう。
これで「QiitaMaruBotフォルダ」を作成してその中に入れます。

$ mkdir QiitaMaruBot
$ cd QiitaMaruBot/

次にHubotを作成します。
Hubotの作成は簡単でこれだけです。

$ yo hubo

Owner:適当に入力
Bot Name: 小文字のみ
Description: 適当に入力
Bot Adapter: slackと入力

次にHubotにToken(SlackのHubot管理画面にあったやつ)を設定します。
xoxb-34928263845-fhogehogehogehogheohgehogeの部分は自分のTokenに変えてください。

$ export HUBOT_SLACK_TOKEN=xoxb-34928263845-fhogehogehogehogheohgehoge

以上でHubotの作成になります。

4-4.Hubot実行

ここではEC2サーバーの中でHubotが正常に動作しているか確認します。
Hubotに対して「ping」というメッセージを送った時に「pong」と帰って来れば成功です。

まずはHubotを実行します。
(QiitaMaruBot/bin/hubotコマンドを実行しています。)

$ ./bin/hubot

まだHerokuの設定をしていないのでエラーがでますが、気にせずEnterを押せば大丈夫です。
こんな感じになればok
shirakawayoshimaru1 — ec2-user@ip-172-16-0-10:~:QiitaMaruBot — ssh — 120×24 2016-04-15 12-46-18.jpg

後は、こんな感じでqiitamarubotにメッセージを送ってpongが帰って来ればokです。
qiitamarubotの部分は自分がつけたBOTの名前に適宜変えてください

qiitamarubot> qiitamarubot ping

こんな風に
shirakawayoshimaru1 — ec2-user@ip-172-16-0-10:~:QiitaMaruBot — ssh — 120×24 2016-04-15 12-47-37.jpg

これでHubot実行は終わりです。

正常に動作していればexitコマンドを実行してHubotを停止させます。

qiitamarubot> exit

4-5.動作確認テスト

実際にSlackのチャンネルに反応して、SlackのチャンネルにBOTが投稿できるか確認します。
まずはHubotをSlackと接続するコマンドを実行します。

$ ./bin/hubot --adapter slack

実行後にSlackの画面に行って、BOTがオンラインになっていればおkです。
Slack 2016-04-15 12-54-16.jpg

後はBotを招待したチャンネルに行って、「qiitamarubot ping」と打って「pong」が帰って来れば成功です。
Slack 2016-04-15 12-56-13.jpg

楽しいw

動作確認テストは以上になります。

5.Tips

Tipsでは、
5-1.ssh接続を終了した後でもBOTをオンラインにする方法
5-2.BOTを停止させる方法
を書きます。

5-1.ssh接続を終了した後でもBOTをオンラインにする方法

普通に./bin/hubot --adapter slackコマンドを打っただけだとssh接続を終了するときにBOTも終了してしまいます。
これではBOTとして不十分なのでssh接続を終了してもBOTタスクが実行され続けるようバックグラウンドでhubotを実行しましょう。
やり方は簡単で

$ nohup ./bin/hubot --adapter slack &

このコマンドを実行するだけです。
nohupと&をつけることでバックグラウンドでhubotが実行されます。

5-2.BOTを停止させる方法

nohupコマンドで実行したプロセスは明示的に終了させる必要があります。
やり方は簡単で、
1:プロセスのIDを調べる
2:プロセスをkillする
です。

まずはプロセスのIDを調べましょう。

$ ps aux | grep hubot

これで調べることができます。grepでhubotに関するプロセスのみを出力させます。

shirakawayoshimaru1 — ec2-user@ip-172-16-0-10:~:QiitaMaruBot — ssh — 112×24 2016-04-15 13-06-15.jpg
2つくらいプロセスがあると思うのですが、--adapter slackが付いている方のプロセスIDをメモります。

次にプロセスをkillさせます。

$ kill プロセスID

でkillできます。

これを実行することでhubotを停止させることができます。

以上!お疲れさまでした!!

参考url

yoでhubot作成時のエラーの対処

hubot構築に伴い、環境は AWS EC2 Amazon linux を選択しました。

構築は、下部の参考サイトにある通り、Amazon linuxの場合は、順々にインストールを進められました。

#mkdir ichigo
#cd ichigo
#yo hubot

が、yo hubot で下記エラーになりました。

Native thread-sleep not available.
This will result in much slower performance, but it will still work.
You should re-install spawn-sync or upgrade to the lastest version of node if possible.
Check /usr/lib/node_modules/yo/node_modules/yeoman-environment/node_modules/inquirer/node_modules/external-editor/node_modules/spawn-sync/error.log for more details
Native thread-sleep not available.
This will result in much slower performance, but it will still work.
You should re-install spawn-sync or upgrade to the lastest version of node if possible.
Check /usr/lib/node_modules/yo/node_modules/tabtab/node_modules/inquirer/node_modules/external-editor/node_modules/spawn-sync/error.log for more details

Error: EACCES, permission denied '/root/.config'
    at Object.fs.mkdirSync (fs.js:654:18)
    at sync (/usr/lib/node_modules/yo/node_modules/configstore/node_modules/mkdirp/index.js:71:13)
    at Function.sync (/usr/lib/node_modules/yo/node_modules/configstore/node_modules/mkdirp/index.js:77:24)
    at Object.create.all.get (/usr/lib/node_modules/yo/node_modules/configstore/index.js:38:13)
    at Object.Configstore (/usr/lib/node_modules/yo/node_modules/configstore/index.js:27:44)
    at new Insight (/usr/lib/node_modules/yo/node_modules/insight/lib/index.js:37:34)
    at Object.<anonymous> (/usr/lib/node_modules/yo/lib/cli.js:172:11)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)

エラーの原因は、rootユーザで行なっていた為でした。
ec2-user でやり直して、hubot構築完了となりました。
本来であれば、hubotユーザを作ってやるべきですね。