読者です 読者をやめる 読者になる 読者になる

しばやん雑記

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

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

Azure Web Apps

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

f:id:shiba-yan:20150707003301p:plain

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

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

f:id:shiba-yan:20150707003310p:plain

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

f:id:shiba-yan:20150719141545p:plain

これまでデプロイスロットを取得するには 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 で見れなくなりました。

f:id:shiba-yan:20150719143411p:plain

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

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