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

 Windows AzureではPerlやPython、PHP、RubyなどによるWebアプリケーションの実行や、SSHによるアクセス、GitやMySQLの利用も可能だ。今回は前回作成した「FTPでアクセスできるWebサイト」をベースに、Windows Azure環境におけるPerlなどの言語環境構築や、SSH、MySQL、Gitなどのインストールについて解説する。

 前回記事「UNIX/Linux目線のWindows Azure入門ガイド」では、Windows Azureを使って「FTPでコンテンツをアップロードできるWebサイト」を作成した。しかし、この状態では静的なHTMLこそ表示できるものの、動的なコンテンツは表示できない。そこで今回はPHPやPerl、Ruby、Pythonといった言語環境やMySQLをインストールし、これらを使ったWebアプリケーションを実行できる環境を整えてみよう。

 また、UNIX/LinuxベースのWebサーバーでWebアプリケーションを運用する場合、GitやSubversionといったバージョン管理ツールやSSHによるリモートログインが多く使われる。これらのツールをWindows Azureで利用する方法も解説する。

前回の復習と作成する環境の概要

 Windows AzureはWindows Serverベースの仮想環境を提供しており、WebサーバーとしてはIISを利用する形になっている。デフォルトではASP.NETアプリケーションの利用に適した設定となっているが、設定ファイルを修正したりスクリプトを用意することで任意ポートの開放やIISの設定変更が行える、ということを前回記事で紹介した。前回はスタートアップタスクやWebRole.cs内でIISの設定変更を行ったが、今回はそれに加えてアプリケーションのインストールやその設定変更などを行っていく。

 今回Windows Azure環境にインストール/設定するプログラムは次のとおりだ。

  • PHP
  • Perl
  • Python
  • Ruby
  • MySQL
  • WordPress
  • OpenSSH(Cygwin)
  • Git(Cygwin)

 PHPやPerl、Python、MySQLといったパッケージのダウンロードやインストールにはバッチファイルを利用する。これらの処理をバッチファイルに記述しておき、スタートアップ処理およびWebRole.cs内のOnStart関数で実行するというものだ。

 また、OpenSSHやGitについては、UNIX/Linux向けソフトウェアをWindows向けにポーティングしたパッケージ集であるCygwinのものを使用する。Cygwinではこれら以外にも多数のソフトウェアが提供されているので、必要に応じてほかのソフトウェアをインストールすることも容易だ。

ベースとなる環境の準備

 今回は前回作成した「永続的ストレージを持ちFTPでファイルにアクセスできる」環境をベースに作業を行う。スタートアップタスクとしてバッチファイル「startup.cmd」を実行する点や、OnStart関数内で永続的ストレージのマウントを行ったり、「onstart.cmd」バッチファイルを呼び出す、といった点については前回と同様である。ただし、今回はスタートアップタスクやOnStart()内で実行するバッチファイルの数が多くなる。そこでstartup.cmdはリスト1のように変更し、「StartupTask\enabled」内に保存したバッチファイルを順に実行する形にする。また、コマンドの実行結果はファイルにリダイレクトしてあとから参照できるようにしておく。

リスト1 今回のstartup.cmd

REM スタートアップタスクとして実行するスクリプト
set logfile=startup.log

REM StartupTask\enabled\内の*.cmdを順に実行
cd /d "%ROLEROOT%\approot\bin\StartupTask\enabled"
echo Starting onstart.cmd > %logfile%

for %%i in (*.cmd) do (
  cd /d "%ROLEROOT%\approot\bin\StartupTask\enabled"
  echo run %%i >> %logfile% 2>&1
  call %%i >> %logfile% 2>&1
)

exit /b 0

 スタートアップタスクで実行するバッチファイルは、Webロールに追加した「StartupTask」というフォルダ内に格納する。StartupTaskフォルダ内には「enabled」と「disabled」というフォルダを作成しておき、実行するバッチファイルのみをenabledフォルダに格納しておく(図1)。不要なバッチファイルはdisabledフォルダに移動しておけば実行されない。

図1 Webロールに「StartupTask」フォルダを作成し、その下に「enabled」および「disabled」フォルダを作成して実行するバッチファイルを管理する
図1 Webロールに「StartupTask」フォルダを作成し、その下に「enabled」および「disabled」フォルダを作成して実行するバッチファイルを管理する

 Webロール内にディレクトリを追加するにはクリックしたいディレクトリ(もしくはWebロールのルート)を右クリックして「追加」-「新しいフォルダー」をクリックすれば良い。

 また、OnStart関数内で実行するonstart.cmdについても同様に「OnStart\enabled」内のバッチファイルを実行するように変更している(リスト2)。こちらについてもStartupTaskフォルダと同様にOnStartフォルダと、その中の「enabled」および「disabled」フォルダを作成しておく。

リスト2 今回のonstart.cmd

REM WebRoleの開始時に実行するスクリプト

REM ログを出力
set logfile=onstart.log

REM OnStart\enabled\内の*.cmdを順に実行
cd /d "%ROLEROOT%\approot\bin\OnStart\enabled"
echo Starting onstart.cmd > %logfile%

for %%i in (*.cmd) do (
  cd /d "%ROLEROOT%\approot\bin\OnStart\enabled"
  echo run %%i >> %logfile% 2>&1
  call %%i >> %logfile% 2>&1
)

exit /b 0

 これらの変更に伴い、前回startup.cmd内に記述してあった内容はStartupTask\enabled内の「010ftp.cmd」というファイルに、onstart.cmdの内容はOnStart\enabled内の「010ftp.cmd」および「020http.cmd」というファイルに分割してそれぞれ記述している(リスト3~5)。

リスト3 「StartupTask\enabled\010ftp.cmd」の内容

REM FTPサーバーの設定

setlocal

REM FTPサービスのインストール
start /w pkgmgr /iu:IIS-FTPServer;IIS-FTPSvc;IIS-FTPExtensibility

endlocal
exit /b 0

リスト4 「OnStart\enabled\010ftp.cmd」の内容

REM FTPサーバーの設定
setlocal
set ftp_path=%AZUREDRIVE_ROOT%
set ftp_cert=%SSLCERT%

REM IISの設定変更
cd /d %windir%\system32\inetsrv

REM すでにFTPサイト設定が作成されている場合はいったん削除
appcmd delete site "%FTP_SITENAME%"

REM FTPサイト設定の作成
appcmd add site /name:"%FTP_SITENAME%" /bindings:ftp/*:21: /physicalPath:"%ftp_path%\\"

REM SSL証明書の追加
appcmd set site "%FTP_SITENAME%" /ftpServer.security.ssl.serverCertHash:%ftp_cert%

REM 基本認証の有効化
appcmd set site "%FTP_SITENAME%" /ftpServer.security.authentication.basicAuthentication.enabled:true

REM 承認規則の追加
appcmd set config "%FTP_SITENAME%" /section:system.ftpServer/security/authorization /+"[accessType='Allow',users='*',permissions='Read, Write']" /commit:apphost

REM FTPでPASV向けに使用するポートを指定する
appcmd set config /section:system.ftpServer/firewallSupport /lowDataChannelPort:"5000" /commit:apphost
appcmd set config /section:system.ftpServer/firewallSupport /highDataChannelPort:"5000" /commit:apphost

REM ロードバランサのインターネット側IPアドレスを指定
appcmd set config /section:system.applicationHost/sites /siteDefaults.ftpServer.firewallSupport.externalIp4Address:%INET_IP_ADDR% /commit:apphost

REM ファイアウォールの設定
netsh advfirewall firewall add rule name="FTP" action=allow protocol=TCP dir=in localport=21
netsh advfirewall firewall add rule name="FTP-Data" action=allow protocol=TCP dir=in localport=5000

REM FTPサーバーを再起動する
net stop ftpsvc
net start ftpsvc

endlocal
exit /b 0

リスト5 「OnStart\enabled\020http.cmd」の内容

REM Webサーバーの設定
setlocal
set web_site=%ROLEINSTANCEID%_Web
set web_root=%AZUREDRIVE_ROOT%\WWWRoot

REM IISの設定変更
cd /d %windir%\system32\inetsrv

REM Webサーバーの設定
REM ルートディレクトリを作成する
mkdir %web_root%

REM 公開するルートディレクトリを変更する
appcmd set vdir "%web_site%/" /physicalPath:"%web_root%"

endlocal
exit /b 0

 これらのバッチファイルについてもonstart.cmdやstartup.cmdと同様、プロパティの「出力ディレクトリにコピー」を「新しい場合はコピーする」に変更しておく。