Posted at

Azure App Serviceにpipを使用できないパッケージをインストールする

More than 1 year has passed since last update.


はじめに

Azure App ServiceにPythonアプリケーションをデプロイする際、wheelによるコンパイルが必要なパッケージのインストールに大変苦戦したので、メモを残しておきます :pencil2::notebook: 読者対象として、Azure App Serviceの概要やGitによるデプロイ方法について知っている方を想定しています。前提知識がない方は、Azure App Service Web Apps による Python の構成Azure での Django を使用した Web アプリの作成のページを最初にご覧ください。

なお、今回は以下の環境にパッケージをインストールしています。


  • Python 3.4.1 32bit(既定でApp Serviceに用意されている環境)

  • azure-storage 0.34.3

  • django-pyodbc-azure 1.11

  • django 1.11


デプロイエラー

wheelが必要なパッケージをインストールする際、公式ドキュメントを参考に何度デプロイしても、以下のようなエラーが発生して困っていました。今回はこのエラーを解消していきます。

remote:   Running setup.py install for pyodbc

remote: building 'pyodbc' extension
remote: error: Unable to find vcvarsall.bat
remote: Complete output from command D:\home\site\wwwroot\env\Scripts\python.exe -c "import setuptools, tokenize;__file__='D:\\home\\site\\wwwroot\\env\\build\\pyodbc\\setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record D:\local\Temp\pip-okpfh2du-record\install-record.txt --single-version-externally-managed --compile --install-headers D:\home\site\wwwroot\env\include\site\python3.4:
remote: running install
remote:
remote: running build
remote:
remote: running build_ext
remote:
remote: building 'pyodbc' extension
remote:
remote: error: Unable to find vcvarsall.bat
remote:
remote: ----------------------------------------


wheelによるローカルビルドとファイルリネーム

Azure App Serviceはサンドボックス環境となっています。そのため、CやC++をラッパーして作られたライブラリをpipでインストールできません。それらのパッケージをインストールするには、wheelによる事前ビルドが必要になります。また、ビルドするPython環境はApp Serviceと同一のプラットフォーム/アーキテクチャ/バージョンである必要があります。つまり、Windows上にPython 2.7 32bitか 3.4 32bitが求められます。また、C++の環境もPython 2.7用とPython 3用で異なるので注意してください。環境が準備できたら、以下のコマンドを実行します。

python -m pip install --upgrade pip

pip install wheel
pip wheel azure-storage
pip wheel django-pyodbc-azure

上記コマンドを実行すると、.whlファイルが生成されるので、デプロイ予定のアプリケーションのルートディレクトリにwheelhouseフォルダーを作成してそこにコピーします。

続いて、コピーした.whlファイルの一部をリネームします。ここが最大のつまずきポイントでしたが、App Serviceのデプロイメントはnoneタグしかサポートされていません :confounded: (GithubのIssueを漁って、やっとたどり着きました。。。)そこで、cryptography-1.5.2-cp34-cp34m-win32.whl => cryptography-1.5.2-cp34-none-win32.whlといった形で、ファイル名に含まれるcp34mnoneにリネームします。今回インストールしたパッケージでは、cryptographyとcffi、pyodbcがリネーム対象となりました。私と異なるパッケージをインストールする場合でも、.whlファイルにnoneが含まれていなければ怪しいと思っていください。


requirements.txtの修正

次に、requirements.txtの先頭に--find-links wheelhouseを追加します。これでGitデプロイした際にパッケージをwheelhouse内から検索してくれるようになります。なお、requirements.txtは以下のようになります。

--find-links wheelhouse

django==1.11
azure-storage==0.34.3
django-pyodbc-azure==1.11

あとは、変更をGitでプルすれば、インストール環境です。


最後に

Azure App Serviceは大変便利ですがパッケージインストールに癖がありますね。。。C#やNode.jsで作成したアプリのデプロイの方がだいぶ簡単な印象を持ちました。