IBM BluemixのRedisをつかってみる

概要

Slack接続用のhubotをBluemix上で動かし、hubotのデータ保存先としてRedisを使ってみた手順を紹介します。

BluemixのRedisは実験的なリリースのようですが、2015年8月1日現在、無料で利用できます。

事前準備

以降の手順は、Node.js導入済みで、cfコマンドでBluemixにログイン済みの想定で記載しています。
それぞれの手順については以下のサイト等が参考になります。

Bluemixにhubotをデプロイ

hubotの作成

yoとgenerator-hubotを使ってslack用のhubotの雛形を作ります。
途中、Bot adaptorを何にするか聞かれるので slack と入力します。

$ 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用トークンを記述します。

applications:
- name: bm-bot
  env: HUBOT_SLACK_TOKEN: xoxb-16777216-9r3wQlg81Sg-p72Yw3jFkrCh

※ nameは各自で被らない名前を設定します
※ このSlackトークンは偽物なので、各自取得した値を設定してください。
※ トークンを記載したmanifest.ymlはGitHub等のパブリックなリポジトリにpushしないようご注意ください。
※ hubot用のトークンはSlackのインテグレーションページから取得できます。

Bluemixにデプロイ

この状態で cf push コマンドでデプロイするとhubotが動きます。

$ 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(無料)で作成するコマンドは以下の通り。

# 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へバインドします。

$ 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にバインドされていることが確認できます。

$ 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形式で格納されています。

$ 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://8e80edfa-170a-8871-1205-4e5bd93a6873@192.168.196.224:6789/

アプリの環境変数を設定

この値をBluemixのbm-botアプリの環境変数に設定します。

cf set-env bm-bot REDIS_URL redis://8e80edfa-170a-8871-1205-4e5bd93a6873@192.168.196.224:6789/

環境変数を確認

$ cf env bm-bot
...
User-Provided:
HUBOT_SLACK_TOKEN: xoxb-16777216-9r3wQlg81Sg-p72Yw3jFkrCh
REDIS_URL: redis://8e80edfa-170a-8871-1205-4e5bd93a6873@192.168.196.224:6789/

No running env variables have been set

No staging env variables have been set
...

Redisへの接続確認

REDIS_URL設定前

以下はREDIS_URL設定前のアプリ起動時のログですが、この時点ではhubot-redis-brainは環境変数がないためlocalhostにつなぎにいっていました。

$ 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で環境変数を有効化すると

$ 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 コマンドで削除できます。

$ 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)

スポンサーリンク
レクタングル(大)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
レクタングル(大)