アインシュタインの電話番号
2011.05.07
HerokuでWebアプリ開発を始めるなら知っておきたいこと(9) Heroku以外の選択肢

「HerokuでWebアプリ開発を始めるなら知っておきたいこと」シリーズの第9回では、Herokuはとても便利だけど依存しすぎてしまうとちょっと危険だよ、という実体験について書きます。このシリーズのまとめページはこちら

4月21日に起こったAWSの大規模障害

ほんの2週間ほど前に、Amazon Web Services(AWS)に大規模障害が起きました。Twitter上でも結構ツイートされ、IT系のメディアでも大きく取り上げられたので、ご存じの方も多いと思います。

Amazon Web Servicesの障害はなぜ起こったのか - @IT Amazonクラウドの大規模障害を経て、これからは「データセンターはいつか落ちる」ことがサービス設計の前提となる - Publickey Amazon、EC2の大規模障害について正式に謝罪 10日分のサービスクレジットを提供

Herokuのプラットフォームは、AWSのEC2およびEBSを利用したサービスだったため、この大規模障害の影響をモロに食らってしまいました。

4月21日にリリースした「はてなスターカウンター」

私が個人で作っているWebアプリの最新作はてなスターカウンターは、奇しくも大規模障害の起こった4月21日にリリースしました。

はてなスターの総数を表示できる「はてなスターカウンター」を作ってみた

4月21日の午前中に公開して、昼過ぎあたりに@func09さんや@deeekiさんにリツイートしてもらえてそこからRTが徐々に広がっていき、夕方にははてな社長の@jkondoさんの目にも止まってさらにRTが広がり、順調にはてブ数も増えていき、その日の23時頃にはホッテントリの一番下に載りました。この時点(公開後10時間経過)でのはてブ数は約80、カウンター利用数は約70サイトでした。

この流れは、Nekostagramが一気に広がった時よりは劣るものの、そのときと良く似た拡散の仕方で、これはイケるかもとちょっと浮かれてました。しかし… その時、事件が起こったのです!

言うまでもありませんが、前述のAWS障害発生によりHerokuが落ちました。これからさらに多くの人に見てもらえて、使ってもらえるかもしれないと期待したまさにその時、はてなスターカウンターのサイトにまったく繋がらなくなったのでした。

そして公開後2週間以上が経過した現在は、はてブ数が約110、カウンター利用数は約80サイトに留まっています。一番大事なタイミングでサイトが落ちてしまい、完全復旧したのは約3日後だったこともあり、その後まったく広がりを見せず、はてブ数や利用者数も伸びず、とても残念な感じになってしまいました。

利用する側の立場になって考えれば当たり前のことで、公開当日にサイトが落ちて数日間繋がらなくなったカウンターサービスなど自分だったら使いたくありません…w その原因がなんであれ、このタイミングで訪問してくれた人・利用してくれた人には「不安定なWebサービス」としか映らなかったはずです。そんな状態に陥ったにも関わらず、現在もはてなスターカウンターを利用してくれているブロガーさんがいることには本当にありがたく思っています。

何が起きたか、どう感じたか、今後どうすべきか

4年に1度クラスの大規模障害が起きたプラットフォームで、その障害の当日にWebアプリをリリースしたという経験は結構貴重だと思うので、この時に何が起きて、どう感じたか、そして今後どうすれば良いと思ったか、について備忘録を兼ねて書きます。引用している自分のツイートの中には若干愚痴っぽくなっていて見苦しいところもありますが、その時のリアルな感情・感想ということでご容赦ください。

まずは、何が起きたかとどう感じたかを時系列でざっくりとまとめます。

  • 21日 11時頃

  • 21日 17時頃

  • 21日 18時頃

  • 21日 19時頃

  • 21日 21時頃

  • 21日 23時頃

  • 22日 1時頃

  • 22日 1時頃

  • 22日 8時頃

  • 22日 11時頃

  • 22日 14時頃

  • 22日 23時頃

  • 23日 2時頃

  • 24日 1時頃

独自ドメインの重要性

今回遭遇した障害によって経験したことを顧みて「今後どうすべきか」を1つだけ挙げるとしたら、可能性のあるWebアプリなら独自ドメインで運用しておくことだと現時点では思います。この「可能性」は複数の意味を含みます。個人で作った小物Webアプリで、収入の目処も無いのであれば、独自ドメインでの運用はなかなか難しく、実際自分は今までの4つはすべてHerokuのサブドメインのままで公開しています。

ただ、もし独自ドメインで運用していれば、今回の大規模障害により止まってしまった自分のWebアプリを、もっと早く復旧させる方法・選択肢は生まれていました。独自ドメインで運用していなかったので、手も足も出ない状態になったのです。

もし独自ドメインであれば、他のPaaSやVPSに環境をそっくりコピーすることが出来て、DNSの向きをサッと変えることが出来れば、自分のWebアプリを復旧させることが出来たかもしれませんでした。が、独自ドメインで無かったばっかりに、その第1歩でこれらの可能性がすべて潰れました。

また、今回の障害に限らず、アクセスが殺到する可能性があったり、長期的に運用する可能性があるWebアプリの場合は、独自ドメインで運用しておいたほうが、後々何かの対応をするときに、かなり楽になるのではないかと思いました。

例えば自分のWebアプリで言えば、今回のはてなスターカウンターがそれに該当しますが、これは利用してもらうブロガーさんに、はてなスターカウンターへのバナー(URL)を自分のブログに埋め込んでもらう仕組みです。この場合、既にHerokuのサブドメインで運用してしまっていて、利用してもらっているブログにはそのHerouのサブドメインが埋め込まれているので、もうプラットフォームを変えることが出来ません。これがもし独自ドメインで運用してあれば、プラットフォームを変えることもできるという選択肢が生まれます。

考えてみれば当たり前のことですが、今回の障害が発生して色々と振り返ってみてから、自分はこの点について気づきました。

Heroku以外の選択肢

ここでやっと、タイトルにも含まれている「Heroku以外の選択肢」という話に入ります。上述の独自ドメインにする主な理由が、プラットフォームを容易に変更できるようにするためです。ただしこれは、それほどネガティブな意味ではありません。もちろん今回のAWSの大規模障害は利用者にとっては残念な出来事でしたが、これによってクラウドが万能で無いことを気づかせてくれましたし、そのための備えをする意味合いで、他のPaaSにも目を向けるキッカケを与えてくれました。

PaaSに限らず何でもそうですが、1つの環境に依存しすぎてしまうことは、結構リスキーなことなんですよね。例えば、普段使っているネットサービスがGoogleに依存しすぎてしまっていたり、使えるOSがWindows/Macのどちらか一方だけだったり、Adobe製品を使わないと何も作り出せなくなっていたりと、思い当たるフシがいくつもあります。

で、AWSの障害が引き金になったかどうかはわかりませんが、最近やたら他のPaaSの話題を聞くようになりました。前述の引用ツイートの中でも触れているCloud Foundryをはじめ、他にもたとえばDuostackDotCloudなどです。それ以外にもNode.js用やPHP用のPaaSなども見かけましたが、今挙げた3つはすべてRubyで利用可能です。中でも、Duostackの操作体系はかなりHerokuに似ていて、Herokuユーザーが利用するのはおそらく簡単だろうと@jishihaさんに教えてもらいました。

自分はまだHerokuにドップリ依存していて、他のPaaSもVPSも触ったことがありません。少し前に上述のPaaSへの登録を済ませて、これから触ってみようという段階です。これらを障害対策として考える場合は、そのPaaSが利用しているサービスがAWSかどうかなども考慮する必要がありますが、とりあえずは色々触ってみて使いやすさで考えてみたいですね。今後試したらこのブログにその過程を備忘録していくつもりです。

まとめ

今回のシリーズを通して力説してきたとおり、Herokuはとても便利で魅力的ですが、それしか使えないのは、障害や何かしらの問題が起きたときに対応できる選択肢が無いに等しいことになります。これはHerokuが良い悪いの話ではなく、使う側の問題です。これからHerokuでWebアプリ開発を始めよう、という段階であればまだ意識する必要はありませんが、今回の大規模障害があったことからもわかるように、他の選択肢を考慮することはいずれ考えなければならないことです。Herokuを使うことでPaaSというものをある程度理解できたら、他のPaaSやPaaS以外の環境も触ってみて、できれば障害時の対策まで出来るようになるといいなぁという自戒を込めたエントリーでした。


今回は、Herokuはとても便利だけど依存しすぎてしまうとちょっと危険だよ、という実体験と、その対策として他のPaaSも視野に入れたいことについて書きました。次回は最終回、自分がこれまでのHerokuアプリを作成した上で参考になったサイトやページのリンク集を載せたいと思います。