Configurar o Serviço de Aplicações com o Gateway de Aplicação
Artigo
O gateway de aplicativo permite que você tenha um aplicativo do Serviço de Aplicativo ou outro serviço multilocatário como membro do pool de back-end. Neste artigo, você aprenderá a configurar um aplicativo do Serviço de Aplicativo com o Application Gateway. A configuração do Application Gateway será diferente dependendo de como o Serviço de Aplicativo será acessado:
A primeira opção usa um domínio personalizado no Application Gateway e no Serviço de Aplicativo no back-end.
A segunda opção é fazer com que o Application Gateway acesse o Serviço de Aplicativo usando seu domínio padrão, sufixo como ".azurewebsites.net".
Essa configuração é recomendada para cenários de nível de produção e atende à prática de não alterar o nome do host no fluxo de solicitação. É necessário ter um domínio personalizado (e certificado associado) disponível para evitar ter que confiar no domínio padrão ".azurewebsites".
Ao associar o mesmo nome de domínio ao Gateway de Aplicativo e ao Serviço de Aplicativo no pool de back-end, o fluxo de solicitação não precisa substituir o nome do host. O aplicativo Web de back-end verá o host original como foi usado pelo cliente.
Esta configuração é a mais fácil e não requer um domínio personalizado. Como tal, permite uma configuração rápida e conveniente.
Aviso
Esta configuração vem com limitações. Recomendamos examinar as implicações do uso de nomes de host diferentes entre o cliente e o Gateway de Aplicativo e entre o Aplicativo e o Serviço de Aplicativo no back-end. Para obter mais informações, consulte o artigo no Centro de arquitetura: Preservar o nome de host HTTP original entre um proxy reverso e seu aplicativo Web de back-end
Quando o Serviço de Aplicativo não tiver um domínio personalizado associado a ele, o cabeçalho do host na solicitação de entrada no aplicativo Web precisará ser definido como o domínio padrão, sufixo com ".azurewebsites.net" ou a plataforma não poderá rotear a solicitação corretamente.
O cabeçalho do host na solicitação original recebida pelo Gateway de Aplicativo será diferente do nome do host do Serviço de Aplicativo de back-end.
Neste artigo, você aprenderá a:
Configurar o DNS
Adicionar o Serviço de Aplicativo como pool de back-end ao Gateway de Aplicativo
Definir configurações HTTP para a conexão com o Serviço de Aplicativo
Um nome de domínio personalizado e certificado associado (assinado por uma autoridade bem conhecida), armazenado no Cofre da Chave. Para obter mais informações sobre como armazenar certificados no Cofre da Chave, consulte Tutorial: Importar um certificado no Cofre da Chave do Azure
Encaminhe o usuário ou cliente para o Application Gateway usando o domínio personalizado. Configure o DNS usando um alias CNAME apontado para o DNS for Application Gateway. O endereço DNS do Application Gateway é mostrado na página de visão geral do endereço IP público associado. Como alternativa, crie um registro A apontando diretamente para o endereço IP. (Para o Application Gateway V1, o VIP pode mudar se você parar e iniciar o serviço, o que torna essa opção indesejada.)
O Serviço de Aplicativo deve ser configurado para aceitar tráfego do Application Gateway usando o nome de domínio personalizado como host de entrada. Para obter mais informações sobre como mapear um domínio personalizado para o Serviço de Aplicativo, consulte Tutorial: Mapear um nome DNS personalizado existente para o Serviço de Aplicativo do Azure Para verificar o domínio, o Serviço de Aplicativo requer apenas a adição de um registro TXT. Nenhuma alteração é necessária nos registros CNAME ou A. A configuração de DNS para o domínio personalizado permanecerá direcionada para o Application Gateway.
Para aceitar conexões com o Serviço de Aplicativo por HTTPS, configure sua associação TLS. Para obter mais informações, consulte Proteger um nome DNS personalizado com uma associação TLS/SSL no Serviço de Aplicativo do Azure Configurar o Serviço de Aplicativo para extrair o certificado para o domínio personalizado do Cofre da Chave do Azure.
Quando nenhum domínio personalizado está disponível, o usuário ou cliente pode acessar o Application Gateway usando o endereço IP do gateway ou seu endereço DNS. O endereço DNS do Application Gateway pode ser encontrado na página de visão geral do endereço IP público associado. Não ter um domínio personalizado disponível implica que nenhum certificado assinado publicamente estará disponível para TLS no Application Gateway. Os clientes estão restritos a usar HTTP ou HTTPS com um certificado autoassinado, ambos indesejados.
Para se conectar ao Serviço de Aplicativo, o Gateway de Aplicativo usa o domínio padrão conforme fornecido pelo Serviço de Aplicativo (sufixo "azurewebsites.net").
Adicionar serviço de aplicativo como pool de back-end
No portal do Azure, selecione seu Gateway de Aplicativo.
Em Pools de back-end, selecione o pool de back-end.
Em Tipo de destino, selecione Serviços de Aplicativo.
Em Destino , selecione seu Serviço de Aplicativo.
Nota
A lista suspensa preenche apenas os serviços de aplicativo que estão na mesma assinatura que o seu Application Gateway. Se você quiser usar um serviço de aplicativo que esteja em uma assinatura diferente daquela em que o Gateway de Aplicativo está, em vez de escolher Serviços de Aplicativo na lista suspensa Destinos, escolha a opção Endereço IP ou nome do host e insira o nome do host (example.azurewebsites.net) do serviço de aplicativo.
Selecione 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
Editar configurações HTTP para o Serviço de Aplicativo
É necessária uma Configuração HTTP que instrua o Gateway de Aplicativo a acessar o back-end do Serviço de Aplicativo usando o nome de domínio personalizado. A configuração HTTP usará, por padrão, a sonda de integridade padrão. Enquanto os testes de integridade padrão encaminharão solicitações com o nome do host no qual o tráfego é recebido, os testes de integridade utilizarão 127.0.0.1 como o nome do host para o Pool de Back-end, uma vez que nenhum nome de host foi explicitamente definido. Por esse motivo, precisamos criar uma sonda de integridade personalizada configurada com o nome de domínio personalizado correto como seu nome de host.
Vamos nos conectar ao back-end usando HTTPS.
Em Configurações HTTP, selecione uma configuração HTTP existente ou adicione uma nova.
Ao criar uma nova configuração HTTP, atribua-lhe um nome
Selecione HTTPS como o protocolo de back-end desejado usando a porta 443
Certifique-se de definir "Substituir com novo nome de host" como "Não"
Selecione a sonda de integridade HTTPS personalizada na lista suspensa para "Sonda personalizada".
É necessária uma Configuração HTTP que instrua o Application Gateway a acessar o back-end do Serviço de Aplicativo usando o nome de domínio padrão ("azurewebsites.net"). Para fazer isso, a configuração HTTP substituirá explicitamente o nome do host.
Em Configurações HTTP, selecione uma configuração HTTP existente ou adicione uma nova.
Ao criar uma nova configuração HTTP, atribua-lhe um nome
Selecione HTTPS como o protocolo de back-end desejado usando a porta 443
Certifique-se de definir "Substituir com novo nome de host" como "Sim"
Em "Substituição do nome do host", selecione "Escolher nome do host do destino de back-end". Essa configuração fará com que a solicitação para o Serviço de Aplicativo use o nome de host "azurewebsites.net", conforme configurado no Pool 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 a seção "Ouvintes" e escolha "Adicionar ouvinte" ou clique em um existente para editar
Para um novo ouvinte: dê-lhe um nome
Em "Frontend IP", selecione o endereço IP para ouvir
Em "Porta", selecione 443
Em "Protocolo", selecione "HTTPS"
Em "Escolha um certificado", selecione "Escolha um certificado do Cofre da Chave". Para obter mais informações, consulte Usando o Cofre da Chave , onde você encontra mais informações sobre como atribuir uma identidade gerenciada e fornecer direitos ao Cofre da Chave.
Dê um nome ao certificado
Selecione a identidade gerenciada
Selecione o Cofre da Chave de onde obter o certificado
Selecionar o certificado
Em "Tipo de ouvinte", selecione "Básico"
Clique em "Adicionar" para adicionar o ouvinte
Supondo que não haja nenhum domínio personalizado disponível ou certificado associado, configuraremos o Application Gateway para ouvir o tráfego HTTP na porta 80. Como alternativa, consulte as instruções sobre como criar um certificado autoassinado
Abra a seção "Ouvintes" e escolha "Adicionar ouvinte" ou clique em um existente para editar
Para um novo ouvinte: dê-lhe um nome
Em "Frontend IP", selecione o endereço IP para ouvir
Em "Porta", selecione 80
Em "Protocolo", selecione "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
Em muitos casos, já existirá um ouvinte público para HTTP na porta 80. O script abaixo criará um, se esse ainda não for o caso.
$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
}
Configurar regra de roteamento de solicitação
Usando o Pool de Back-end configurado anteriormente e as Configurações HTTP, a regra de roteamento de solicitação pode ser configurada para receber tráfego de um ouvinte e roteá-lo para o Pool de Back-end usando as Configurações HTTP. Para isso, certifique-se de ter um ouvinte HTTP ou HTTPS disponível que ainda não esteja vinculado a uma regra de roteamento existente.
Abra a seção "Integridade do back-end" e verifique se a coluna "Status" indica que a combinação para Configuração HTTP e Pool de back-end mostra como "Íntegro".
Agora navegue até o aplicativo Web usando o Endereço IP do Gateway de Aplicativo ou o nome DNS associado para o Endereço IP. Ambos podem ser encontrados na página "Visão geral" do Application Gateway como uma propriedade em "Essentials". Como alternativa, o recurso Endereço IP Público também mostra o endereço IP e o nome DNS associado.
Preste atenção à seguinte lista não exaustiva de sintomas potenciais ao testar a aplicação:
redirecionamentos apontando para ".azurewebsites.net" diretamente em vez de para o Application Gateway
Isso inclui redirecionamentos de autenticação que tentam acessar ".azurewebsites.net" diretamente
os cookies ligados ao domínio não estão a ser transmitidos para o back-end
As condições acima (explicadas com mais detalhes no Architecture Center) indicariam que seu aplicativo Web não lida bem com a reescrita do nome do host. Isso é comumente visto. A maneira recomendada de lidar com isso é seguir as instruções para configurar o Application Gateway com o Serviço de Aplicativo usando um domínio personalizado. Consulte também: Solucionar problemas do Serviço de Aplicativo no Application Gateway.
Abra a seção "Integridade do back-end" e verifique se a coluna "Status" indica que a combinação para Configuração HTTP e Pool de back-end mostra como "Íntegro".
Agora navegue até o aplicativo Web usando o domínio personalizado que você associou ao Gateway de Aplicativo e ao Serviço de Aplicativo no back-end.
Verifique se a integridade do back-end para as configurações de back-end e HTTP aparece como "Íntegra":
$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 testar a configuração, solicitaremos conteúdo do Serviço de Aplicativo por meio do Application Gateway usando o domínio personalizado:
$customDomainName = "<FQDN for custom domain pointing to Application Gateway>"
Invoke-WebRequest $customDomainName
Verifique se a integridade do back-end para as configurações de back-end e HTTP aparece como "Íntegra":
$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 testar a configuração, solicitaremos conteúdo do Serviço de Aplicativo por meio do Application Gateway usando o endereço 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 atenção à seguinte lista não exaustiva de sintomas potenciais ao testar a aplicação:
redirecionamentos apontando para ".azurewebsites.net" diretamente em vez de para o Application Gateway
As condições acima (explicadas com mais detalhes no Architecture Center) indicariam que seu aplicativo Web não lida bem com a reescrita do nome do host. Isso é comumente visto. A maneira recomendada de lidar com isso é seguir as instruções para configurar o Application Gateway com o Serviço de Aplicativo usando um domínio personalizado. Consulte também: Solucionar problemas do Serviço de Aplicativo no Application Gateway.
Restringir o acesso
Os aplicativos Web implantados nesses exemplos usam endereços IP públicos que podem ser acessados diretamente da Internet. Isso ajuda na solução de problemas quando você está aprendendo sobre um novo recurso e tentando coisas novas. Mas se você pretende implantar um recurso na produção, convém adicionar mais restrições. Considere as seguintes opções:
Configure regras de restrição de acesso com base em pontos de extremidade de serviço. Isso permite que você bloqueie o acesso de entrada ao aplicativo, certificando-se de que o endereço de origem é do Application Gateway.
Use as restrições de IP estático do Serviço de Aplicativo do Azure. Por exemplo, você pode restringir o aplicativo Web para que ele receba apenas tráfego do gateway de aplicativo. Use o recurso de restrição de IP do serviço de aplicativo para listar o VIP do gateway de aplicativo como o único endereço com acesso.