Ruby on Rails on Windows Azure (3)

(1)と(2)のエントリーで、どのいう経緯でホワイトペーパーとNougakuDo Companionが出来上がってきたかを説明しました(まあ、前置きが長い気がしなくもありませんが…)。今回は、NougakuDo Companionを説明します。最初に、NougakuDo Companionの概要図を示します。 NougakuDo Companionは、図に示すように大きな機能は4つに分類することができます。それぞれの機能は、以下のような役割を持っています。 AdminWeb:管理サイト(ポート8080)で、能楽堂で作成したRailsアプリケーションの運用管理や、NougakuDo Comapnionのログ情報などを参照できる、ASP.NET MVC 3による Web アプリケーションです。マルチインスタンスで起動したRailsアプリケーションへの操作(再起動など)は、該当するインスタンスに対してメッセージをQueueストレージへ送信します。 Web Role:Windows Azureによって起動されるロールで、NougakuDoControllerを動作させるための準備作業とNougakuDoControllerを起動します。また、マルチインスタンスで起動した場合のRailsアプリケーションに対する操作(再起動など)メッセージをQueueストレージから取得します。また、マルチインスタンスの管理用にインスタンス情報をTableストレージに格納します。 NougakuDoController:NougakuDoCompanionの中核機能を実装した実行ファイル(exe)で、能楽堂で作成したRailsアプリケーションに対する様々な操作を行います。 1)インストール:Blobストレージから、能楽堂ランタイム(実行ファイル)やRailsアプリケーションのzipファイルを取得して、ローカルリソースに展開します。 2)設定:能楽堂のローンチャで行う設定情報をAdminWebで設定した情報を使って設定します。 3)運用管理:NougakudoLauncherを使って起動したRailsアプリケーションに対する停止や起動、再起動などの操作を行います。 NougakudoLauncher:能楽堂を使ったRailsアプリケーションの起動を行う実行ファイル(exe)で、停止操作ではruby.exeにCTRL+Cを送る機能を持っています。 最初のプレビューは、NougakuDoControllerとNougakudoLauncherです。この2つが動き出せば、能楽堂を使ったRailsアプリケーションを動かせますので、このプレビューを使ってローカル環境でのテストとAzureを使ったテストを行っていたのは、いうまでもありません。唯、このプレビューでの失敗もありました。それは、当初からAzureを前提としていたために SDK のStrage Emulatorを想定していなかったことです。このプレビューに、応急処置的にASP.NETのUIを付けたものを artonさんにお渡しして、SDK 環境で試せないの?と質問された時に、慌てて対応したのが、7月後半のシアトル出張の真っ最中だったのは内緒です。NougakuDoControllerやNougakudoLauncherを単独で実行できるように実装したのは、明確な理由があります。その理由は、以下のような考えを前提としたからです。 シンプルであるべき(Simple is best) やり易い環境であるべき ご存じのようにAzureはクラウド環境ですから、インテリトレースが使えると言ってもデバッグを考えると難しいのも事実でしょう。だからこそ、シンプルで実装し易い環境へ持ってくるべきだと考えたのです。この考えから、NougakuDoControllerは、Azure SDKで提供されるAPIからストレージサービスAPIしか使用していません。では、Azure特有のインスタンス情報などをどうしたかといえば、azure.xmlという設定ファイルから情報を取得するようにしています。つまり、ロールインスタンスのコードでazure.xmlを作成することで、Azureのサービスランタイム APIに依存しないようにしたことになります。この特徴が、Azure以外の環境に持っていく場合に効果を発揮できるでしょうし、NougakuDoController単体でのデバッグを容易にするという効果を発揮しました。利点ばかりではなく、もちろん欠点もあります。それは、管理サイトやWeb ロールとの連携をどのように行うかということです。基本的に、別プロセスとして動作していますから、プロセス間連携をどのように実装するかという課題です。 この課題に対して採用した方法が、ファイルを介して連携するという方法です。共有メモリなどを使うよりも、シンプルで、実装コストもかかりません。ファイルを使った連携で注意しないといけないのが、ファイルの排他ロックの問題です。この理由から、FileSystemWatcherクラスを使ったCreatedイベントを多用しています。一般的に、FileSystemWatcherクラスのイベントは、次のように発生します。 Created:空の新規ファイルを作成(Windows エクスプローラーで新しいテキストファイルを作成) Changed:内容を出力した場合(メモ帳で内容を書き換え、上書き保存した場合など) Renamed:ファイル名を変更(Windows エクスプローラーで新しいテキストファイルを作成して、直後にファイル名を変更など) という順序で、イベントが発生します。この理由から、ファイル名に意味を持たせて空のファイルを作成することでプロセス間連携に利用しています。もちろん、連携ミスなどを考慮して空のファイルを作成する前に、既存のファイルを削除してから作成するようにして目的のファイル システム イベントを発生させるようにしています。ローカル環境ではスムーズに動作しましたが、実際にAzure上で動作させた場合に問題も発生しました。それは、ファイルロックが発生して例外が発生したことです。この原因は、可能性として仮想マシンであるがためにファイル システム イベントの発生タイミングに遅れがあることではないかと考えて、リトライロジックを組み込んで回避しています。 NougakuDoControllerがRailsアプリケーションを管理する上で重要なものは、アプリケーションの設定ファイル(configuration.xml)です。この設定ファイルは、管理サイトの「NougakuDo Runtime & Apps」でも設定することができます。NougakuDoControllerでは、この設定ファイルを使って以下のようなことを行っています。 バージョンチェック(シンプルに、バージョンが一致するかしないかの判断です) 標準で5分間隔でBlobストレージに対してチェックを行います。 バージョンが一致しなければ、以下の作業を実施。 zip ファイルをBlobストレージからダウンロード Rails…

0

Ruby on Rails on Windows Azure (2)

前回のエントリーでは、能楽堂の概要と特徴を説明して、RailsアプリケーションをWindows Azureに配置する場合に考えた目標を説明しました。なぜ、このような目標を考えたのかを最初に説明します。Ruby on RailsをWindows Azureで動作させる情報は、検索するとたくさん見つけつることができます。たとえば、Ruby on Rails in Windows Azure などでは、RubyのインストールからRails環境の構築と Windows Azureへ配置するための Azure用のアプリケーション パッケージの作成方法までを解説しています。この方法でも、技術的にはRailsがWindows Azureで動作するという観点からは良くできていると私も考えています。でも、Railsアプリケーションを開発されている方の立場になって考えた場合は、どうなんだろうという疑問があるのも事実です。私が考えるRailsアプリケーションの開発者は、アプリケーションの開発から運用を以下の手順で行うと思います。 開発環境の準備(RubyやRuby on Rails、データベース環境)。 Railsアプリケーションの開発とテスト 本番環境への配置 自前でサーバーを用意するか、ホスティング環境を用意して、環境を整えてからアプリケーションを配置 このように考えた場合に、Windows Azure アプリケーション開発環境を理解するというのはRailsアプリケーション開発以外に学ばないといけない知識になってくるわけです。つまり、余計な負担が生じてしまうのです。もちろん、採用したプラットフォームを最大限に生かすのであれば、それらの知識は必要不可欠です。でも、Railsアプリケーションのホスティング先としてのWindows Azureを考えた場合は、必要のない知識だと言えるでしょう。このように考えた結果が、RailsアプリケーションをWindows Azureへ配置するためのツールとして NougakuDo Companionの設計目標にまりました。つまり、NougakuDo Comapnionを使う上で、利用者が学ぶべき知識は以下の事柄になります。 Windows Azure コンピュートサービスの製品知識(仮想マシンのサイズなど)とVisual Studio 2010の操作 Visual Studio のプロジェクト プロパティで仮想マシンサイズを変更して、設定情報を変更できる。 Visual Studio でAzure用のアプリケーションパッケージの作成ができる。 Windows Azure 管理ポータルの使用方法 ストレージ サービスの使用方法(たとえば、Azure Storage Explorerなどのツールの操作) つまり、Windows Azure のWeb ロールなどの知識やC#などのプログラミング言語の知識がなくても、Visual Studioの操作方法とWindows Azure管理ポータルを使った操作ができれば、RailsアプリケーションをWindows…

0

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…

0