======================
デプロイ処理を追加する
======================
Windows Azure PowerShell(またはPTVS)で作成した、Djangoアプリケーションを含む
クラウドサービスプロジェクトは、作成された直後の状態でデプロイしてもひとまずDjangoの動作を確認できることは
:doc:`deploy_application` で説明した通りですが、実際のアプリケーションを動かすうえでは不十分な点もあります。
以下では、クラウドサービスのインスタンス上で必要となるセットアップ、特に追加のソフトウェアを
インストールする方法について説明します。
デフォルトのデプロイ処理内容
============================
まず始めに、Django Webロールを含むパッケージがクラウドサービスにアップロードされた直後に実行される、
デフォルトのデプロイ処理の内容について説明します。プロジェクトフォルダ内にあるファイル
``ServiceDefinition.csdef`` をテキストエディタで開くと、以下の記述を確認することができます。
.. code-block:: xml
これは「スタートアップタスク」と呼ばれる、デプロイ開始の時点でインスタンス上で実行される
初期化処理設定に関する記述です。 ``Microsoft.PythonTools.AzureSetup.exe`` という名前の
初期化処理モジュールが実行されるように記述されています。
この ``Microsoft.PythonTools.AzureSetup.exe`` は、Windows Azure PowerShellまたはPTVSで
Django Webロールを作成した場合に、 ``Webロール/bin`` に生成されるデフォルトの
デプロイ用モジュールです。このモジュールによる処理内容は主に、
* コマンドライン版WebPIによる以下のソフトウェアのインストール
* Python 2.7.3 (32bit)
* distribute
* pip
* Django 1.4
* IISのFastCGI設定
になります。
WebPIからソフトウェアをインストールする
=======================================
GUI版のWebPIについては :doc:`install_sdk` で紹介しましたが、上記の通り、
クラウドサービスへのデプロイ処理ではそのコマンドライン版を使用して
PythonやDjangoのインストールが行われます。
GUI版WebPIからも確認できるように、WebPIからはPythonやDjangoだけでなく、
IISやSQLデータベースを活用するために有用な多くのソフトウェアを導入することができます。
:doc:`setup_sql_database` では、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** 」と追記してください。
.. code-block:: properties
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のインストールを行うことでそれらも自動的にインストールされています。
Pythonパッケージをインストールする
==================================
PyPIに登録されているサードパーティライブラリを利用する場合、ローカルコンピュータ上では
必要に応じてeasy_installやpipを実行すれば問題ありませんが、一方でそれらのライブラリは
ローカルのPythonインタプリタに対してインストールされるため、クラウドサービスにデプロイする
パッケージの中には含まれません。そのため、それらのライブラリをクラウドサービス上でも
使用するためには、
#. easy_installやpipを使用したインストールではなく、予めPyPIのWebサイトよりダウンロードしたライブラリをアプリケーションパッケージの中に含めてしまう
#. クラウドサービスへのデプロイ処理の中でeasy_installやpipを実行し、インスタンス上のPythonインタプリタにインストールする
という2通りの方法が考えられます。前者の方法については、小規模なライブラリであれば
問題ないかもしれませんが、巨大なライブラリや依存関係を持つライブラリの場合は
アプリケーションのメンテナンスを難しくしてしまうかもしれません。
そこで以下では、後者を実現する方法について説明します。
スタートアップタスクの追加
--------------------------
上述の通り、デフォルトの初期化処理が完了した時点で、Django Webロールのインスタンス上でも
easy_installやpipが利用可能な状態となります。そこで、デフォルトの初期化処理に続いて別の初期化処理を新たに追加し、
その中でeasy_installやpipを使用することにより、インスタンス上のPythonインタプリタに対してPyPIからパッケージを
インストールすることが可能となります。
まず ``ServiceDefinition.csdef`` をテキストエディタで開き、Startup要素内にすでに記述されている
デフォルトの初期化処理に続いてもうひとつ、以下のようにTask要素を追記します。
.. code-block:: xml
PyPIからのインストール
-----------------------
初期化処理は任意の言語で実装することが可能ですが、単純な処理内容であればWindowsバッチファイルとして
実装するのがおそらく最も手軽でしょう。 ``Webロール/bin`` の中に ``mysetup.bat`` という名前のファイルを作成し、
テキストエディタで以下のように編集します。
.. code-block:: 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でインストールしています。
.. note::
Windows Azureエミュレータから使用されるローカルコンピュータ上のPython環境も含め、
easy_installでパッケージをインストールする場合は、Zip圧縮を展開(-Zオプションを付与)して
インストールすることをお勧めします。これは、デプロイ完了後のアプリケーション実行時に、
IISの実行ユーザに付与されているファイルアクセスの権限では、
圧縮されているパッケージを所定のキャッシュフォルダ内に展開できない場合があるためです。
上記ではeays_installによるインストールを紹介しましたが、同様にしてpipも使用可能です。
requirementsファイルを作成してpipの入力に使用することもできます。
例としてazureとdjango-pyodbc-azureの各パッケージをpipでインストールしてみましょう。
``mysetup.bat`` と同じフォルダ内に、以下の内容で ``requirements.txt`` を作成してください。
.. code-block:: properties
azure
django-pyodbc-azure
続いて、 ``mysetup.bat`` に以下の1行を追記します。
.. code-block:: bat
%SystemDrive%\Python27\Scripts\pip install -r requirements.txt
また必要であればWebPIでインストールされたDjangoをより新しいバージョンに更新することも可能です。
.. code-block:: bat
%SystemDrive%\Python27\Scripts\pip install -U django==1.5.1
ただし上記を行いたい場合は、 :doc:`setup_other_wsgi_framework` で後述するように、
``Webロール/bin/AzureSetup.cfg`` を編集してWebPIによるインストールからDjangoを除外し、
代わりに ``requirements.txt`` にDjangoを追記することで、Djangoのインストール回数を
新しいバージョンを対象とする1回のみで済ませるほうがスマートでしょう。
ではこの状態でもう一度パッケージを作成し、管理ポータルから、ステージング環境で稼働中の
アプリケーションに対する更新デプロイを行ってみましょう。
更新デプロイの完了後にリモートデスクトップでインスタンスにログインして確認すると、
以下のようにPyPIのライブラリが導入された状態となっているはずです。
.. image:: images/install_python_packages/164.png
:width: 468
:height: 232
ODBCデータソースの画面からも、以下のとおりSQL Server 2012のドライバが
追加されていることを確認できます。
.. image:: images/install_python_packages/166.png