IK.AM

@making's tech note


HubotをCloud Foundryにデプロイする

🗃 {Service/PaaS/CloudFoundry}
🏷 Cloud Foundry 🏷 Hubot 
🗓 Updated at 2016-01-15T00:42:46Z  🗓 Created at 2016-01-14T17:18:51Z   🌎 English Page

HubotをCloud Foundryにデプロイします。 公式サンプルはHerokuを使っているけど、Herokuの無料枠で無理やり動かすハックが入っていて気持ちが悪いです。ここはCloud Foundryを使いましょう。

この記事ではPivotal Web Servicesを使いますが、他のCloud Foundryでも大体同じです。

$ cf login -a api.run.pivotal.io

(Cloud Foundry CLIについてはこちらの記事を参照。)

まずは雛形プロジェクト作成。今回はSlackと連携する例を紹介します。

$ npm install -g yo generator-hubot
$ mkdir demohubot
$ cd demohubot/
$ yo hubot --adapter slack --defaults
デフォルト値を使いたくない場合は--defaultsを外して対話的に値を入力してください

デフォルトではHeroku用ハックが入っているため、それを削除します。package.jsonexternal-scripts.jsonから"hubot-heroku-keepalive"の行を削除してください。

  • package.json
     "hubot-help": "^0.1.3",
-    "hubot-heroku-keepalive": "^1.0.2",
     "hubot-maps": "0.0.2",
  • external-scripts.json
   "hubot-help",
-  "hubot-heroku-keepalive",
   "hubot-google-images",

デプロイ後の実行コマンドは生成されているProcfileがそのまま使えますので、あとはcf pushするだけです。buildpackにはNode.jsが自動で選択されます。

$ cf push demohubot -m 256m --no-start

ここではアプリケーション名をdemohubotにしています。 メモリは小さければ小さいほど安く運用できますが、小さくすぎるとメモリ不足で起動しないので256MBを指定しました。もう少し削れるかもしれません。 後で環境変数を設定するのでいったん--no-startをつけてアプリケーションのアップロードだけ行います。

次にSlackと連携します。

チーム名をクリックして、「Apps & Custom Integratio...」を選択、

スクリーンショット 2016-01-15 1.41.46.png

「Configure」をクリック、

image

「Hubot」を検索(InstallされていなかったらInstall)して、「Hubot」をクリック。

image

「Add Configuration」をクリック、

image

「Username」を入力して、「Add Hubot Integration」をクリック

image

APIトークンをコピーしてください。

image

コピーしたトークンをcf set-envで環境変数HUBOT_SLACK_TOKENに設定します。

$ cf set-env demohubot HUBOT_SLACK_TOKEN <APIトークン>

次に、Hubotのメッセージを保存するRedisを用意します。

Pivotal Web Servicesではrediscloudというサービスの30mbというプランを無料で利用できます。 このプランでhubot-redisというサービスを作成して、demohubotにバインドします。

$ cf create-service rediscloud 30mb hubot-redis
$ cf bind-service demohubot hubot-redis

cf envで環境変数が追加されていることがわかります。

$ cf env demohubot

System-Provided:
{
 "VCAP_SERVICES": {
  "rediscloud": [
   {
    "credentials": {
     "hostname": "pub-redis-xxxxx.us-east-a-b.c.ec2.garantiadata.com",
     "password": "aaaaaaaaaaaaaa",
     "port": "17510"
    },
    "label": "rediscloud",
    "name": "hubot-redis",
    "plan": "30mb",
    "tags": [
     "Data Stores",
     "Data Store",
     "Caching",
     "Messaging and Queuing",
     "key-value",
     "caching",
     "redis"
    ]
   }
  ]
 }
}

HubotにRedisのURLを知らせるためにREDIS_URLをいう環境変数を設定する必要があります。本当はバインドされた環境変数を(JSON加工などして)直接使うのが良いのですが、ここでは設定されたRedisのホスト名とパスワードを見てREDIS_URLni ハードコードしてしまいます・・(要改善)

$ cf set-env demohubot REDIS_URL redis://aaaaaaaaaaaaaa@pub-redis-xxxxx.us-east-a-b.c.ec2.garantiadata.com

以上で設定完了です。アプリを起動するのみ。

$ cf start demohubot

cf logs demohubot --recentで次のようなログが出ていればOKです。

2016-01-14T16:34:24.000+00:00 [APP] OUT [Thu Jan 14 2016 16:34:24 GMT+0000 (UTC)] INFO Slack client now connected
2016-01-14T16:34:24.000+00:00 [APP] OUT [Thu Jan 14 2016 16:34:24 GMT+0000 (UTC)] INFO hubot-redis-brain: Discovered redis from REDIS_URL environment variable

あとはSlackでHubotをチャネルにinviteしてください。

image

基本的なデプロイ方法は以上の通りです。Hubotをカスタマイズして再度cf pushしてください。

256MBだと無償期間(60日)後は$5.40/monthがかかります。もうちょいメモリを削れるはず・・


✒️️ Edit  ⏰ History  🗑 Delete