しばやん雑記

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

Azure Web Apps にソース管理からデプロイするとスロット名を環境変数から取れる

何時からか分かりませんが、Azure Web Apps に GitHub などのソース管理からアプリケーションのデプロイした場合、環境変数から現在のデプロイスロットを取得できるようになっていました。

App Service Plan を標準にしなくても Production スロットが 1 つ存在するという扱いになるようです。

そして App Service Plan を標準へとアップグレードを行い、ステージングスロットを作成してみた様子です。ちゃんと WEBSITE_SLOT_NAME 環境変数の値は Staging となっています。

ちなみに手動でデプロイした場合や、Visual Studio からデプロイした場合には環境変数が存在しません。

これまでデプロイスロットを取得するには URL を見るしかなかったのが、スロット名を環境変数で取れるようになったのは嬉しいですね。ただし、URL Rewrite を使ったアクセス制限は実現できません。

Azure Web Sites - block web access to non-production deployment slots - RuslanY Blog

URL Rewrite はそのままだと環境変数の値を見ることが出来ないので、WEBSITE_SLOT_NAME 環境変数を条件にルールを作成できないのが理由です。

仮想マシンであれば以下のように URL Rewrite にプロバイダーを追加することで対応は可能です。

実際には Web Apps の場合 GAC にインストールとか不可能なので、諦めて Global.asax や HTTP Module などで処理しましょう。Production 以外の場合には 403 を返すだけです。

protected void Application_BeginRequest(object sender, EventArgs e)
{
    var slotName = Environment.GetEnvironmentVariable("WEBSITE_SLOT_NAME") ?? "Production";

    if (slotName != "Production")
    {
        Response.StatusCode = 403;
        Response.End();
    }
}

今回は Global.asax に書きましたが、基本的に HTTP Module の場合も同じです。

これを Web Apps にデプロイしてステージングサイトにアクセスすると、403 で見れなくなりました。

実際には表示可能な IP アドレスを設定可能にするべきなんでしょうけど、サンプルということで。

やはり理想としては URL Rewrite で環境変数の値を見れるようにしたいですね。