Ruby on Rails on Windows Azure (1)

このところ、色々なことがありまして、Blogも更新していませんでした。タイトルにあるようにRubyをWindows Azureのコンピュート サービスで動かすにはどうしたら良いか、ということについて、何回かにわけて書いて行こうと思います。そもそものきっかけは、7月にあったRuby会議2011の約10日前に秋葉原の某所で開催されたミーティングに参加したことでした。このミーティングの主題は、Ruby on RailsアプリケーションをAzureで動かしてみたら遅かったので、Windows上のRubyは遅いのではないかという話から、実際にベンチマークなどを計測して検証しようというものでした。このミーティングの中で、artonさんが作成されている能楽堂(NougakuDo)というx64 Windows用のRuby on Railsの開発環境を使ってベンチマークを計測しているという話がでました。ミーティング終了後に食事をしながら、能楽堂をAzureに配置して動作させるというホワイトペーパーを作成できませんかという話が出ました。この話がきっかけになって、実際にAzureへ配置した場合にデータベースをどうしたら良いかという検討を私がしました。ここで考えられるのが、次の2種類になります。

  • SQLite:能楽堂にバンドルされている。
  • SQL Azure:何が使えるかは、調べなきゃいけません。

SQLiteを採用した場合の問題点を考えると、Windows Azureがステートレス サーバーであるためデータベース ファイルなどの維持をどうするかという点に行きつきます。また、複数インスタンス(サーバー)を起動した場合にデータの一元管理をどうするかという問題も考えなければなりません。そこで、SQL Server用に使用できるActiveRecord用のAdapterがないかと探してみた結果、activerecord-sqlserver-adapterが見つかりました。このadapterの説明を読むと、SQL Azureにも対応していて今回の用途に使えそうなので、必要なモジュールを調べると以下のものが必要であることがわかりました。

  • TinyTDS:RubyからDB-Libraryを使用するためのモジュール
  • FreeTDS:UNIXやLinuxからSQL ServerやSybase databaseへ接続するためのプロトコルであるTDSの実装モジュール

この2つのモジュールのインストール方法を調べると、x86向けばかりで、このままではx64環境である能楽堂で使用することができません。そこで、artonさんにお願いして能楽堂へバンドルして頂いたのが、NougakuDo 1.0.2になります。この作業と並行して、Azureのコンピューティング サービスへ手動で能楽堂を配置して、Ruby on Railsアプリケーションを作成して、問題なく動作するのを確認していました。確認作業は、以下のような方法をとりました。

  • 実装のないWorkerロールのパッケージを配置。
  • リモートデスクトップで接続して、次の作業を実施。
  • 能楽堂のインストール。
  • Ruby on Rails アプリケーションの作成と動作確認。

Azure上で能楽堂の動作に問題がないことが確認できれば、次は能楽堂で作成したRailsアプリケーションをAzure上へ配置する方法の検討を行いました。検討したことは次のような目標です。

  • Azure のマルチインスタンスへ対応する
  • Railsアプリケーションのアップデートができる
  • 能楽堂のアップデートができる
  • Railsアプリケーションの再起動を含めた運用管理ができる。

あまり参考にしていないのですが、Smarx roleなどもありましたが、私が考える上記のような目標を達成できないので、目標を実現するための実装方法の検討と最小限度のコンセプトプログラムを作成しました。この作成を何とかRuby会議2011までに作成したのが、NougakuDo Companion の最初のバージョンになります。NougakuDo Companion の説明は、次以降のエントリーを考えていますが、能楽堂の特徴を簡単に説明します。

  • x64 対応の Ruby 1.9系で、MSVCRT(Visual C++ 2010)対応。
  • Ennou という http.sysを使用する Web サーバーを Rackハンドラーとして提供。
    仮想ホスト機能(https://host/)とサブディレクトリー機能(https://host/application/)を提供。
  • Rails 3.1という最新環境に対応(1.0.5は、Rails 3.0対応)。
  • Railsに必要なgemパッケージをオールインワンで提供(オフライン開発が可能)。
  • SQL Server用のアダプターをバンドル。

上記に挙げた特徴で、特に素晴らしいと考えているのが Ennou の存在です。Ennouがあれば、IIS との共存も可能ですし、何よりもWindows Upadteだけでパッチを管理することができます。つまり、LinuxではなくWindowsを使う上での運用管理の工数を限りなく、最小限にできるのです。必要なソフトウェアが少なければ、保守対象が削減できますので、仮に脆弱性が発見されたとしても、対策が少なくて済むというメリットを享受することができますから、Railsアプリケーションを運用する上で能楽堂は素晴らしいRailsの開発環境だと言えます。また、Ennouによる効果はこれだけではありません。http.sysを使うことで、x64 Windows のIISと同等の性能を引き出すことが可能になります。つまり、Web アプリケーションとして高速という特徴を持ちます。まさに、WindowsでRailsを運用するのであれば、素晴らしいという言葉以外は思い当たらないのです。欠点があるとすると、使用するgemパッケージにC言語によるモジュールが含まれていた場合でしょう。何故なら、x64対応とVisual C++ 2010対応でモジュールをビルドする必要があり、既存のrakeタスクが失敗するので、利用者がポートする必要があります。そうはいっても、能楽堂に既にバンドルされているモジュールで済んでしまう場合も多いことでしょう。

  • libyaml、gzip
  • sqlite3、openssl
  • freetds、TinyTDS

などがx64ライブラリとしてバンドルされているので、通常の使用では問題が出ないと私は考えています。

最後に能楽堂を開発されているartonさんによるホワイトペーパーが、MSDNで昨晩から公開されています。来月から、HTML化した記事でも公開を予定しています。Ruby on Rails アプリケーションに携わっていらっしゃる方は、是非ともご覧ください。また、公開されたホワイトペーパーに数か所の誤字がありまして、来週以降に差し替えをする予定になっていますので、この点もご了承ください。誤字の変更箇所は、p16で2ヶ所、p17で1ヶ所の合計3ヶ所を「ノンプリエンティティブ」の表記を「ノンプリエンプティブ」に変更させていただきます。ご指摘いただいた、猪俣さんありがとうございました。