概要
Slack接続用のhubotをBluemix上で動かし、hubotのデータ保存先としてRedisを使ってみた手順を紹介します。
BluemixのRedisは実験的なリリースのようですが、2015年8月1日現在、無料で利用できます。
事前準備
以降の手順は、Node.js導入済みで、cfコマンドでBluemixにログイン済みの想定で記載しています。
それぞれの手順については以下のサイト等が参考になります。
- IBM Bluemixへの登録
IBM developerWorks 日本語版 : IBM Bluemix - CFコマンドのインストール
CloudFoundry の cf コマンドラインツールをインストールする - IBM Bluemixへのログイン
Cloud Foundry V2系サービス(Cloudn PaaS, Bluemix)にRailsアプリをデプロイする
Bluemixにhubotをデプロイ
hubotの作成
yoとgenerator-hubotを使ってslack用のhubotの雛形を作ります。
途中、Bot adaptorを何にするか聞かれるので slack
と入力します。
1 2 3 4 5 6 7 |
$ npm intall -g yo generator-hubot # 必要であればsudo $ mkdir bm-bot && cd bm-bot $ yo hubot ... # Bot adaptorについてはslackを入力し後は適当に答える ... |
この状態で、 npm install && ./bin/hubot
とすることで、ローカルでボットを試せます。
manifest.ymlの作成
manifest.ymlを作成し、アプリ名およびSlackのhubot用トークンを記述します。
1 2 3 4 |
applications: - name: bm-bot env: HUBOT_SLACK_TOKEN: xoxb-16777216-9r3wQlg81Sg-p72Yw3jFkrCh |
※ nameは各自で被らない名前を設定します
※ このSlackトークンは偽物なので、各自取得した値を設定してください。
※ トークンを記載したmanifest.ymlはGitHub等のパブリックなリポジトリにpushしないようご注意ください。
※ hubot用のトークンはSlackのインテグレーションページから取得できます。
Bluemixにデプロイ
この状態で cf push
コマンドでデプロイするとhubotが動きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$ cf push Using manifest file /path/to/bm-bot/manifest.yml ... requested state: started instances: 1/1 usage: 1G x 1 instances urls: bm-bot.mybluemix.net package uploaded: Thu Jul 30 22:57:19 UTC 2015 stack: lucid64 buildpack: SDK for Node.js(TM) (ibm-node.js-0.10.40) state since cpu memory disk details #0 running 2015-07-31 07:58:43 AM 4.5% 74.7M of 1G 39.8M of 1G |
最後に上記のような出力がされていればデプロイ成功です。この状態でhubotとして動作しますが、設定や状態を保持するようなscriptのデータはhubotの再起動時に消えてしまいます。
herokuであれば、Redis To Goなどでデータを保存していることが多いかと思いますが、IBM BluemixでもRedisを利用してデータの永続化が可能です。
BluemixにRedisのサービスを作成する
IBM BluemixのRedisサービスは、 cf create-service
コマンドで作成できます。
Redisサービスをknjcode-redisという名前でplan 100(無料)で作成するコマンドは以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# Redisサービスを作成 $ cf create-service redis 100 knjcode-redis Creating service instance knjcode-redis in org knjcode@gmail.com / space dev as knjcode@gmail.com... OK # サービスを確認 $ cf services Getting services in org knjcode@gmail.com / space dev as knjcode@gmail.com... OK name service plan bound apps last operation knjcode-redis redis 100 create succeeded |
サービスをアプリにバインドする
作成したRedisサービスを先ほど作ったbm-hubotへバインドします。
1 2 3 4 5 |
$ cf bind-service bm-bot knjcode-redis Binding service knjcode-redis to app bm-bot in org knjcode@gmail.com / space dev as knjcode@gmail.com... OK TIP: Use 'cf restage' to ensure your env variable changes take effect |
もう一度サービスを確認すると、bm-botにバインドされていることが確認できます。
1 2 3 4 5 6 7 |
$ cf services Getting services in org knjcode@gmail.com / space dev as knjcode@gmail.com... OK name service plan bound apps last operation knjcode-redis redis 100 bm-bot create succeeded |
Redisを利用するための環境変数を設定する
VCAP_SERVICES環境変数の確認
バインドしたRedisサービスの情報はアプリの環境変数のVCAP_SERVICESにJSON形式で格納されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
$ cf env bm-bot Getting env variables for app bm-bot in org knjcode@gmail.com / space dev as knjcode@gmail.com... OK System-Provided: { "VCAP_SERVICES": { "redis-2.6": [ { "credentials": { "host": "192.168.196.224", "hostname": "192.168.196.224", "name": "60202a3c-00cb-9661-df7c-ef074d7496f2", "password": "8e80edfa-170a-8871-1205-4e5bd93a6873", "port": 6789 }, "label": "redis-2.6", "name": "knjcode-redis", "plan": "100", "tags": [ "key-value", "nosql", "web_and_app", "ibm_experimental" ] } ] } } ... |
※ IPや各種IDはランダム値に書き換えてます
hubot-redis-brain用の環境変数を設定
Redisを使ってhubotのrobot.brainのデータを保存できるhubot-redis-brain(yoで作成したhubotには最初から入っています)は、 REDIS_URL
環境変数からRedisへの接続情報を取得し、hubotからRedisにデータを保存できるようにしてくれます。
REDIS_URLは、
- authentication
- hostname
- port
- key prefix
からなります。
REDIS_URLの決定
上記のVCAP_SERVICESの情報から環境変数を組み立てます。prefixなしで作成すると以下のようになります。
REDIS_URL=redis://[email protected]:6789/
アプリの環境変数を設定
この値をBluemixのbm-botアプリの環境変数に設定します。
1 2 |
環境変数を確認
1 2 3 4 5 6 7 8 9 10 11 |
$ cf env bm-bot ... User-Provided: HUBOT_SLACK_TOKEN: xoxb-16777216-9r3wQlg81Sg-p72Yw3jFkrCh No running env variables have been set No staging env variables have been set ... |
Redisへの接続確認
REDIS_URL設定前
以下はREDIS_URL設定前のアプリ起動時のログですが、この時点ではhubot-redis-brainは環境変数がないためlocalhostにつなぎにいっていました。
1 2 3 4 5 6 7 8 9 |
$ cf logs bm-bot --recent # ログ抜粋 ... [Thu Jul 30 2015 14:42:26 GMT+0000 (UTC)] INFO Connecting... [Thu Jul 30 2015 14:42:27 GMT+0000 (UTC)] INFO Logged in as bm-bot [Thu Jul 30 2015 14:42:27 GMT+0000 (UTC)] INFO Slack client now [Thu Jul 30 2015 14:42:28 GMT+0000 (UTC)] INFO hubot-redis-brain: Using default redis on localhost:6379 |
REDIS_URL設定後
cf restageで環境変数を有効化すると
1 2 3 4 5 6 7 8 9 10 11 |
$ cf restage bm-bot ... $ cf logs bm-bot --recent # ログ抜粋 ... [Thu Jul 30 2015 15:06:05 GMT+0000 (UTC)] INFO Connecting... [Thu Jul 30 2015 15:06:05 GMT+0000 (UTC)] INFO Logged in as bm-bot [Thu Jul 30 2015 15:06:06 GMT+0000 (UTC)] INFO Slack client now [Thu Jul 30 2015 15:06:06 GMT+0000 (UTC)] INFO hubot-redis-brain: Discovered redis from REDIS_URL environment variable |
この後、いくつかデータ保存するようなhubotのスクリプトを試してみましたが、問題なく動作しました。
BluemixのRedisは外部からアクセスできない
HerokuのRedis To Goは外部からRedisに接続可能ですが、BluemixのRedisは外部からは接続できずバインドしたアプリケーションからしかアクセスできないようです。(セキュリティ的にはアプリケーション以外からは接続できないほうがよいと思います)
既存のRedisからデータを移行したい場合には、アプリから必要なデータをRedisに保存するコードを書くか、tmate buildpackなどでBluemixのアプリにssh接続し、Redisに接続する等する必要があります。
Bluemix Redisの利用をやめる
Bluemix Redisの利用を利用しなくなってサービスを削除したい場合は、 cf unbind-service
コマンドでRedisサービスをアプリから切り離し、 cf delete-service
コマンドで削除できます。
1 2 3 |
$ cf unbind-service bm-bot knjcode-redis $ cf delete-service knjcode-redis |
参考
CloudFoundry の cf コマンドラインツールをインストールする
Cloud Foundry V2系サービス(Cloudn PaaS, Bluemix)にRailsアプリをデプロイする
Getting started with Redis (Experimental)