Application Gateway での App Service に関する問題のトラブルシューティングTroubleshoot App Service issues in Application Gateway

Azure Application Gateway と共に Azure App Service をバックエンド ターゲットとして使用するときに発生する問題を診断し、解決する方法について説明します。Learn how to diagnose and resolve issues you might encounter when Azure App Service is used as a back-end target with Azure Application Gateway.

概要Overview

この記事では、次の問題のトラブルシューティング方法について説明します。In this article, you'll learn how to troubleshoot the following issues:

  • リダイレクトが生じたときに App Service URL がブラウザーに公開されます。The app service URL is exposed in the browser when there's a redirection.
  • App Service の ARRAffinity Cookie ドメインが元のホストではなく App Service のホスト名 (example.azurewebsites.net) に設定されます。The app service ARRAffinity cookie domain is set to the app service host name, example.azurewebsites.net, instead of the original host.

バックエンド アプリケーションでリダイレクト応答が送信されるとき、バックエンド アプリケーションで指定されているものとは別の URL にクライアントをリダイレクトしたい場合があります。When a back-end application sends a redirection response, you might want to redirect the client to a different URL than the one specified by the back-end application. App Service が Application Gateway の背後でホストされており、クライアントに相対パスへのリダイレクトを行わせる必要があるときに、これを行うことがあります。You might want to do this when an app service is hosted behind an application gateway and requires the client to do a redirection to its relative path. たとえば、contoso.azurewebsites.net/path1 から contoso.azurewebsites.net/path2 へのリダイレクトです。An example is a redirect from contoso.azurewebsites.net/path1 to contoso.azurewebsites.net/path2.

App Service では、リダイレクト応答を送信するとき、その応答の location ヘッダーで、アプリケーション ゲートウェイから受信した要求のものと同じホスト名が使用されます。When the app service sends a redirection response, it uses the same host name in the location header of its response as the one in the request it receives from the application gateway. たとえば、クライアントでは、Application Gateway contoso.com/path2 を経由するのではなく、contoso.azurewebsites.net/path2 に直接要求を行います。For example, the client makes the request directly to contoso.azurewebsites.net/path2 instead of going through the application gateway contoso.com/path2. Application Gateway の迂回は望まれません。You don't want to bypass the application gateway.

この問題は次のような主な理由から発生することがあります。This issue might happen for the following main reasons:

  • App Service でリダイレクトを構成しています。You have redirection configured on your app service. 要求の末尾にスラッシュを追加するだけでリダイレクトが実行される場合があります。Redirection can be as simple as adding a trailing slash to the request.
  • 導入している Azure Active Directory 認証がリダイレクトを発生させます。You have Azure Active Directory authentication, which causes the redirection.

また、Application Gateway の背後で App Service を使用するとき、Application Gateway (example.com) に関連付けられているドメイン名が App Service のドメイン名と異なっています (たとえば、example.azurewebsites.net になっています)。Also, when you use app services behind an application gateway, the domain name associated with the application gateway (example.com) is different from the domain name of the app service (say, example.azurewebsites.net). App Service によって設定された ARRAffinity Cookie のドメイン値では example.azurewebsites.net というドメイン名が保持されますが、それは望ましくありません。The domain value for the ARRAffinity cookie set by the app service carries the example.azurewebsites.net domain name, which isn't desirable. Cookie のドメイン名の値は、元のホスト名 (example.com) である必要があります。The original host name, example.com, should be the domain name value in the cookie.

サンプル構成Sample configuration

  • HTTP リスナー:基本またはマルチサイトHTTP listener: Basic or multi-site
  • バックエンド アドレス プール:App ServiceBack-end address pool: App Service
  • HTTP 設定: [Pick Hostname from Backend Address](バックエンド アドレスからホスト名を選択する) を有効にしますHTTP settings: Pick Hostname from Backend Address enabled
  • プローブ: [Pick Hostname from HTTP Settings](HTTP 設定からホスト名を選択する) を有効にしますProbe: Pick Hostname from HTTP Settings enabled

原因Cause

App Service はマルチテナント サービスであるため、要求のホスト ヘッダーを使用して適切なエンドポイントに要求をルーティングします。App Service is a multitenant service, so it uses the host header in the request to route the request to the correct endpoint. App Service の既定のドメイン名である *.azurewebsites.net (たとえば contoso.azurewebsites.net) は、Application Gateway のドメイン名 (たとえば contoso.com) とは異なります。The default domain name of App Services, *.azurewebsites.net (say, contoso.azurewebsites.net), is different from the application gateway's domain name (say, contoso.com).

クライアントからの元の要求には、ホスト名として Application Gateway のドメイン名 (contoso.com) があります。The original request from the client has the application gateway's domain name, contoso.com, as the host name. App Service バックエンドに要求をルーティングするとき、元の要求にあるホスト名を App Service のホスト名に変更するように Application Gateway を構成する必要があります。You need to configure the application gateway to change the host name in the original request to the app service's host name when it routes the request to the app service back end. Application Gateway の HTTP 設定構成にある [Pick Hostname from Backend Address](バックエンド アドレスからホスト名を選択する) というスイッチを使用します。Use the switch Pick Hostname from Backend Address in the application gateway's HTTP setting configuration. 正常性プローブ構成にある [Pick Hostname from Backend HTTP Settings](バックエンド HTTP 設定からホスト名を選択する) というスイッチを使用します。Use the switch Pick Hostname from Backend HTTP Settings in the health probe configuration.

アプリケーション ゲートウェイでホスト名が変更される

App Service でリダイレクトが実行されるときは、特に構成されていない限り、location ヘッダーには元のホスト名 contoso.com ではなくオーバーライドされたホスト名 contoso.azurewebsites.net が使用されます。When the app service does a redirection, it uses the overridden host name contoso.azurewebsites.net in the location header instead of the original host name contoso.com, unless configured otherwise. 次の要求と応答のヘッダー例を参照してください。Check the following example request and response headers.

## Request headers to Application Gateway:

Request URL: http://www.contoso.com/path

Request Method: GET

Host: www.contoso.com

## Response headers:

Status Code: 301 Moved Permanently

Location: http://contoso.azurewebsites.net/path/

Server: Microsoft-IIS/10.0

Set-Cookie: ARRAffinity=b5b1b14066f35b3e4533a1974cacfbbd969bf1960b6518aa2c2e2619700e4010;Path=/;HttpOnly;Domain=contoso.azurewebsites.net

X-Powered-By: ASP.NET

前の例では、応答ヘッダーにリダイレクトの状態コード 301 があることがわかります。In the previous example, notice that the response header has a status code of 301 for redirection. location ヘッダーには、元のホスト名 www.contoso.com ではなく、App Service のホスト名があります。The location header has the app service’s host name instead of the original host name www.contoso.com.

解決方法:location ヘッダーを書き換えるSolution: Rewrite the location header

location ヘッダーのホスト名をアプリケーション ゲートウェイのドメイン名に設定します。Set the host name in the location header to the application gateway's domain name. これを行うには、応答の location ヘッダーに azurewebsites.net が含まれているかどうかを評価する条件で書き換え規則を作成します。To do this, create a rewrite rule with a condition that evaluates if the location header in the response contains azurewebsites.net. また、location ヘッダーを書き換えてアプリケーション ゲートウェイのホスト名を含めるようにするアクションも、これによって実行する必要があります。It must also perform an action to rewrite the location header to have the application gateway's host name. 詳細は、location ヘッダーの書き換え方法に関する記事の手順を参照してください。For more information, see instructions on how to rewrite the location header.

注意

HTTP ヘッダーの書き換えのサポートは、Application Gateway の Standard_v2 と WAF_v2 SKU でのみ利用できます。The HTTP header rewrite support is only available for the Standard_v2 and WAF_v2 SKU of Application Gateway. v1 SKU を使用する場合、v1 から v2 に移行することをお勧めします。If you use v1 SKU, we recommend that you migrate from v1 to v2. v2 SKU で利用できる書き換えやその他の高度な機能を使用することがあります。You want to use rewrite and other advanced capabilities that are available with v2 SKU.

代替ソリューション:カスタム ドメイン名の使用Alternate solution: Use a custom domain name

v1 SKU を使用する場合、location ヘッダーを書き換えることはできません。If you use v1 SKU, you can't rewrite the location header. この機能は v2 SKU でのみ利用できます。This capability is only available for v2 SKU. リダイレクトの問題を解決するには、ホストのオーバーライドの代わりに、Application Gateway で受信されるのと同じホスト名を App Service に渡します。To resolve the redirection issue, pass the same host name that the application gateway receives to the app service as well, instead of doing a host override.

(リダイレクトがある場合) App Service は、Application Gateway を指し、自ホストではない、元の同じホスト ヘッダーに対してリダイレクトを行うようになります。The app service now does the redirection (if any) on the same original host header that points to the application gateway and not its own.

カスタム ドメインを所有していることと、このプロセスに従うことが必要になります。You must own a custom domain and follow this process:

  • App Service のカスタム ドメイン一覧にドメインを登録します。Register the domain to the custom domain list of the app service. App Service の FQDN を指す CNAME がカスタム ドメインに必要です。You must have a CNAME in your custom domain that points to the app service's FQDN. 詳細については、「既存のカスタム DNS 名を Azure App Service にマップする」を参照してください。For more information, see Map an existing custom DNS name to Azure App Service.

    App Service のカスタムドメインの一覧

  • App Service では、ホスト名 www.contoso.com を受け取る準備ができています。Your app service is ready to accept the host name www.contoso.com. DNS の CNAME エントリを変更して Application Gateway の FQDN (例えば appgw.eastus.cloudapp.azure.com) を指すようにします。Change your CNAME entry in DNS to point it back to the application gateway's FQDN, for example, appgw.eastus.cloudapp.azure.com.

  • DNS クエリの実行時、ドメイン www.contoso.com が Application Gateway の FQDN に解決されることを確認します。Make sure that your domain www.contoso.com resolves to the application gateway's FQDN when you do a DNS query.

  • [Pick Hostname from Backend HTTP Settings](バックエンド HTTP 設定からホスト名を選択する) を無効にするようにカスタム プローブを設定します。Set your custom probe to disable Pick Hostname from Backend HTTP Settings. Azure portal で、プローブ設定でこのチェック ボックスをオフにします。In the Azure portal, clear the check box in the probe settings. PowerShell では、Set-AzApplicationGatewayProbeConfig コマンドで -PickHostNameFromBackendHttpSettings スイッチを使用しないでください。In PowerShell, don't use the -PickHostNameFromBackendHttpSettings switch in the Set-AzApplicationGatewayProbeConfig command. プローブのホスト名フィールドに、App Service の FQDN、example.azurewebsites.net を入力します。In the host name field of the probe, enter your app service's FQDN, example.azurewebsites.net. Application Gateway から送信されたプローブ要求のホスト ヘッダーにこの FQDN が含まれます。The probe requests sent from the application gateway carry this FQDN in the host header.

    注意

    次の手順のために、カスタム プローブがバックエンド HTTP 設定に関連付けられていないことを確認します。For the next step, make sure that your custom probe isn't associated to your back-end HTTP settings. HTTP 設定では、この時点で [Pick Hostname from Backend Address](バックエンド アドレスからホスト名を選択する) スイッチはまだ有効です。Your HTTP settings still have the Pick Hostname from Backend Address switch enabled at this point.

  • [Pick Hostname from Backend Address](バックエンド アドレスからホスト名を選択する) を無効にするように Application Gateway の HTTP 設定を指定します。Set your application gateway’s HTTP settings to disable Pick Hostname from Backend Address. Azure portal でこのチェック ボックスをオフにします。In the Azure portal, clear the check box. PowerShell では、Set-AzApplicationGatewayBackendHttpSettings コマンドで -PickHostNameFromBackendAddress スイッチを使用しないでください。In PowerShell, don't use the -PickHostNameFromBackendAddress switch in the Set-AzApplicationGatewayBackendHttpSettings command.

  • カスタム プローブを元どおりバックエンドの HTTP 設定に関連付け、バックエンドが正常であることを確認します。Associate the custom probe back to the back-end HTTP settings, and verify that the back end is healthy.

  • Application Gateway からは同じホスト名 (www.contoso.com) が App Service に転送されるようになったはずです。The application gateway should now forward the same host name, www.contoso.com, to the app service. リダイレクトは同じホスト名で行われます。The redirection happens on the same host name. 次の要求と応答のヘッダー例を参照してください。Check the following example request and response headers.

既存の構成に対し、PowerShell を使用して前述の手順を実装するには、下のサンプル PowerShell スクリプトを使用します。To implement the previous steps using PowerShell for an existing setup, use the sample PowerShell script that follows. Probe と HTTP Settings の構成に -PickHostname スイッチを使用していないことに注目してください。Note how we haven't used the -PickHostname switches in the probe and HTTP settings configuration.

$gw=Get-AzApplicationGateway -Name AppGw1 -ResourceGroupName AppGwRG
Set-AzApplicationGatewayProbeConfig -ApplicationGateway $gw -Name AppServiceProbe -Protocol Http -HostName "example.azurewebsites.net" -Path "/" -Interval 30 -Timeout 30 -UnhealthyThreshold 3
$probe=Get-AzApplicationGatewayProbeConfig -Name AppServiceProbe -ApplicationGateway $gw
Set-AzApplicationGatewayBackendHttpSettings -Name appgwhttpsettings -ApplicationGateway $gw -Port 80 -Protocol Http -CookieBasedAffinity Disabled -Probe $probe -RequestTimeout 30
Set-AzApplicationGateway -ApplicationGateway $gw
## Request headers to Application Gateway:

Request URL: http://www.contoso.com/path

Request Method: GET

Host: www.contoso.com

## Response headers:

Status Code: 301 Moved Permanently

Location: http://www.contoso.com/path/

Server: Microsoft-IIS/10.0

Set-Cookie: ARRAffinity=b5b1b14066f35b3e4533a1974cacfbbd969bf1960b6518aa2c2e2619700e4010;Path=/;HttpOnly;Domain=www.contoso.com

X-Powered-By: ASP.NET

次の手順Next steps

前の手順で問題を解決できなかった場合、サポート チケットを開きます。If the preceding steps didn't resolve the issue, open a support ticket.