読者です 読者をやめる 読者になる 読者になる

euphonictechnologies’s diary

Haskell超初心者の日記です。OCamlが好きです。

follow us in feedly

Haskell :: Snap + HerokuでRedisを使う - herokuへデプロイしてRedis Cloudと接続する

Haskell Heroku Snap Redis

前回までのあらすじ

前回はherokuへデプロイする予定のアプリケーションをローカルで作成し、ローカルのRedisと接続してデータの読み書きができることを確認しました。

今回はそのアプリケーションをherokuへデプロイしてRedis Cloudとワークさせるための設定をします。

Redis Cloudプラグインをheroku上でインストールしてRedis Cloudを使えるようにする

今回はherokuで使えるRedisプラグインの内Redis Cloudを使います。理由は

  • Freeで使える要領が30MBと他より少し多い
  • Redis Cloudという外部サービスなのでherokuに囲い込まれなさそう
  • 外部サービスなのでheroku内部からのアクセスでなくともテスト可能

といったところでしょうか。今回のアプリケーションはRedis Cloud依存の部分は全くないのでどのRedisプラグインでも問題ありません。

ここに公式マニュアルがあるので、それに従ってプラグインを追加します。

devcenter.heroku.com

色々書いてありますがやることは2つ。プラグインを追加して接続のための情報をゲットします。

プラグインの追加

CLIからやるのがクールなのでしょうがゆとり世代なのでウェブの管理アプリからやります。

アプリのResourcesページでプラグインを追加します。

https://devcenter.heroku.com/articles/rediscloudf:id:euphonictechnologies:20150805000336p:plain

こんな感じ。Saveで追加完了です。

追加されたかどうか確認しましょう。

$ heroku addons
=== Resources for firstsnap
Plan           Name                Price
-------------  ------------------  -----
rediscloud:30  singing-coyly-0000  free

=== Attachments for firstsnap
Name        Add-on              Billing App
----------  ------------------  -----------
REDISCLOUD  singing-coyly-0000  firstsnap

こんな感じで準備万端です。

Redis Cloudの管理ページで接続情報を確認する

接続情報というのはつまりhost, port, そしてauthのことです。

$ heroku addons:open rediscloud

としてRedis Cloudの管理ページに飛びましょう。

f:id:euphonictechnologies:20150805001131p:plain

こんな感じで表示されるはずです。リストのデータベースをクリックして詳細情報を確認しましょう。

f:id:euphonictechnologies:20150805001138p:plain

黒塗してある部分がホストとポート。パスワードは初期パスワードから変更してローカルのものに合わせてみました。

これらでアクセスすればRedis Cloudがherokuで利用可能なはずです。

Redis CloudをローカルのMacからCLIで触って動くことを確認する

念の為にredis-cliを使ってRedis Cloudに対してテストをしてみましょう。

$ redis-cli -h pub-redis-XXXX.us-east-1-3.X.ec2.redislabs.com -p XXXX -a foobared
pub-redis-XXXX.us-east-1-3.X.ec2.redislabs.com:XXXX> ping
PONG
pub-redis-XXXX.us-east-1-3.X.ec2.redislabs.com:XXXX> set test1 "welcome redis cloud!"
OK
pub-redis-XXXX.us-east-1-3.X.ec2.redislabs.com:XXXX> get test1
"welcome redis cloud!"

pingとset, getを試してみました。動いていますね。

Redis Cloud上のRedisにローカルのSnapウェブアプリから接続する

これは簡単ですね。devel.cfgに設定をします。ローカルのテストのためにセッション名を変えてローカルRedisの設定も残しておくとあとで楽ちんです。

redis {
    host = "pub-redis-XXXX.us-east-1-3.X.ec2.redislabs.com"
    port = XXXX
    auth = "foobared"
    max_connections = 10
    max_idle_time = 100
}

redis_local {
    host = "localhost"
    port = 6379
    auth = "foobared"
    max_connections = 10
    max_idle_time = 100
}

これで```cabal run -- -p 8080````してローカルのアプリから接続してテストしてみましょう。

ログインするとshow_dataできちんと表示されました。

f:id:euphonictechnologies:20150806235235p:plain

herokuにデプロイしてheroku上のSnapウェブアプリからRedis Cloud上のRedisに接続する

これですべての準備が完了しました。

これをすべてcommitしてgit push heroic masterして完成です。

成果物

github.com

次回は

こんな素敵な記事を見つけてしまいました:

nurpax - AngularJS with Haskell

SnapにAngularJSを組み合わせてTodoリストをつくるという内容なのですが、次回はSnap+Redis+AngularJSに挑戦してみます。