Fala pessoal!
Nesse post, eu gostaria de compartilhar com vocês uma situação que já presenciei em uns 4 clientes nos últimos 3 meses e sempre tenho que explicar a mesma coisa quando usuários acessam o banco utilizando um IP ou hostname externo, criado para que usuários possam se conectar à essas fontes de dados estando fora da rede da empresa e sem a necessidade de uma VPN, mas o servidor só reconhece os endereços internos (IP/Hostname) e ele não consegue configurar o Power BI Gateway corretamente porque dá erro quando ele tenta adicionar a fonte de dados.
Por isso, resolvi criar esse artigo, com duas soluções extremamente simples, para que isso possa ser útil para as pessoas da comunidade, e não só os meus clientes de BI.
Simulando e explicando o problema
Clique para visualizar o conteúdo
Para entender esse cenário, imaginem o seguinte:
Dentro da mesma rede do servidor ou utilizando uma VPN, o acesso à instância é feita utilizando um hostname interno (dirceu-vm) ou o IP (192.168.0.27, por exemplo)
Fora da rede, existem algumas máquinas virtuais com IP fixo e que possuem acesso direto à rede da empresa e acessam o servidor através de um IP público, direcionamento de portas e liberação desses IP’s no Firewall. Ou seja, o acesso fora da rede à esse servidor é feito utilizando o IP público (Ex: 189.123.111.222) ou host público (acessoexterno.dirceuresende.com)
Algumas pessoas que desenvolvem relatórios no Power BI estão dentro da rede e outras acessam pelo IP público
O Power BI Gateway está instalado e configurado no servidor do banco de dados, com a fonte de dados já criada
O usuário que acessa de forma externa, consegue acessar o banco e criar o relatório normalmente dentro do Power BI Desktop:
Quando um usuário de dentro da rede publica o relatório, ele funciona normalmente. Mas quando um usuário que faz o acesso externo publica um relatório, acontece essa mensagem de erro:
Não há nenhum gateway para acessar a fonte de dados DW
E aí quando você clica em “exibir detalhes”, vai ver essa mensagem de erro:
Vamos tentar adicionar a fonte de dados ao Gateway então:
Configuro os dados de conexão normalmente:
Mas quando tento adicionar a fonte de dados, nos deparamos com uma mensagem bem comum, que é mostrada quando não é possível localizar a instância requisitada:
A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 – Error Locating Server/Instance Specified)
E agora ?
Resolvendo o problema de conexão
Nesse caso, o primeiro teste que eu faço para entender exatamente o que está acontecendo antes de colocar a culpa do Gateway, é tentar acessar esse endereço logado no servidor onde está instalado o Gateway:
Como era de se esperar, o servidor não está reconhecendo esse endereço externo que esses usuários estão acessando, e por isso, a conexão com o Gateway não está funcionando. A mesma coisa aconteceria se o acesso externo fosse ao IP 189.123.123.123, por exemplo, e o IP interno do servidor de banco fosse 192.168.0.27, por exemplo.
Para conseguir fazer com que o servidor do gateway possa reconhecer esse hostname ou IP externo, podemos utilizar essas 2 soluções que vou demonstrar abaixo (se conhecer outras, deixe aqui nos comentários):
Solução 1 – Alias no SQL Server Configuration Manager
Clique para visualizar o conteúdo
Uma forma de conseguir fazer um “De X Para” nos IP’s ou hostnames do SQL Server é utilizando o recurso de Alias do SQL Server Configuration Manager:
Não se esqueça de criar o alias também nas configurações x64:
É importante realizar essa configuração do driver do Native Client tanto nas versões 32 bits (x86) quanto na 64 bits (x64), pois alguns softwares que acessam o banco só existem na versão 32 bits (ex: SSMS) e já outros costumam ser utilizados na versão 64 bits (Ex: Power BI Desktop).
Atenção: Preste atenção quanto ao protocolo e a porta da instância SQL Server onde a conexão será apontada. Caso essas informações estejam erradas, a conexão não será realizada. Uma vantagem dessa abordagem é justamente escolher o que será afetado por esse apontamento e funciona tanto com hostname externo quanto com IP externo. O ponto negativo dessa solução é que ela é específica do SQL Server
Após esse apontamento, a conexão agora funciona normalmente dentro do servidor onde está o Gateway (e nesse caso, o banco também):
Um teste simples me garante que esse apontamento afeta apenas o SQL Server:
Solução 2 – Arquivo de hosts
Clique para visualizar o conteúdo
Essa segunda alternativa é uma solução a nível de sistema operacional e consiste em alterar o arquivo de hosts do Windows para que ele entenda que um determinado hostname responde através de um IP escolhido por você. No Windows, esse arquivo fica localizado em C:\Windows\System32\drivers\etc enquanto no Linux, o caminho é /etc/hosts.
Para que esse apontamento funcione, você precisará digitar o IP para onde o host escolhido deve apontar, deixar um espaço em branco e depois colocar o hostname que será afetado por esse apontamento manual:
E ao fazer isso, qualquer software que tente utilizar esse hostname, para qualquer tipo de protocolo ou porta, irá tentar a conexão no IP informado no arquivo de hosts (192.168.31.230, no caso do exemplo).
Assim como o próprio SQL Server Management Studio (SSMS), Power BI e tantos outros:
Atenção: O arquivo de hosts permite apenas o apontamento de um hostname para um IP. Caso você acesse através de um IP público apenas, terá que utilizar a solução do Alias no SQL Server Configuration Manager, começar a acessar pelo Hostname ao invés do IP ou utilizar outra solução de apontamento.
Testando a solução no Power BI Gateway
Agora que demonstrei 2 formas de se fazer esse apontamento, vamos testar se realmente elas vão funcionar no meu objetivo original, que é utilizar essa fonte de dados no meu relatório do Power BI publicado na nuvem.
Conexão realizada com sucesso:
Gateway em execução e conjunto de dados do relatório associado à fonte de dados:
E como consequência disso, relatório funcionando tanto para quem acessa utilizando o endereço interno da rede quanto no endereço externo 🙂
Espero que tenham gostado dessa dica, um grande abraço e até o próximo artigo!