Heroku の オートスケーリングを GoogleAppEngine からやるアプリを作ったんだけど上手くいかなかったよというお話

(この記事は Ruby Advent Calendar jp:2010 の 17 日目です。前日は jugyo さんでした。)

Rubyホスティングといえば、最近は Salseforce.com に買収された Heroku や GoogleAppEngine for jruby などがPaaS的なものとしては有名ですね。

Herokuは大好きなのですが、個人的に一歩足りないと思っているところは、簡単にスケールできるようになっているのに自動でスケールしないところです。そんなところを考えて、前回ブログで NewRelicRPM という Heroku の Add-on のパフォーマンスモニタリングサービスのデータを使って、Herokuのプロセス(dyno)数を制御するというスクリプトを紹介しました。

今回は、そのスクリプトをサービス化してみようと考えて取り組んだお話です。

そのサービスを作るに当たって、やっぱりホスティング先を考えないといけません。今回のサービスは定期的にモニタリングデータを取得してdynoの数を調整するアプリになります。つまり、自由に定期Jobを行う必要があるんですね。その場合、私の好きなHerokuでやろうとすると、自由度がなく費用がかかりそうでした。Herokuの定期Jobはcronですが、一日ごと(無料)と1時間ごと($5/month)となっているからです。Rescue::Sceduleという手段もあるみたいなんですが、$36と高い。

そこで、次の候補です。GoogleAppEngine for jruby ですね!AppEngineはかなり柔軟に定期Jobをcronで設定できますし、無料で出来る幅も大きそうです。ということで、GoogleAppEngineでやってみることにしました。

ちょっと GAE for jruby を利用したときは、なかなか面倒だった記憶があるのですが、今回つくってみると意外に良い感じでした。 google-appengine のgemをインストールして以下のコマンドを叩くとアプリの基板が完成します。

$ appcfg.rb generate_app heroku-autoscale-on-gae

今回は非常にシンプルなアプリなのでSinatraで作成します。モニタリングするアプリ一覧表示する画面と登録アクション、最後にcronが叩く実際にNewRelicやHerokuにアクセスして調整を行うアクションですね。モデルもアプリだけです。非常にシンプルですね。
コードは以下にオープンソースにしました。動かして楽しんでもらえるといいと思います。

https://github.com/mataki/heroku-autoscale-on-gae

実際にローカルで動かしてもらえるとおそらく動くのではないかと思います。

$ appcfg.rb bundle .
$ dev_appserver.rb .

注意点としては、HerokuがAPIっぽいのに最近対応しているんですが、まだパスワードを平文でDBに保持しています。あと、NewRelicのAPIキーはAdd-onをインストールして以下のコマンドで表示される NEW_RELIC_LICENSE_KEY です。

$ heroku config --long

ローカルでは上手く動いた heroku-authoscale-on-gae ですが、最後に落とし穴が待っていました。なんと!!! GoogleAppEngine の本番で動作させると Heroku の API がなんと503を返し続けるのです。
そう、おそらくライバルのAppEngineからのリクエストは拒否しているんでしょう。なんということでしょう。せっかくHerokuの為に作ったのに最後の最後でHerokuに拒否されるとは。。。

そして、最後にさらに頑張って作っているさなかHeroscaleというサービスが公開されました。やりたいことは正に一緒で、手段はちょっと違いますがおそらく同じことが出来るでしょう。

https://www.heroscale.com/

かしこい皆さんは、こちらのサービスをご利用ください。

以上、これまでのRubyAdventCalenderのブログとは毛色が違いますが、「こんなん作りました」というブログでした。