Windows Azure PowerShell(またはPTVS)で作成した、Djangoアプリケーションを含むクラウドサービスプロジェクトは、作成された直後の状態でデプロイしてもひとまずDjangoの動作を確認できることはアプリケーションをデプロイするで説明した通りですが、実際のアプリケーションを動かすうえでは不十分な点もあります。以下では、クラウドサービスのインスタンス上で必要となるセットアップ、特に追加のソフトウェアをインストールする方法について説明します。
まず始めに、Django Webロールを含むパッケージがクラウドサービスにアップロードされた直後に実行される、デフォルトのデプロイ処理の内容について説明します。プロジェクトフォルダ内にあるファイルServiceDefinition.csdefをテキストエディタで開くと、以下の記述を確認することができます。
<Startup>
<Task commandLine="Microsoft.PythonTools.AzureSetup.exe" executionContext="elevated">
<Environment>
<Variable name="EMULATED">
<RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
</Variable>
</Environment>
</Task>
</Startup>
これは「スタートアップタスク」と呼ばれる、デプロイ開始の時点でインスタンス上で実行される初期化処理設定に関する記述です。Microsoft.PythonTools.AzureSetup.exeという名前の初期化処理モジュールが実行されるように記述されています。
このMicrosoft.PythonTools.AzureSetup.exeは、Windows Azure PowerShellまたはPTVSでDjango Webロールを作成した場合に、Webロール/binに生成されるデフォルトのデプロイ用モジュールです。このモジュールによる処理内容は主に、
になります。
GUI版のWebPIについてはSDKをインストールするで紹介しましたが、上記の通り、クラウドサービスへのデプロイ処理ではそのコマンドライン版を使用してPythonやDjangoのインストールが行われます。
GUI版WebPIからも確認できるように、WebPIからはPythonやDjangoだけでなく、IISやSQLデータベースを活用するために有用な多くのソフトウェアを導入することができます。Windows Azure SQL データベースを使用するでは、SQL Server 2012 ExpressをインストールすることでSQL Serverのドライバを導入しました。現在のWindows Azure SQL データベースはSQL Server 2012がベースとなっていますが、クラウドサービスのインスタンスに標準装備されているSQL Serverドライバは旧世代のSQL Server 2008版(SQL Server Native Client 10.0)ですので、クラウドサービス上でも新しいSQL Server 2012版のドライバを使用できればそれに越したことはありません。
そして実際にそれを行うための手段が提供されています。Webロール/binにあるファイルAzureSetup.cfgをテキストエディタで開き、webpi_installプロパティの値の末尾に、以下のように、「,SQLNativeClient」と追記してください。
webpi_install=https://www.microsoft.com/web/webpi/4.0/toolsproductlist.xml;Django,SQLNativeClient
これによりインスタンス上でデプロイ処理が実行される際に、Djangoに加えてSQL Server 2012のドライバ(SQL Server Native Client 11.0)もWebPI経由でダウンロード・インストールされるようになります。なおPython・distribute・pipについてはWebPIではDjangoの依存パッケージとなっているので、Djangoのインストールを行うことでそれらも自動的にインストールされています。
PyPIに登録されているサードパーティライブラリを利用する場合、ローカルコンピュータ上では必要に応じてeasy_installやpipを実行すれば問題ありませんが、一方でそれらのライブラリはローカルのPythonインタプリタに対してインストールされるため、クラウドサービスにデプロイするパッケージの中には含まれません。そのため、それらのライブラリをクラウドサービス上でも使用するためには、
という2通りの方法が考えられます。前者の方法については、小規模なライブラリであれば問題ないかもしれませんが、巨大なライブラリや依存関係を持つライブラリの場合はアプリケーションのメンテナンスを難しくしてしまうかもしれません。そこで以下では、後者を実現する方法について説明します。
上述の通り、デフォルトの初期化処理が完了した時点で、Django Webロールのインスタンス上でもeasy_installやpipが利用可能な状態となります。そこで、デフォルトの初期化処理に続いて別の初期化処理を新たに追加し、その中でeasy_installやpipを使用することにより、インスタンス上のPythonインタプリタに対してPyPIからパッケージをインストールすることが可能となります。
まずServiceDefinition.csdefをテキストエディタで開き、Startup要素内にすでに記述されているデフォルトの初期化処理に続いてもうひとつ、以下のようにTask要素を追記します。
<Task commandLine="mysetup.bat" executionContext="elevated" >
<Environment>
<Variable name="EMULATED">
<RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" />
</Variable>
</Environment>
</Task>
初期化処理は任意の言語で実装することが可能ですが、単純な処理内容であればWindowsバッチファイルとして実装するのがおそらく最も手軽でしょう。Webロール/binの中にmysetup.batという名前のファイルを作成し、テキストエディタで以下のように編集します。
@echo off
if "%EMULATED%"=="true" goto :EOF
%SystemDrive%\Python27\Scripts\easy_install -Z pyodbc
クラウドサービスのインスタンス上では、Pythonインタプリタは%SystemDrive%\Python27フォルダに、easy_installとpipはその中のScriptsフォルダに導入されています。なおスタートアップタスクは実際のクラウド環境へのデプロイ時だけでなく、ローカルコンピュータのWindows Azureエミュレータ上でのアプリケーション実行時にも起動されます。ローカルコンピュータ上では必要なライブラリを予めeasy_installやpipでインストールしていることがほとんどだと思いますので、Windows Azureエミュレータ上で実行される場合は何もせず終了、そうでない場合はPyPIからpyodbcをインストールするという単純な処理が上記のバッチファイルの内容です。なおpyodbcパッケージにはビルド済みのWindowsネイティブライブラリが含まれますので、pipではなくeasy_installでインストールしています。
ノート
Windows Azureエミュレータから使用されるローカルコンピュータ上のPython環境も含め、easy_installでパッケージをインストールする場合は、Zip圧縮を展開(-Zオプションを付与)してインストールすることをお勧めします。これは、デプロイ完了後のアプリケーション実行時に、IISの実行ユーザに付与されているファイルアクセスの権限では、圧縮されているパッケージを所定のキャッシュフォルダ内に展開できない場合があるためです。
上記ではeays_installによるインストールを紹介しましたが、同様にしてpipも使用可能です。requirementsファイルを作成してpipの入力に使用することもできます。例としてazureとdjango-pyodbc-azureの各パッケージをpipでインストールしてみましょう。mysetup.batと同じフォルダ内に、以下の内容でrequirements.txtを作成してください。
azure
django-pyodbc-azure
続いて、mysetup.batに以下の1行を追記します。
%SystemDrive%\Python27\Scripts\pip install -r requirements.txt
また必要であればWebPIでインストールされたDjangoをより新しいバージョンに更新することも可能です。
%SystemDrive%\Python27\Scripts\pip install -U django==1.5.1
ただし上記を行いたい場合は、他のWebアプリケーションフレームワークを使用するで後述するように、Webロール/bin/AzureSetup.cfgを編集してWebPIによるインストールからDjangoを除外し、代わりにrequirements.txtにDjangoを追記することで、Djangoのインストール回数を新しいバージョンを対象とする1回のみで済ませるほうがスマートでしょう。
ではこの状態でもう一度パッケージを作成し、管理ポータルから、ステージング環境で稼働中のアプリケーションに対する更新デプロイを行ってみましょう。更新デプロイの完了後にリモートデスクトップでインスタンスにログインして確認すると、以下のようにPyPIのライブラリが導入された状態となっているはずです。
ODBCデータソースの画面からも、以下のとおりSQL Server 2012のドライバが追加されていることを確認できます。