Configuración de App Service con Application Gateway
Artículo
Application Gateway le permite tener una aplicación de App Service u otro servicio multiinquilino como miembro del grupo de back-end. En este artículo, aprenderá a configurar una aplicación de App Service con Application Gateway. La configuración de Application Gateway variará en función de cómo se acceda a App Service:
La primera opción usa un dominio personalizado tanto en Application Gateway como en App Service en back-end.
La segunda opción es hacer que Application Gateway acceda a App Service mediante su dominio predeterminado, con el sufijo ".azurewebsites.net".
Esta configuración se recomienda para escenarios de nivel de producción y cumple la práctica de no cambiar el nombre de host en el flujo de solicitud. Debe tener un dominio personalizado (y un certificado asociado) disponible para evitar tener que confiar en el dominio ".azurewebsites" predeterminado.
Al asociar el mismo nombre de dominio a Application Gateway y App Service en el grupo de back-end, el flujo de solicitud no necesita invalidar el nombre de host. La aplicación web de back-end verá el host original tal como lo usó el cliente.
Esta configuración es la más sencilla y no requiere un dominio personalizado. Por lo tanto, permite una configuración rápida y cómoda.
Advertencia
Esta configuración presenta algunas limitaciones. Se recomienda revisar las implicaciones de usar nombres de host diferentes entre el cliente y Application Gateway y entre Application Gateway y App Service en back-end. Para más información, consulte el artículo del Centro de arquitectura: Conservar el nombre de host HTTP original entre un proxy inverso y su aplicación web back-end
Cuando App Service no tiene un dominio personalizado asociado, el encabezado de host de la solicitud entrante en la aplicación web deberá establecerse en el dominio predeterminado, con el sufijo ".azurewebsites.net", o la plataforma no podrá enrutar correctamente la solicitud.
El encabezado de host en la solicitud original recibida por Application Gateway será diferente del nombre de host de App Service de back-end.
En este artículo, aprenderá a:
Configurar el DNS
Agregar App Service como grupo de back-end a Application Gateway
Configurar los valores de HTTP para la conexión a App Service
Un nombre de dominio personalizado y un certificado asociado (firmado por una entidad conocida), almacenados en Key Vault. Para obtener más información sobre cómo almacenar certificados en Key Vault, consulte Tutorial: Importación de un certificado en Azure Key Vault
Enrute el usuario o el cliente a Application Gateway mediante el dominio personalizado. Configure DNS mediante un alias CNAME que apunte al DNS para Application Gateway. La dirección DNS de Application Gateway se muestra en la página de información general de la dirección IP pública asociada. También puede crear un registro A que apunte directamente a la dirección IP. (Para Application Gateway V1, la dirección VIP puede cambiar si detiene e inicia el servicio, lo que hace que esta opción no sea recomendable).
App Service debe configurarse para que acepte el tráfico de Application Gateway mediante el nombre de dominio personalizado como host entrante. Para obtener más información sobre cómo asignar un dominio personalizado a App Service, consulte Tutorial: Asignación de un nombre DNS personalizado existente a Azure App Service Para verificar el dominio, App Service solo requiere agregar un registro TXT. No se requiere ningún cambio en los registros A o CNAME. La configuración de DNS para el dominio personalizado permanecerá dirigida a Application Gateway.
Cuando no hay ningún dominio personalizado disponible, el usuario o cliente puede acceder a Application Gateway mediante la dirección IP de la puerta de enlace o su dirección DNS. La dirección DNS de Application Gateway puede encontrarse en la página de información general de la dirección IP pública asociada. No tener un dominio personalizado disponible implica que no habrá ningún certificado firmado públicamente disponible para TLS en Application Gateway. Los clientes están restringidos a usar HTTP o HTTPS con un certificado autofirmado, ambas opciones no son recomendables.
Para conectarse a App Service, Application Gateway utiliza el dominio predeterminado proporcionado por App Service (con el sufijo "azurewebsites.net").
Agregación de servicio de aplicaciones como grupo de back-end
En Azure Portal, seleccione el recurso de Application Gateway.
En Grupos de back-end, seleccione el grupo de back-end.
En Tipo de destino, seleccione App Services.
En Destino seleccione la instancia de App Service.
Nota:
La lista desplegable solo rellenará los App Services que se encuentren en la misma suscripción que Application Gateway. Si quiere usar un servicio de aplicaciones que está en una suscripción diferente de aquella en la que se encuentra Application Gateway, en lugar de seleccionar App Services en la lista desplegable Destinos, elija la opción Nombre de host o dirección IP y escriba el nombre de host (example.azurewebsites.net) de App Service.
Seleccione Guardar.
# Fully qualified default domain name of the web app:
$webAppFQDN = "<nameofwebapp>.azurewebsite.net"
# For Application Gateway: both name, resource group and name for the backend pool to create:
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
$appGwBackendPoolNameForAppSvc = "<name for backend pool to be added>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Add a new Backend Pool with App Service in there:
Add-AzApplicationGatewayBackendAddressPool -Name $appGwBackendPoolNameForAppSvc -ApplicationGateway $gw -BackendFqdns $webAppFQDN
# Update Application Gateway with the new added Backend Pool:
Set-AzApplicationGateway -ApplicationGateway $gw
Edición de una configuración de HTTP para App Service
Se requiere una configuración HTTP que indique a Application Gateway que debe acceder a App Service de back-end mediante el nombre de dominio personalizado. La configuración HTTP usará de forma predeterminada el sondeo de estado predeterminado. Aunque los sondeos de estado predeterminados reenviarán las solicitudes con el nombre de host en el que se recibe el tráfico, los sondeos de estado usarán 127.0.0.1 como nombre de host al grupo de back-end, ya que no se ha definido explícitamente ningún nombre de host. Por este motivo, necesitamos crear un sondeo de estado personalizado que esté configurado con el nombre de dominio personalizado correcto como nombre de host.
Nos conectaremos al back-end mediante HTTPS.
En Configuración de HTTP, seleccione una configuración HTTP existente o agregue una nueva.
Al crear una nueva configuración de HTTP, asígnele un nombre
Seleccione HTTPS como protocolo de back-end deseado mediante el puerto 443
Asegúrese de establecer "Invalidar con nuevo nombre de host" en "No"
Seleccione el sondeo de mantenimiento HTTPS personalizado en la lista desplegable de "Sondeo de mantenimiento".
Se requiere una configuración HTTP que indique a Application Gateway que debe acceder al back-end de App Service mediante el nombre de dominio ("azurewebsites.net") personalizado. Para ello, la configuración de HTTP invalidará explícitamente el nombre de host.
En Configuración de HTTP, seleccione una configuración HTTP existente o agregue una nueva.
Al crear una nueva configuración de HTTP, asígnele un nombre
Seleccione HTTPS como protocolo de back-end deseado mediante el puerto 443
Asegúrese de establecer "Invalidar con nuevo nombre de host" en "Sí"
En "Reemplazo del nombre de host", seleccione "Seleccionar el nombre de host del destino de back-end". Esta configuración hará que la solicitud hacia App Service utilice el nombre de host "azurewebsites.net", tal como está configurado en el grupo de back-end.
# Configure Application Gateway to connect to App Service using the incoming hostname
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
$customProbeName = "<name for custom health probe>"
$customDomainName = "<FQDN for custom domain associated with App Service>"
$httpSettingsName = "<name for http settings to be created>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Add custom health probe using custom domain name:
Add-AzApplicationGatewayProbeConfig -Name $customProbeName -ApplicationGateway $gw -Protocol Https -HostName $customDomainName -Path "/" -Interval 30 -Timeout 120 -UnhealthyThreshold 3
$probe = Get-AzApplicationGatewayProbeConfig -Name $customProbeName -ApplicationGateway $gw
# Add HTTP Settings to use towards App Service:
Add-AzApplicationGatewayBackendHttpSettings -Name $httpSettingsName -ApplicationGateway $gw -Protocol Https -Port 443 -Probe $probe -CookieBasedAffinity Disabled -RequestTimeout 30
# Update Application Gateway with the new added HTTP settings and probe:
Set-AzApplicationGateway -ApplicationGateway $gw
# Configure Application Gateway to connect to backend using default App Service hostname
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
$httpSettingsName = "<name for http settings to be created>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Add HTTP Settings to use towards App Service:
Add-AzApplicationGatewayBackendHttpSettings -Name $httpSettingsName -ApplicationGateway $gw -Protocol Https -Port 443 -PickHostNameFromBackendAddress -CookieBasedAffinity Disabled -RequestTimeout 30
# Update Application Gateway with the new added HTTP settings and probe:
Set-AzApplicationGateway -ApplicationGateway $gw
Abra la sección "Agentes de escucha" y elija "Agregar agente de escucha" o haga clic en uno existente para editarlo
Para un nuevo agente de escucha: asígnele un nombre
En "IP de front-end", seleccione la dirección IP en la que desea escuchar
En "Puerto", seleccione 443
En "Protocolo", seleccione "HTTPS"
En "Elegir un certificado", seleccione "Elegir un certificado de Key Vault". Para obtener más información, consulte Uso de Key Vault, donde encontrará más información sobre cómo asignar una identidad administrada y proporcionar derechos a Key Vault.
Asigne un nombre al certificado
Selección de la identidad administrada
Seleccione el Key Vault desde donde se va a obtener el certificado
Seleccionar el certificado
En "Tipo de agente de escucha", seleccione "Básico"
Haga clic en "Agregar" para agregar el agente de escucha
Suponiendo que no haya ningún dominio personalizado disponible o certificado asociado, configuraremos Application Gateway para escuchar el tráfico HTTP en el puerto 80. Alternativamente, consulte las instrucciones sobre cómo realizar la Creación de un certificado autofirmado
Abra la sección "Agentes de escucha" y elija "Agregar agente de escucha" o haga clic en uno existente para editarlo
Para un nuevo agente de escucha: asígnele un nombre
En "IP de front-end", seleccione la dirección IP en la que desea escuchar
En "Puerto", seleccione 80
En "Protocolo", seleccione "HTTP"
# This script assumes that:
# - a certificate was imported in Azure Key Vault already
# - a managed identity was assigned to Application Gateway with access to the certificate
# - there is no HTTP listener defined yet for HTTPS on port 443
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
$appGwSSLCertificateName = "<name for ssl cert to be created within Application Gateway"
$appGwSSLCertificateKeyVaultSecretId = "<key vault secret id for the SSL certificate to use>"
$httpListenerName = "<name for the listener to add>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Create SSL certificate object for Application Gateway:
Add-AzApplicationGatewaySslCertificate -Name $appGwSSLCertificateName -ApplicationGateway $gw -KeyVaultSecretId $appGwSSLCertificateKeyVaultSecretId
$sslCert = Get-AzApplicationGatewaySslCertificate -Name $appGwSSLCertificateName -ApplicationGateway $gw
# Fetch public ip associated with Application Gateway:
$ipAddressResourceId = $gw.FrontendIPConfigurations.PublicIPAddress.Id
$ipAddressResource = Get-AzResource -ResourceId $ipAddressResourceId
$publicIp = Get-AzPublicIpAddress -ResourceGroupName $ipAddressResource.ResourceGroupName -Name $ipAddressResource.Name
$frontendIpConfig = $gw.FrontendIpConfigurations | Where-Object {$_.PublicIpAddress -ne $null}
$port = New-AzApplicationGatewayFrontendPort -Name "port_443" -Port 443
Add-AzApplicationGatewayFrontendPort -Name "port_443" -ApplicationGateway $gw -Port 443
Add-AzApplicationGatewayHttpListener -Name $httpListenerName -ApplicationGateway $gw -Protocol Https -FrontendIPConfiguration $frontendIpConfig -FrontendPort $port -SslCertificate $sslCert
# Update Application Gateway with the new HTTPS listener:
Set-AzApplicationGateway -ApplicationGateway $gw
En muchos casos, ya existirá un agente de escucha público para HTTP en el puerto 80. El script siguiente creará uno si esto no es así.
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
$httpListenerName = "<name for the listener to add if not exists yet>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Check if HTTP listener on port 80 already exists:
$port = $gw.FrontendPorts | Where-Object {$_.Port -eq 80}
$listener = $gw.HttpListeners | Where-Object {$_.Protocol.ToString().ToLower() -eq "http" -and $_.FrontendPort.Id -eq $port.Id}
if ($listener -eq $null){
$frontendIpConfig = $gw.FrontendIpConfigurations | Where-Object {$_.PublicIpAddress -ne $null}
Add-AzApplicationGatewayHttpListener -Name $httpListenerName -ApplicationGateway $gw -Protocol Http -FrontendIPConfiguration $frontendIpConfig -FrontendPort $port
# Update Application Gateway with the new HTTPS listener:
Set-AzApplicationGateway -ApplicationGateway $gw
}
Configuración de la regla de enrutamiento de solicitudes
Use el grupo de back-end configurado anteriormente y la configuración de HTTP, la regla de enrutamiento de solicitudes se puede configurar para que asuma el tráfico de un cliente de escucha y lo enrute al grupo de back-end mediante la configuración de HTTP. Para ello, asegúrese de que tiene disponible un agente de escucha HTTP o HTTPS que aún no está enlazado a una regla de enrutamiento existente.
Abra la sección "Estado del back-end" y asegúrese de que la columna "Estado" indica que la combinación de configuración de HTTP y grupo de back-end se muestra en estado "Correcto".
Ahora vaya a la aplicación web mediante la dirección IP de Application Gateway o el nombre DNS asociado para la dirección IP. Ambos se pueden encontrar en la página de "Información general" de Application Gateway, como una propiedad en "Essentials". Como alternativa, el recurso de la dirección IP pública también muestra la dirección IP y el nombre DNS asociado.
Preste atención a la siguiente lista no exhaustiva de posibles síntomas al probar la aplicación:
redirecciones que apuntan a ".azurewebsites.net" directamente en lugar de a Application Gateway
esto incluye redirecciones de autenticación que intentan acceder directamente a ".azurewebsites.net"
cookies enlazadas a un dominio que no se pasan al back-end
Las condiciones anteriores (que se explican con más detalle en el Centro de arquitectura) indicarán que la aplicación web no gestiona bien la reescritura del nombre de host. Esto se suele ver. La manera recomendada de lidiar con esto es seguir las instrucciones de configuración de Application Gateway con App Service utilizando un dominio personalizado. Consulte también: Solución de problemas de App Service en Application Gateway.
Abra la sección "Estado del back-end" y asegúrese de que la columna "Estado" indica que la combinación de configuración de HTTP y grupo de back-end se muestra en estado "Correcto".
Ahora, vaya a la aplicación web mediante el dominio personalizado que asoció con Application Gateway y App Service en el back-end.
Compruebe si el estado del back-end para el back-end y la configuración de HTTP se muestra en estado "Correcto":
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Check health:
Get-AzApplicationGatewayBackendHealth -ResourceGroupName $rgName -Name $appGwName
Para probar la configuración, solicitaremos contenido de App Service a Application Gateway mediante el dominio personalizado:
$customDomainName = "<FQDN for custom domain pointing to Application Gateway>"
Invoke-WebRequest $customDomainName
Compruebe si el estado del back-end para el back-end y la configuración de HTTP se muestra en estado "Correcto":
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Check health:
Get-AzApplicationGatewayBackendHealth -ResourceGroupName $rgName -Name $appGwName
Para probar la configuración, solicitaremos contenido de App Service a Application Gateway mediante la dirección IP:
$rgName = "<name of resource group for App Gateway>"
$appGwName = "<name of the App Gateway>"
# Get existing Application Gateway:
$gw = Get-AzApplicationGateway -Name $appGwName -ResourceGroupName $rgName
# Get ip address:
$ipAddressResourceId = $gw.FrontendIPConfigurations.PublicIPAddress.Id
$ipAddressResource = Get-AzResource -ResourceId $ipAddressResourceId
$publicIp = Get-AzPublicIpAddress -ResourceGroupName $ipAddressResource.ResourceGroupName -Name $ipAddressResource.Name
Write-Host "Public ip address for Application Gateway is $($publicIp.IpAddress)"
Invoke-WebRequest "http://$($publicIp.IpAddress)"
Preste atención a la siguiente lista no exhaustiva de posibles síntomas al probar la aplicación:
redirecciones que apuntan a ".azurewebsites.net" directamente en lugar de a Application Gateway
esto incluye redirecciones de Autenticación de App Service que intentan acceder directamente a ".azurewebsites.net"
cookies enlazadas a un dominio que no se pasan al back-end
Las condiciones anteriores (que se explican con más detalle en el Centro de arquitectura) indicarán que la aplicación web no gestiona bien la reescritura del nombre de host. Esto se suele ver. La manera recomendada de lidiar con esto es seguir las instrucciones de configuración de Application Gateway con App Service utilizando un dominio personalizado. Consulte también: Solución de problemas de App Service en Application Gateway.
Restricción del acceso
Las aplicaciones web implementadas en estos ejemplos usan direcciones IP públicas a las que se puede acceder directamente desde Internet. Esto ayuda a solucionar los problemas cuando se está aprendiendo una nueva característica y se prueban cosas nuevas. Pero si va a implementar una característica en un entorno de producción, tendrá que agregar más restricciones. Considere las opciones siguientes:
Utilice Restricciones de IP estáticas de Azure App Service. Por ejemplo, puede restringir la aplicación web para que solo recibe tráfico desde la puerta de enlace de aplicaciones. Use la característica de restricción de IP de servicio de aplicación para mostrar la dirección IP virtual de la puerta de enlace de aplicaciones como la única dirección con el acceso.