しばやん雑記

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

Azure Web Apps で環境変数 PATH が変更可能になっていた

久し振りに Kudu の Wiki を眺めていると、XDT のサンプルに環境変数を弄るものがありました。

Xdt transform samples · projectkudu/kudu Wiki · GitHub

system.webServer/runtime 要素で環境変数の追加、変更が可能になっています。XML スキーマが分からないので、他にどのような設定があるのか分かりませんが、今のところ環境変数のみのようです。

面白いことに、これまではバッチファイルなどを使わないと弄れなかった PATH が変更可能になっています。

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.webServer>
    <runtime xdt:Transform="InsertIfMissing">
      <environmentVariables xdt:Transform="InsertIfMissing">
        <add name="PATH" value="%PATH%;%HOME%\site\lib" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" />
      </environmentVariables>
    </runtime>
  </system.webServer>
</configuration>

このような XDT を書くと、PATH に D:\home\site\lib を追加することが出来ます。当然ながらプロセス単位の環境変数ですが、ランタイムなどに依存する外部アプリケーションを実行する場合に便利そうです。

PATH の操作を行いたいシチュエーション No.1 は、Strawberry Perl を Web Apps で使う時かなと思ったので、実際に Perl をインストールして試してみました。デフォルトでは PATH を変更できないので、MySQL のドライバの読み込みに失敗していました。

ちょっと前に Perl アプリケーションを Web Apps にデプロイする方法が、Kudu の Wiki に追加されました。

折角なので、書いてある通りの手順を実行してみます。実行する Perl スクリプトは以下のような感じです。

print "Content-type: text/html\n\n";
print "Hello from Perl on Windows!\n";
print "<br />";
print $ENV{PATH};
print "<br />";
print "OK";

PATH を表示するだけの、何の変哲もない単純なスクリプトです。

ちなみに Kudu の Wiki に書いてある方法は FastCGI として動かす方法になります。

FastCGI として動かした場合

Wiki に書いてある通りに FastCGI として実行した場合の結果が以下になります。

何故か PATH が取れませんでした。理由が分からないので Kudu の Process Explorer から環境変数を確認してみたところ、CGI で使われる環境変数に全て置き換わっていました。

ちなみに同じ FastCGI で動く PHP 5.6 の場合は、問題なく PATH が設定されていました。

よくわからない挙動ですが、Perl の FastCGI モジュール固有のようです。

CGI として動かした場合

FastCGI がよくわからない挙動だったので、何となく CGI として実行してみると、今度は PATH の値は取れていますが XDT で設定したはずの値は設定されていませんでした。

これは CgiModule と Kudu のカスタムモジュールの実行順序かなという気がします。同じように XDT でモジュールの実行順序を入れ替えれば動くかもしれません。

Web Apps でお手軽に Movable Type を動かすには、なかなかに険しい道のようです。