Windows Azure PDTのバージョンと制約
前回に引き続き,WorkerRoleで動作するMySQLをWindows Azureにデプロイしてみます。まず,Azure環境のエミュレータ「コンピュートエミュレータ」で動作を確認し,次に,設定ファイルなどを書き換えてAzure上にデプロイし,phpMyAdminを使ってMySQLの動作を確認します。
その前にいくつか補足があります。まず,現在入手できるWindows Azure Tools for Eclispeを組み込んだEclipse PDT(WIndows Azure PDT)では,昨年11月に公開されたAzure SDKの新バージョン1.6(Windows Azure SDK for .NET - November 2011)を直接利用できなくなっています。
これは,1.5まではSDKのbinディレクトリ(C:\Program Files\Windows Azure SDK\v1.5\bin)に含まれていたコンピュートエミュレータ関連のプログラム(csrun.exeなど)が,専用のディレクトリ(C:\Program Files\Windows Azure Emulator\emulator)にインストールされるようになり,Eclipse PDTから自動的に起動できなくなっているためです。
コマンドラインを指定できればいいのですが,GUIからは設定ができないようです。そのためここでは,前回から引き続き,SDKの1.5を利用することにします。なお,1.5のスタンドアロン版はこらちから入手可能です。
また,これまでローカル環境については32bit,64bitを明示してきませんでしたが,前回からWindows 7 64bit版を利用しています。前回インストールしたMySQLは64bit版ですが,32bit版のWindowsと32bit版のMySQLを利用する場合でも,今回説明する手順でWindows Azure上でMySQLが動作することは確認済みです。
それでは,Azure環境のエミュレータでMySQLを動作させてみましょう。
エラーの確認とファイルの修正
まずは,前回発生した下記のエラーに対処します。
Error : CloudServices41 : The entrypoint WorkerRole1.dll is not a valid assembly. Please provide a relative path to the binary that implements the entrypoint.
エラーにあるWorkerRole1.dllというのは,WokerRoleで動作させるプログラムの処理を決めるC#等で作成されるdllです。Visual Web DeveloperなどのIDEを用いる場合は,WorkerRole.csを自分で作成しデプロイ時にどのプログラムを起動しどう動作させるかを決めることができます。
ただ,今回利用しているEclipse PDTでは,Windows Azure Tools for Eclispe(windowsazure4e)のソースコード内にWorkerRole1.dllやMysql_WorkerRole.dllが埋め込まれており,コンピュートエミュレータの起動やデプロイするパッケージの作成についても自動で行われます。エラーの要因は,その際に利用するdllのファイル名の受け渡しがうまくいかないことが原因と思われます。
Windows Azure SDKのコマンドラインツールを利用して,その引数に適切なdllを指定することもできるのですが,ひとまずここでは,Windows Azure PDTだけでMysqlを動作させるという意図で進めます。具体的には,決してスマートとは言えない方法なのですが,Windows Azure PDTが自動生成したWorkerRole内のMysql_WorkerRoleという名称のファイルをWorkerRole1に変更してしまいます。
ファイル名を変更するのは,Mysql_WokerRole.dll,Mysql_WorkerRole.dll.conifg,Mysql_WorkerRole.pdbの3つで,それぞれ,WorkerRole1.dll,WorkerRole1.dll.conifg,WorkerRole1.pdbに変更します。
この状態で,メニューから「Run Windows Azure PHP Project in Development Fabric」を実行すると,エラーは表示されなくなります。
MySQLが起動しない問題への対処
ただ,この状態でもなおMySQLは起動しません。厳密には,起動しようとしますが,エラーで落ちてしまいます。原因は,my.ini内にある「skip-locking」が最近のMySQLでは推奨されていないからです。
コンピュートエミュレータのログが,ユーザーのホームディレクトリ内のAppData\Local\dftmp\resource\文字列\directory\MySQLDatastore\コンピュータ名.errに記録されていますので,それを確認すると,以下のように,「unknown option '--skip-locking'」となり,Shutdownしていることがわかります。
なお,ログの所在(上の「文字列」)は,タスクバーのアイコンからコンピュートエミュレータを表示すると,WorkerRoleのログから知ることができます。
エラーに対処するためにまず,my.iniをEclipseのエディタなどで開き,30行目のskip-lockingをコメントアウトします(または,skip-external-lockingに変更する)。
さらに,ServiceDefinition.csdefとServiceConfigulation.cscfgから,mysql-init.txtに関連する箇所をコメントアウトします。mysql-init.txtは,パスワードのリセットなどの初期化処理を行うものですが,このファイルが指定場所に存在しない場合は,やはりMySQLがエラーで起動しません。
具体的には,図6と図7のように,ServiceDefinition.csdefの33行目とServiceConfigulation.cscfgの29行目をコメントアウトしておきます(なお,コメントアウトせずに,空のmysql-init.txtをSample2_WorkerRole\mysql以下に置いても大丈夫です)。
エラーへの対処は以上です。なお,ここで用いるmy.iniは,Windows Azure PDTが自動的に作成したAzure向けのmy.iniです。MySQLをインストールしたフォルダにあるmy.iniをコピーしてもうまく動きませんので注意が必要です。



