LoginSignup
2
3

More than 5 years have passed since last update.

Hubot with AWS and Slack

Posted at

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 にしたい。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3