Hubot
AWS
Slack

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

More than 3 years have passed since last update.

スクリーンショット 2014-08-16 14.16.42.pngスクリーンショット 2014-08-16 14.22.19.pngスクリーン<br>
<br />ショット 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




    • セキュリティグループの設定で、HTTP の 80番ポートへのアクセスを許可してください。



      • 本当はポート番号を変えたかったのですが、ELB(Elastic Load Balancing)か何かを使わないと、EC2 単体では 80番から変更できないようです.. 追記: Type で TCP を選択すれば、任意のポート番号で HTTP通信できるようです。


      • 接続元の IP も、本当は絞りたいところですが、Slack 経由のアクセスになってしまうから絞るのは難しい?

        スクリーンショット 2014-08-16 0.17.33.png








手順

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


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



  • 下記コマンドを実行。

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

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




  • 確認してみます。

    $ node -v
    
    v0.10.29

    $ npm -v
    
    1.3.6



Hubot、CoffeeScript をインストール



  • 下記コマンドを実行。

    $ sudo npm install -g hubot coffee-script
    



  • 確認してみます。

    $ hubot -v
    
    2.8.0

    $ coffee -v
    
    CoffeeScript version 1.7.1



Redis をインストール



  • 下記コマンドを実行。

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



  • 起動します。

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

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




Hubot を作成

以降、$ sudo -s で root ユーザになり作業します。

(理由:個人ユーザだと、Node.js が起動した際に、外部からの HTTPリクエストを listen できなかったため.. Node.js 詳しくないけど、やり方はあるのかな?)



  • 下記コマンドを実行。

    # hubot --create test_bot
    



  • 動かしてみます。

    # cd test_bot
    
    # bin/hubot

    上記の bin/hubot は中身をみるとスクリプトファイルで、中で npm install が走っている模様。

    いろいろインストールされましたが、終わると次のようにプロンプトが表示されます。

    Hubot> 
    

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

    Hubot> hubot ping
    
    Hubot> PONG

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




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



  • 下記コマンドを実行。

    # 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



  • 環境変数が 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



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



Hubot の起動



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

    # 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 を起動。

    # 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






動作確認

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

スクリーンショット 2014-08-16 0.09.37.png

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


注意:

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



おわりに

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