Windows AzureでPerlやPython、Ruby、Git、SSH、MySQLを利用しよう 4ページ

MySQLのインストール

 Windows Azureでは、データベースとしてSQL Azureの利用が推奨されている。SQL AzureはMicrosoft SQL ServerのAzure版という位置付けで、ユーザー側での設定やバックアップ、チューニングといった作業が不要なのが特徴だ。しかし、オープンソースソフトウェアではMySQLやPostgreSQLといったオープンソースのデータベースを利用することが多く、SQL Azureを利用する場合は改修作業が必要となってしまう。そこで今回は、Windows Azure環境内にMySQLをインストールして利用する方法を紹介する。

 前述のとおりWindows Azure環境のローカルストレージはインスタンスの停止・再起動時に初期化されてしまう。そのため、MySQLのデータベースファイルはAzure Driveによって永続化されるストレージ内に保存することにする。ただし、この方法は手軽にMySQLを利用できるというメリットがある一方、パフォーマンスが出にくいというデメリットがある。Windows Azure環境でデータベースアクセスのパフォーマンスが重要なアプリケーションを構築したい場合は、Windows AzureストレージやSQL Azureの利用を検討すべきだろう。

 MySQLについても、配布パッケージのダウンロードおよびインストールはバッチファイルで実行する。今回使用するMySQLのバージョンは5.5.22で、64ビット版のWindows向けMSIインストーラを使用する。このパッケージをミラーサーバーからダウンロードするバッチファイル(070mysql_donwload.cmd)がリスト17だ。

リスト17 MySQLのMSIインストーラをダウンロードするバッチファイル

REM MySQLのダウンロード
setlocal

set dl_url=http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.5/mysql-5.5.22-winx64.msi
set target=mysql-5.5.22-winx64.msi
set download_dir=%APP_DIR%\Download

mkdir "%download_dir%"
cd /d "%download_dir%"
if exist %target% del %target%
%WGET_EXE% %dl_url%

endlocal

 MySQLをインストールするバッチファイル(075mysql_install.cmd)はリスト18のようになる。

リスト18 MySQLをインストールするバッチファイル


REM MySQLのインストール
setlocal
set download_dir=%APP_DIR%\Download
set mysql_msi=%download_dir%\mysql-5.5.22-winx64.msi
set inst_dir=%APP_DIR%
set mysql_dir=%inst_dir%\MySQL\MySQL Server 5.5
set mysql_data=%AZUREDRIVE_ROOT%\MySQL\Data

REM %MYAPPS_ROOT%以下にインストールしたいので/aで展開のみ行う
msiexec /a "%mysql_msi%" targetdir="%inst_dir%" /qn

REM my.iniファイルをコピー
copy "%ROLEROOT%\approot\bin\etc\my.ini" "%mysql_dir%"

REM MySQLのデータディレクトリなどを記述した設定ファイルを作成
set mysql_cfg=%ROLEROOT%\approot\bin\etc\mysql_local.cfg
echo [mysqld] > %mysql_cfg%
echo basedir="%mysql_dir%" >> %mysql_cfg%
echo datadir="%mysql_data%" >> %mysql_cfg%

REM 初期データベースを設定したデータベースディレクトリにコピー
if not exist "%mysql_data%" xcopy /e "%mysql_dir%\Data" "%mysql_data%\"

REM MySQLをサービスとしてインストール
"%mysql_dir%\bin\mysqld.exe" --install MySQL --defaults-extra-file=%mysql_cfg%

REM MySQLサービスを開始
net start MySQL

endlocal

 ここでは、msiexecコマンドを使ってmsiファイルを展開している。この場合、「targetdir=」オプションで指定したディレクトリに「MySQL\MySQL Server 5.5」というディレクトリが作成され、その下に各種実行ファイルが展開される。

 また、MySQLの利用には設定ファイル「my.ini」が必要だが、これはロール内の「etc」ディレクトリからコピーしている。そのため、使用するmy.iniファイルをあらかじめ作成してここに配置しておく必要がある(図9)。

図9 ロールの「etc」ディレクトリ内にmy.iniを用意しておく
図9 ロールの「etc」ディレクトリ内にmy.iniを用意しておく

 my.iniの作成には、MySQLのインストールディレクトリ中に「my-small.ini」といったファイル名で用意されているひな形をベースとして利用すると良いだろう。

 なお、MySQLではデフォルトではインストールディレクトリ以下の「Data」ディレクトリ以下にデータベースを保存するようになっている。今回はローカルストレージ内にMySQLをインストールしているため、データベースの場所をAzure Driveでマウントしたドライブ内に変更する必要がある。これについては、MySQLのデータディレクトリなどの設定を記述した設定ファイルをバッチファイル内で作成し、それをMySQLサーバーの起動時に参照することで設定している。

Cygwinのインストール

 Cygwinは、Windows環境向けにUNIX/Linux向けのバイナリを提供するパッケージ集だ。これを導入することで、Windows上でbashなどのシェルや各種コマンド、そしてopensshやvi、gitといったソフトウェアを容易に利用できる。今回はCygwinでopensshやsshをインストールし、外部からのシェルアクセスを可能にする。

 Cygwinのダウンロードとインストールを行うバッチファイル(100cygwin.cmd)がリスト18だ。

リスト18 Cygwinのダウンロードとインストールを行うバッチファイル

REM Cygwinのダウンロード
setlocal
set dl_url=http://cygwin.com/setup.exe
set target=setup.exe
set download_dir=%APP_DIR%\Download

mkdir "%download_dir%"
cd /d "%download_dir%"
if exist %target% del %target%
%WGET_EXE% %dl_url%

REM Cygwinのインストール
set cygwin_exe=%download_dir%\setup.exe
set cygwin_dir=%APP_DIR%\cygwin

REM パッケージのダウンロードディレクトリを作成
mkdir "%APP_DIR%\temp"
mkdir "%cygwin_dir%"
cd /d "%cygwin_dir%"

REM インストーラを実行
"%cygwin_exe%" -s http://ftp.jaist.ac.jp/pub/cygwin/ -R "%cygwin_dir%" -q -l "%APP_DIR%\temp" -n -d -P openssh,vim,git,mysql

REM SSH向けのファイアウォール設定
netsh advfirewall firewall add rule name="SSH" action=allow protocol=TCP dir=in localport=22

echo y| cacls "%cygwin_dir%\var" /t /e /g everyone:f

REM Cygwin向けの設定スクリプトを実行
copy "%ROLEROOT%\approot\bin\etc\cygwin_setup.sh" "%cygwin_dir%"
"%cygwin_dir%\bin\bash.exe" --login -i /cygwin_setup.sh

endlocal
exit /b 0

 バッチファイル内ではCygwinのインストーラ(setup.exe)をオプション付きで実行して自動インストールを行っている(表2)。

表2 Cygwinインストーラ「setup.exe」で自動インストールを行うためのオプション
オプション 意味
-s パッケージをダウンロードするミラーサイトを指定
-R Cygwinのインストール先ディレクトリを指定
-q 自動セットアップモードでインストールを実行する
-l ダウンロードしたパッケージの一時保存先を指定
-P インストールするパッケージを指定。「,」で区切って複数指定可能
-n デスクトップやスタートメニューにショートカットを作成しない

 今回インストールするのはopensshおよびvim、git、mysqlだ。mysqlコマンドは先に説明したWindows版MySQLにも含まれているが、そちらはCygwinのopensshと相性が悪く、mysql.exeの出力をopenssh経由で受け取れないという不具合がある。そのため、cygwin版のmysqlコマンドをインストールするようにしている。

 また、バッチファイル内ではCygwinのインストール完了後、ロールの「etc」ディレクトリ内にあらかじめ用意しておいた「cygwin_setup.sh」というシェルスクリプトをCygwinのインストールディレクトリにコピーして実行している。このファイルの内容はリスト20のとおりだ。

リスト20 Cygwinの初期設定を行う「cygwin_setup.sh」シェルスクリプト

#!/bin/sh

ssh-host-config -n
echo "PubkeyAuthentication no" >> /etc/sshd_config
cygrunsrv -I sshd -d "Cygwin SSHd" -p /usr/sbin/sshd -a "-D"
cygrunsrv -S sshd

 ここでは、次の処理を行っている。

  • ssh-host-configコマンドによるopensshの初期設定を実行する
  • 「/etc/sshd_config」ファイルに「PubkeyAuthentication no」という1行を追加し、opensshサーバーで公開鍵認証を無効に設定する
  • 「cygrunsrv」コマンドでopensshサーバーをサービスとして登録し起動する

 公開鍵認証を無効に設定しているのは、デフォルトの設定ではユーザー権限の問題で公開鍵認証が利用できない状態だからだ。Windowsのサービスは明示的に設定しない限り「SYSTEM」ユーザーで実行されるが、Cygwinでインストールしたopensshでは、このユーザーでは公開鍵認証が利用できなかった。もし公開鍵認証を有効にしたい場合、インスタンスの起動後にリモートデスクトップ接続でインスタンスに接続し、サービスの設定でopensshの実行ユーザーをリモートデスクトップ接続で利用するユーザーに変更すれば良い(図10)。

図10 公開鍵認証を利用する場合、サービスの設定でopensshの実行ユーザーをリモートデスクトップ接続で利用するユーザーに変更しておく
図10 公開鍵認証を利用する場合、サービスの設定でopensshの実行ユーザーをリモートデスクトップ接続で利用するユーザーに変更しておく