LAMP開発者のためのWindows Azure講座

第3回Azure上でPHPアプリをデプロイ、動作させてみよう

EclipseでWindows Azureプロジェクトを作成

前回は、Windows Azure SDKやEclipse PDT(PHP Development Tools)をローカル環境にインストールして、Windows Azure PlatformでPHPアプリケーションを動作させるための準備を整えました。今回は、Eclipseを使って実際にPHPアプリケーションをWindows Azureにデプロイし、実際の動作を確認するまでの手順を紹介します。あわせて、MySQLをWindows Azure Platformで動作させるにはどのような方法があるのかについて触れたいと思います。

まず、Eclipseを使ってWindows Azure上で動作するPHPアプリケーションを作成してみましょう。前回導入したPDTをパースペクティブに追加し、Azureプロジェクトを作成できるように設定します。Eclipseを起動し、メニューバーの「Windows」から「Open Perspective⁠⁠-⁠Other」を選択します。続いて表示される画面で「Windows Azure PDT」を選択します。

図1 ⁠Windows」メニューから「Open Perspective⁠⁠-⁠Other」を選択
図1 「Windows」メニューから「Open Perspective」-「Other」を選択
図2 ⁠Windows Azure PDT」を選択
図2 「Windows Azure PDT」を選択

すると、Eclipseが拡張され、図3のようにタイトルバーが「Windows Azure PDT - Eclipse」に変わり、メニューバーには「Windows Azure」が追加されます。

図3 Azure PDTがセットされたEclipse
図3 Azure PDTがセットされたEclipse

では、実際にAzureプロジェクトを作成してみましょう。

「Windows Azure」メニューから「New Windows Azure PHP Project」を選択します(⁠⁠File」メニューから「NEW⁠⁠-⁠Windows Azure PHP Project」でも可能です⁠⁠。図4の画面が表示されますので、プロジェクト名を入力します。ここでは「Sample1」とします。なお、ワークスペースは、IISのルートディレクトリとなる「C:\inetpub\wwwroot」が設定されます。

図4 Azureプロジェクト名を入力
図4 Azureプロジェクト名を入力

「Next」ボタンを押すと、図5のようなWebRole名を入力する画面が表示されます。ここでは、ここでは「WebRole1」とします。

図5 WebRole名を入力
図5 WebRole名を入力

なお、WebRoleとは、Windows Azure上のIISが提供するWebアプリケーションをホストする環境のことです(HTTP/HTTPSのリクエストを受け付けます⁠⁠。WebRole内では複数のインスタンス(仮想サーバ)をデプロイでき、構成も動的に変更することができます。たとえば、大量のHTTPリクエストにより負荷が高まった場合、インスタンス数を増加させたり、インスタンスのサイズを拡大させたりして、対応することができます。こうしたスケールアウト、スケールアップが容易に行える点は、Windows Azure Platformを利用する大きなメリットと言えるでしょう。

続いて「Next」ボタンを押し、次の画面で「Finish」を押すと、プロジェクトが作成されます。

画面左側のPHP Explorerを見ると、プロジェクト作成時に指定したプロジェクト名とロール名が確認できます。⁠Sample1」配下にある「ServiceConfiguration.cscfg」⁠ServiceDefinition.csdef」は、サービスを設定するファイルです。また、⁠Sample1_WebRole1」以下がAzure上で公開されるルートディレクトリになります。

図6 PHP Explorerでプロジェクト名とロール名を表示
図6 PHP Explorerでプロジェクト名とロール名を表示

Sample1_WebRole1内のindex.phpをダブルクリックして中身を見てみます。

図7 Sample1_WebRole1のindex.phpを表示
図7 Sample1_WebRole1のindex.phpを表示

すでにサンプルコードが挿入されています。前半は、サンプルのストレージへのリンク、後半はphpinfoを出力するコードです。今回、ストレージはプロジェクトに含めませんでしたので、当該コードを削除して、phpinfoだけを出力するアプリケーションにします。

修正が済んだら、index.phpを保存して、動作を確認します。PHP Explorerのプロジェクト「Sample1_WebRole1」を選択状態にして、⁠Windows Azure」メニューから「Run Windows Azure PHP Project in Development Fabric」を選びます。

図8 コードを編集後「Sample1_WebRole1」を選択
図8 コードを編集後「Sample1_WebRole1」を選択
図9 メニューから「Run Windows Azure PHP Project in Development Fabric」を選択
図9 メニューから「Run Windows Azure PHP Project in Development Fabric」を選択

すると、Azure SDKに含まれる「Storage Emulator」など、Azure環境をローカルでエミュレートするツール類の初期化が行われます。

図10 Azure環境の初期化中
図10 Azure環境の初期化中

初回起動時は、以下のような「Storage Emulator」の初期化終了の画面が表示されるので、OKを押します。

図11 初期化終了表示
図11 初期化終了表示

そのまま、しばらく待っていると、Eclipse上に図12のようなindex.phpの出力結果が表示されます。

図12 PHP環境の設定完了
図12 PHP環境の設定完了

Windows Azureへのデプロイ

では、今作成したPHPプロジェクトをWindows Azureに実際にデプロイしてみましょう。

Windows Azureにデプロイするには、デプロイ用のパッケージファイルを作成します。PHP Explorerのプロジェクト「Sample1_WebRole1」を選択状態にして、⁠Windows Azure」メニューから「Create Windows Azure Service Package for Windows Azure PHP Project」を選びます。

図13 メニューから「Create Windows Azure Service Package for Windows Azure PHP Project」を選択
図13 メニューから「Create Windows Azure Service Package for Windows Azure PHP Project」を選択

しばらく待っていると、パッケージが作成され、パッケージが保存されたフォルダが自動的に開きます。

図14 パッケージフォルダの表示
図14 パッケージフォルダの表示

「Sample1.cspkg」が今作成したパッケージ(Zip圧縮されたファイル)で、⁠ServiceConfiguration.cscfg」⁠ServiceDefinition.csdef」が構成ファイル(XMLファイル)です。2つの構成ファイルの中身はそれぞれ以下のようになっています。

リスト1 ServiceConfiguration.cscfg
<?xml version="1.0" encoding="UTF-8"?>
<ServiceConfiguration serviceName="Sample1" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration">
  <Role name="WebRole1">
    <Instances count="1"/>
    <ConfigurationSettings>
      <Setting name="StorageAccountName" value="devstoreaccount1"/>
      <Setting name="StorageAccountKey" value="Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="/>
      <Setting name="SqlAzureHost" value=""/>
      <Setting name="SqlAzureUserName" value=""/>
      <Setting name="SqlAzurePassword" value=""/>
      <Setting name="SqlAzureDatabase" value=""/>
      <Setting name="UseDataStorage" value="false"/>
      <Setting name="UseDevelopmentStorage" value="true"/>
      <Setting name="UseCloudStorage" value="false"/>
      <Setting name="UseSqlAzure" value="false"/>
      <Setting name="LogLevel" value="Error"/>
      <Setting name="ScheduledTransferPeriodInSeconds" value=""/>
      <Setting name="WindowsAzureStorageConnectionString" value="UseDevelopmentStorage=true"/>
      <Setting name="XDrives" value=""/>
      <Setting name="XDrivesLocalCache" value=""/>
    </ConfigurationSettings>
  </Role>
</ServiceConfiguration>
リスト2 ServiceDefinition.csdef
<?xml version="1.0" encoding="UTF-8"?>
<ServiceDefinition name="Sample1" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole enableNativeCodeExecution="true" name="WebRole1">
    <Imports/>
    <Endpoints>
      <InputEndpoint name="HttpIn" port="80" protocol="http"/>
    </Endpoints>
    <ConfigurationSettings>
      <Setting name="StorageAccountName"/>
      <Setting name="StorageAccountKey"/>
      <Setting name="SqlAzureHost"/>
      <Setting name="SqlAzureUserName"/>
      <Setting name="SqlAzurePassword"/>
      <Setting name="SqlAzureDatabase"/>
      <Setting name="UseDataStorage"/>
      <Setting name="UseDevelopmentStorage"/>
      <Setting name="UseCloudStorage"/>
      <Setting name="UseSqlAzure"/>
      <Setting name="LogLevel"/>
      <Setting name="ScheduledTransferPeriodInSeconds"/>
      <Setting name="WindowsAzureStorageConnectionString"/>
      <Setting name="XDrives"/>
      <Setting name="XDrivesLocalCache"/>
    </ConfigurationSettings>
  </WebRole>
</ServiceDefinition>

ServiceConfiguration.cscfgの<Role><Instances count="1"/>の記述があります。Instances要素はインスタンス数をあらわしていて、属性値の数だけAzure上にデプロイされます。

また、インスタンスのサイズについては、ServiceDefinition.csdefの<WebRole>に記述します。上記には含まれていませんが、たとえば、ServiceDefinition.csdefに<WebRole name="WebRole1" vmsize="ExtraSmall">のように記述すると、デフォルトのインスタンスのサイズである「小」⁠CPU:1.6 GHz メモリ:1.75 GB)が、⁠極小」⁠CPU:1 GHz メモリ:768 GB)に設定されます。

デプロイするにはEclipse上から直接行うこともできますが、ここでは、Windows Azure Platformの管理ポータルからパッケージをデプロイしてみます。管理ポータルからデプロイすることは、開発担当者と運用担当者を分離できるというメリットもあります。

デプロイするのは、Sample1.cspkgとServiceConfiguration.cscfgの2つです。

ブラウザで管理ポータルを開きます。サインイン後、図15のようなホーム画面が表示されるので、左側のメニューから「ホステッドサービス、ストレージ アカウント、CDN」をクリックします。

図15 Windows Azure Platform管理ポータル ホーム
図15 Windows Azure Platform管理ポータル ホーム

すると、そのすぐ上に「デプロイのステータス」⁠アフィニティグループ」などのメニューが表示されるので、⁠ホステッドサービス」をクリックします。すると、図16のように、現在利用可能なサブスクリプションとホステッドサービス、WebRole、インスタンスのリストが表示されます。

図16 利用可能なリソースの確認
図16 利用可能なリソースの確認

まず、デプロイする新規ホステッドサービスを作成します。サブスクリプションを選択して、ページ左上の「新規ホステッドサービス」をクリックすると(サブスクリプション上で右クリックでも可能⁠⁠、図17の画面が表示されます。

図17 新規サービス作成
図17 新規サービス作成

サービスの名前は任意です。URLは、.cloudapp.netのサブドメインになります。ここでは「webrole-phpinfo-test」とします。地域は「東アジア⁠⁠、デプロイオプションは「デプロイしない」を選択し、OKを押します。すると、図18のように「Sample1」ホステッドサービスが作成されるので、それを選択し、上部メニューまたは右クリックから「新規運用環境のデプロイ」を選択します。

図18 ホステッドサービスが作成される。⁠新規運用環境のデプロイ」を選択
図18 ホステッドサービスが作成される。「新規運用環境のデプロイ」を選択

続いて表示される画面図19で、デプロイ名を「phpinfo-test」⁠任意です)とし、⁠パッケージの場所」として、⁠ローカルを参照」を選んで、先ほど作成したC:\inetpub\wwwroot\Sample1配下にあるパッケージSample1.cspkgを選択します。次に、⁠構成ファイル」として、同じく「ローカルを参照」からServiceConfiguration.cscfgを選択します。

図19 デプロイにまつわる要件を入力
図19 デプロイにまつわる要件を入力

そのままOKを押すと、図20のような警告が出ます。インスタンス数に1を設定した場合に出る警告です。ここはそのままOKを押します。

図20 インスタンス数が1の場合の警告
図20 インスタンス数が1の場合の警告

その後、以下のように、⁠アップロードの準備中です」⁠○%アップロードしました」⁠初期化しています」などと進捗が表示されます。緑色で「準備完了」になるとアクセスできるようになるのですが、準備完了するまで5~10分ほどかかります。利用するデータセンター(さきほど「地域」で選択したものです)やアプリケーションの規模などによってデプロイの時間は変わります。

図21 デプロイ進行中
図21 デプロイ進行中

準備完了が表示されたら、⁠http://webrole-phpinfo-test.cloudapp.net」にアクセスしてみましょう。図22のようなサイトが表示されるはずです。

図22 デプロイが完了したページ
図22 デプロイが完了したページ

以上で、デプロイは終了です。デプロイしたままでは課金対象になりますので、動作が確認できたら、忘れずに環境を削除しておきましょう。

MySQLをインストールするための基礎知識

これまで見たように、Windows Azureは、インスタンス数やインスタンスのサイズを自由に変更できます。一方で、インスタンス内で利用するデータについては保証されません。

たとえば、PHPで掲示板アプリケーションを作成し、データをルートディレクトリ配下のDATAディレクトリに保存するとします。この場合、インスタンスが再起動した場合、デプロイ後に作成されたDATAディレクトリは消えてしまいます。実際には、いつインスタンスが再起動するかはユーザーサイドで把握できませんので、データを保存しておくストレージが必要になります。

そのため、Windows Azure Platformでは、データの永続性を確保するために、ブロブ(Blob⁠⁠、テーブル(Table⁠⁠、キュー(Queue⁠⁠、ドライブ(drive)という4つのストレージ、そしてRDBMSとしてSQL Azureが提供されています。PHPアプリケーションが利用するデータは、これらのストレージか、SQL Azureに格納することになります。

SQL AzureのかわりにMySQLを利用したいという場合は、工夫が必要です。次回は、その辺りの事情を踏まえつつ、MysqlをAzure上にデプロイする手順を検討してみたいと思います。

おすすめ記事

記事・ニュース一覧