こんにちは、95(くごー)です。前回の記事にも書きましたが、私のチームではタスクのご褒美にマクベ似のBOSSから黒糖を頂けます。多分この記事のご褒美に頂けるかと思うんですが。。。
さて、今回はSlackからでデータベースの値を簡単に取得してみようという記事になっています。
対象
非エンジニアでも特定のコマンドを実行する事でデータベースにある最新情報を取得する仕組みを作ります。そのような事をしたい方は是非参考にしてください。
今回行うこと
過去に平尾さんがSlackからHubot経由でサーバのシェルを実行しました。これを利用して今回はSQLを実行します。
環境
・CentOS 6.4
構成図
実行する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と実行してください。
実行できました。これを使えば、その日の予約件数や売上など最新情報を取得する仕組みが簡単になりますね。
セキュリティに関して
Slackからデータベースの値を参照する今回の仕組みですが、プロジェクトなどの特性により、様々なセキュリティを考慮する必要があります。この記事をレビューしたところ、社内で色々あげてもらえたので参考にして頂ければと思います。
DBサーバへの外部アクセス
Hubotのサーバがデータベースにアクセスし、外部からのアクセスは許可しない構成にしましょう。
Hubotのサーバのアクセス制御
特定のIPのみ許可するなど基本的な制御でいいと思います。
クエリーの結果がSlackに残る
(1) Slackという社外のサービスに流しても良いデータか否か
(2) チャンネルにクエリの取得結果を残しておくことにより、見るべきでない他のユーザーから見えてしまう可能性はないか
という2点について別個に検討する必要があります。
シェルの実行権限
セキュリティを強化するためにシェルの実行権限も制御する必要があります。今回は行っていませんが、一つの例としてAPIコードのようなものを発行し、ユーザー特定のできるような仕組みが望ましいです。
実行する上での情報表示の秘密度やSlackチャンネルの秘密度などによって、セキュリティを考慮する範囲は変わるかと思いますが上記を参考に実行してください。
さいごに
私のSlackのアイコンは赤い彗星です。