しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Web Apps で HttpPlatformHandler を foreman っぽく使えるバッチファイルを作った

Azure Web Apps で Hubot を動かした時に、HttpPlatformHandler が実行するアプリケーションを Procfile から読み込むようにしましたが、もうちょっと汎用的に作れる気がしたので修正してみました。

foreman のパチモンなので pseudo-foreman という名前でリポジトリ作っておきました。中には Hubot のサンプルも入れてあるので、Azure Web Apps で動かす時の参考にどうぞ。

Web.config で HttpPlatformHandler の設定を行い、実行される startup.cmd が Procfile を読み込んで、アプリケーションを実行するだけのシンプルなものです。

リポジトリにも 2 つのファイルしか置いてありません。

利用方法は startup.cmd と Web.config をコピーして、Azure Web Apps にデプロイするだけです。

ポート番号は HTTP_PLATFORM_PORT と PORT 両方の環境変数から取れますが、Procfile 内で参照は出来ない仕様になってます。このあたりは何とかしたいです。

苦労した点と HttpPlatformHandler の制約

そもそも HttpPlatformHandler を使う上での問題点が、起動されるプロセスのカレントディレクトリが D:\Windows\System32 になることです。基本的にドキュメントルートをカレントディレクトリとして動かす前提のアプリケーションが多いので、この挙動をまずは何とかする必要があります。

回避方法は、単純に cd でカレントディレクトリを移動させることです。これで大体は解決します。

SET WWWROOT_DIR=%~dp0

cd /d %WWWROOT_DIR%

そして、Azure Web Apps としての制約として環境変数 PATH を変更できないというのがあります。これはシステムにインストールされることが前提となる Strawberry Perl を使う場合などに問題となります。

システムの環境変数は弄れなくてもプロセス単位なら弄れるので、以下のようにして PATH_EXTEND が設定されているときに PATH に追加するようにしておきます。

IF DEFINED PATH_EXTEND (
  SET "PATH=%PATH_EXTEND%;%PATH%"
)

Hubot の時には coffee-script をグローバルでインストール出来なかったので node_modules\.bin へパスを通すコードを書いておきましたが、PATH_EXTEND という名前でポータルから設定すればパスが通ります。

これで HttpPlatformHandler で何かを動かすことが少し楽になりました。カスタムデプロイスクリプトと組み合わせることで、新しいプラットフォームにも比較的楽に対応出来ると思います。