Docker

研究室サーバー上のNode-Redでシステム構築

大学院でずっとIBMさんと一緒にやらせてもらっていた当時、IBM Bluemix(現IBM Cloud)の中で当時おもちゃにしていたのがNode-Redだったのだけれど、あれはとても触りやすくていい。せっかくCentOS7のサーバーがグローバル環境になったしDockerも使っていきたいしということでDockerでNode-Redを使ってみることにした。

Slack botsと連携させることでいろんな情報を引き出す軽いチャットボットを作ることにした。ゼミの時間や場所も答えてくれるし必要に応じて書類のURLも教えてくれるみたいなものにする。

環境構築

まずはDockerで環境構築。

$ docker run -d -p 1880:1880 --name mynodered -v ~/myNodeRed:/data nodered/node-red-docker

走らせるコンテナはオフィシャルのnodered/node-red-dockerを
-dはバックグラウンドで走らせるオプション
-pでポート番号を指定
–nameで名前つけておく
-vでサーバローカル上のhome/USER/myNodeRedにコンテナのデータを保存

これで走ればLinux上で
http://localhost:1880
でとりあえず表示できるようになる。グローバル上に公開しているのであれば、TCPポートの1880番を開ければ、
YOUR_GLOBAL_IP:1880
で外部アクセスができる。

この状態だとURLにアクセスしただけでパレットにアクセスできてしまうので、次にセキュリティとしてログインを実装する。

Node-RED 認証有効化
https://qiita.com/minatomirai21/items/6a7e38456bbce1de8cee

これやるだけ。
ただしDockerコンテナ上なのでそのままではいじれない。コマンドを叩くためにはコンテナが走っている状態で

docker exec -it mynodered /bin/bash

でコンテナ内のシェルを開いて操作すればいい。

docker start mynodered

Slack連携

次にSlackと連携させる。まずはSlack側にAppsを作る。
必要なワークスペースにログインした状態で、
api.slack.com
でSlack Botsを追加してAPIトークンを取得しておく。そのときにセキュリティを高めるために「許可済みの IP アドレス範囲」を設定することで、Slack APIの呼び出しのIPを制限できる。今回は研究室のLinuxサーバーのグローバルIPを指定。

Node-Red側ではSlack API用のノードが存在しているので、
[パレットの管理]→[ノードの追加]→[node-red-contrib-slack]
あたりを追加しておけばいい。最近までメンテが続いているのはこれしかない。

Slackノードslack-rtm-inのSlack Clientから「新規にslack configを追加」をして、さっきのAPIトークンを入れる。

RTMがSlackのReal Time Messaging APIなので、これのinノードを使うことで、先ほどSlack上に作ったボットからの入力を受け取ることができる。上のパレットと同じようにデバッグ用のdebugノードとつないでデプロイすることで、とりあえず入力のmsg.payloadを確認する。

こんな感じでデータが取れる。今回はmsg.payloadじゃなくmsg全体を取ってきている。

名前なんかが取れるのももちろん、管理者かどうか(is_admin)などの情報も全部取れるので、ゼミ生からの応答には情報を渡すだけ、僕からbotへのDMでは設定変更を受け付ける、なんかも全部設定ができる。なかなか便利。

とりあえず今回はこの辺までにしといてまた次に。