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. v2 SKU で利用可能なヘッダーの書き換えやその他の高度な機能を使用するには、v2 に移行することをお勧めします。We recommend migrating to v2 for Header Rewrite and other advanced capabilities that are available with v2 SKU.

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

App Service のカスタム ドメイン機能を使用することは、トラフィックを Application Gateway のドメイン名 (この例では www.contoso.com) に常にリダイレクトするためのもう 1 つのソリューションです。Using App Service's Custom Domain feature is another solution to always redirect the traffic to Application Gateway's domain name (www.contoso.com in our example). この構成は、ARR Affinity Cookie の問題の解決策としても機能します。This configuration also serves as a solution for the ARR Affinity cookie problem. 既定では、ARRAffinity Cookie ドメインは、Application Gateway のドメイン名ではなく、App Service の既定のホスト名 (example.azurewebsites.net) に設定されます。By default, the ARRAffinity cookie domain is set to the App Service's default host name (example.azurewebsites.net) instead of the Application Gateway's domain name. そのため、そのような場合、ブラウザーでは、要求と Cookie のドメイン名の違いによって Cookie が拒否されます。Therefore, the browser in such cases will reject the cookie due to the difference in the domain names of the request and the cookie.

リダイレクトと ARRAffinity の Cookie ドメイン不一致の両方の問題については、所定の方法に従うことができます。You can follow the given method for both the Redirection and ARRAffinity's cookie domain mismatch issues. この方法では、カスタム ドメインの DNS ゾーンへのアクセス権が必要になります。This method will need you to have your custom domain's DNS zone access.

手順 1: App Service でカスタム ドメインを設定し、CNAME および TXT DNS レコードを追加してドメインの所有権を確認します。Step1: Set a Custom Domain in App Service and verify the domain ownership by adding the CNAME & TXT DNS records. レコードは次のようになります。The records would look similar to

  • www.contoso.com IN CNAME contoso.azurewebsite.netwww.contoso.com IN CNAME contoso.azurewebsite.net
  • asuid.www.contoso.com IN TXT "<verification id string>"asuid.www.contoso.com IN TXT "<verification id string>"

手順 2: 前の手順の CNAME レコードは、ドメインの検証にのみ必要でした。Step2: The CNAME record in the previous step was only needed for the domain verification. 最終的には、Application Gateway 経由でトラフィックをルーティングする必要があります。Ultimately, we need the traffic to route via Application Gateway. したがって、www.contoso.com の CNAME を、Application Gateway の FQDN を指すように変更できます。You can thus modify www.contoso.com's CNAME now to point to Application Gateway's FQDN. Application Gateway の FQDN を設定するには、そのパブリック IP アドレス リソースに移動し、それに "DNS 名ラベル" を割り当てます。To set a FQDN for your Application Gateway, navigate to its Public IP address resource and assign a "DNS Name label" for it. 更新された CNAME レコードは次のようになります。The updated CNAME record should now look as

  • www.contoso.com IN CNAME contoso.eastus.cloudapp.azure.comwww.contoso.com IN CNAME contoso.eastus.cloudapp.azure.com

手順 3: 関連する HTTP 設定の [Pick Hostname from Backend Address](バックエンド アドレスからホスト名を選択する) を無効にします。Step3: Disable "Pick Hostname from Backend Address" for the associated HTTP Setting.

PowerShell では、Set-AzApplicationGatewayBackendHttpSettings コマンドで -PickHostNameFromBackendAddress スイッチを使用しないでください。In PowerShell, don't use the -PickHostNameFromBackendAddress switch in the Set-AzApplicationGatewayBackendHttpSettings command.

手順 4: プローブによって、バックエンドが正常で、運用可能なトラフィックであると判断されるためには、ホスト フィールドを App Service のカスタムまたは既定のドメインに指定して、カスタムの正常性プローブを設定します。Step4: For the probes to determine the backend as healthy and an operational traffic, set a custom Health Probe with Host field as custom or default domain of the App Service.

PowerShell では、Set-AzApplicationGatewayProbeConfig コマンドで -PickHostNameFromBackendHttpSettings スイッチを使用せずに、プローブの -HostName スイッチで App Service のカスタムまたは既定のドメインを使用してください。In PowerShell, don't use the -PickHostNameFromBackendHttpSettings switch in the Set-AzApplicationGatewayProbeConfig command and use either the custom or default domain of the App Service in the -HostName switch of the probe.

既存の構成に対し、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.