Hubot with AWS and Slack


Hubot を使って、Slack に発言したり S3 にファイルをアップロードしたりするのを EC2 上で動かしてみた。

EC2 インスタンスの準備

t2.small で動かしてみる。OS は Ubuntu。

SecurityGroup は取り敢えず ssh さえ通せれば良いので、その設定だけしておく。踏み台サーバがあるならば、そこからの ssh アクセスに限定しておく。

できたら ssh で入って、環境構築。

apt-get でいろいろ入れる

nodejs が無いと困るのと、hubot の brain は redis を使うのがデフォなので redis-server を入れる。github に hubot のコードを置くので git も入れる。


$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get install build-essential curl git nodejs npm redis-server -y
$ sudo apt-get install libssl-dev libexpat1-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev -y
$ sudo apt-get clean

npm でいろいろ入れる

CoffeeScript を動かす、forever でデーモン化する、Slack に連携するためのものを入れる。


$ sudo npm install -g coffee-script
$ sudo npm install -g forever
$ sudo npm install -g hubot
$ sudo npm install --save hubot-slack

node コマンド

nodejs コマンドとしてインストールされるので、node コマンドにする。そうしないと hubot が動かない。


$ sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10

Hubot を動かす

Slack の設定

トークンがないと喋れないので、環境変数にしておく。


$ export HUBOT_SLACK_TOKEN=xoxb-3849651025-QYo2sT3JQ3XJ2wVs5rMDXlYN

GitHub からコードを取ってくる

Username と Password を聞かれる。二段階認証の場合は、通常の Password ではなく、アカウントの設定画面で生成したトークンを Password に入れておく。


$ git clone https://github.com/hogehoge/fugafuga.git

npm でライブラリを入れる


$ npm install

動かす

デーモン化するなら forever コマンドを使う。あるいは、nohup でも。


$ ./bin/hubot -a slack

スクリプトを書く

Ruby で S3 にファイルをアップロードするスクリプトを書いたので、それを hubot が叩けるようにする。

Ruby の準備

dev パッケージの ruby を入れないと使えないものがあるので、それを入れる。


$ sudo apt-get install ruby1.9.1-dev -y
$ sudo gem install bundler

Gemfile

AWS-SDK for Ruby の V2 が gem install aws-sdkで入るが、まだガンガン開発中で使い勝手は V1 が良さそうなので V1 を入れる。


source "https://rubygems.org"

gem "aws-sdk-v1"

Ruby のスクリプト

S3 にアップロードするよ。
予めバケットを作っておくのと、access_key_idsecret_access_keyを用意しておく。

require 'rubygems'
require 'aws-sdk-v1'

puts "Uploading to S3 bucket..."
AWS.config(
  :access_key_id =>     '',
  :secret_access_key => ''
)
s3 = AWS::S3.new
bucket = s3.buckets['s3_bucket_name']
target = bucket.objects[filename]
target.write(file: filename)
puts "Successfully uploaded: #{target.public_url()}"
File.delete(filename)

Ruby のスクリプトを実行するスクリプト

$ ruby hogehoge.rb aaa bbb みたいなことが出来るようにする。


module.exports = (robot) ->
  robot.respond /upload/i, (msg) ->
    msg.send "Executing..."
    cp = require "child_process"
    cp.exec "ruby ./scripts/upload.rb", (error, stdout, stderr) ->
      if error
        msg.send "something went wrong \n" + stderr
      else
        msg.send "done. \n" + stdout

コマンドライン引数を渡したければ、コマンドの文字列でイイカンジに。
標準出力をそのまま Slack に渡しているので、アップロードしたファイルの URL も Slack に流れる。

まとめ

環境構築は作って壊してをしまくって疲弊したのでそのうち Docker にしたい。