SlackからHubotを経由してDBを参照する

こんにちは、95(くごー)です。前回の記事にも書きましたが、私のチームではタスクのご褒美にマクベ似のBOSSから黒糖を頂けます。多分この記事のご褒美に頂けるかと思うんですが。。。
さて、今回はSlackからでデータベースの値を簡単に取得してみようという記事になっています。

対象

非エンジニアでも特定のコマンドを実行する事でデータベースにある最新情報を取得する仕組みを作ります。そのような事をしたい方は是非参考にしてください。

今回行うこと

過去に平尾さんがSlackからHubot経由でサーバのシェルを実行しました。これを利用して今回はSQLを実行します。

環境

CentOS 6.4

構成図

f:id:kugor9595:20150930225740p:plain 実行するSQLはシェルに直接記述しています。これは特定のSQLのみを実行させる役割があり、余計な処理をさせないためにそうしています。また、出力もSlack上に残していいような内容に加工しましょう。

実行

bot用のディレクトリを作成したらシェルを実行するスクリプトを作成します。

vim scripts/hoge.coffee
module.exports = (robot) ->
 robot.respond /test_shell/, (msg) ->
    @exec = require('child_process').exec
    command = "sh /home/vagrant/mybot/scripts/shell/test.sh"
    @exec command, (error, stdout) ->
      msg.send error if error?
      msg.send stdout if stdout?

次に実行するシェルを作成します。

mkdir scripts/shell
vim  scripts/shell/test.sh

test.sh

#!/bin/bash
mysql -u <ユーザー名> -h <DBサーバアドレス> -p<パスワード> <データベース名> -e "SELECT id, animal_name FROM animals;"

Hubotを起動

HUBOT_SLACK_TOKEN=<API_TOKEN> ./bin/hubot --adapter slack

実行結果

特定のチャンネルでtest_bot: test_shellと実行してください。 f:id:kugor9595:20150928205339p:plain
実行できました。これを使えば、その日の予約件数や売上など最新情報を取得する仕組みが簡単になりますね。

セキュリティに関して

Slackからデータベースの値を参照する今回の仕組みですが、プロジェクトなどの特性により、様々なセキュリティを考慮する必要があります。この記事をレビューしたところ、社内で色々あげてもらえたので参考にして頂ければと思います。

DBサーバへの外部アクセス

Hubotのサーバがデータベースにアクセスし、外部からのアクセスは許可しない構成にしましょう。

Hubotのサーバのアクセス制御

特定のIPのみ許可するなど基本的な制御でいいと思います。

クエリーの結果がSlackに残る

(1) Slackという社外のサービスに流しても良いデータか否か
(2) チャンネルにクエリの取得結果を残しておくことにより、見るべきでない他のユーザーから見えてしまう可能性はないか
という2点について別個に検討する必要があります。

シェルの実行権限

セキュリティを強化するためにシェルの実行権限も制御する必要があります。今回は行っていませんが、一つの例としてAPIコードのようなものを発行し、ユーザー特定のできるような仕組みが望ましいです。

実行する上での情報表示の秘密度やSlackチャンネルの秘密度などによって、セキュリティを考慮する範囲は変わるかと思いますが上記を参考に実行してください。

さいごに

私のSlackのアイコンは赤い彗星です。