Azure Function App Proxy

In de voorgaande posts hebben we het gehad over een directe koppeling tussen AFAS Profit en Power BI en het gebruik van een Azure Function App om scripts te kunnen draaien. Deze twee onderdelen hebben echter nog een extra toepassing.

Wanneer je een Power BI rapportage die gebruik maakt van directe AFAS Profit data wil publiceren ga je bij de refresh problemen krijgen met het autoriseren van de (web) databronnen. Het probleem is dat het deel van de URL met de autorisatie token afgekapt wordt (samen met eventuele filters). Waarom dit precies gebeurt is mij niet helemaal duidelijk. Een mogelijke oplossing is het gebruik van een Azure Function App Proxy. Als je toch al een Azure Function App hebt voor het draaien van je scripts kost deze proxy je normaal gezien niets extra.

Wat gaan we doen?

Een Azure Function App Proxy kent vele mogelijke toepassingen. In dit voorbeeld gaan we de Proxy tussen de AFAS Profit Webconnector (REST) en Power BI plaatsen. Power BI gaat een request naar de proxy sturen met een aantal parameters, de proxy reformat het verzoek en doet het verzoek bij de Profit omgeving. Het resultaat wordt vervolgens 1-op-1 doorgestuurd naar Power BI. (We zouden hier eventueel nog acties aan de response kunnen hangen, maar dat is nu niet nodig).

De stap voor het maken van de function app zelf slaan we deze keer even over, als je wil weten hoe dat werkt kan je dit item lezen. Ik ga dan ook uit van dezelfde demo als in die post, het startpunt is dan ongeveer het volgende:

Azure Function App

Toelichting endpoint (AFAS Profit REST API)

Wanneer je gebruik wil maken van de AFAS Profit REST API moet er gewerkt worden met een bepaalde opbouw van de URL gecombineerd met een een autorisatie header. Wanneer je deze direct vanuit Power BI ingeeft als bron kan je deze handmatig autoriseren, echter, wanneer je de rapportage publiceert werkt deze authenticatie niet meer. Dat betekend dat we een tussenstap moeten maken.

Het doel is uiteindelijk dat we een request zoals deze naar naar de REST API van Profit kunnen sturen:

https://url_van_omgeving/profitrestservices/connectors/{connector}

Vervolgens moeten daar de connector specifieke velden, filters en autorisatie aan meegegeven worden. Alle velen die we nodig hebben zijn al bekend gezien we deze in de directe koppeling uit de eerdere posts ook al gebruikt hebben.

Inrichting Azure Function App Proxy

Wanneer je in het Function App menu zit zie je bij Proxies ongeveer het volgende:

Azure Function Apps menu

Je kan daar op de + klikken om een nieuwe proxy aan te maken, daarvoor moet het een en ander ingevoerd worden, dat ziet er dan uiteindelijk ongeveer als volgt uit:

Azure Function Apps - Proxies

We lopen even door de velden heen:

Route template

Hier geef je de structuur van de proxy url op, in dit geval beginnen we met de “/naca” dit doet van zichzelf niets. Het geeft een stukje structuur waarmee de url’s en verwijzingen van elkaar onderscheiden kunnen worden. Dit wordt gevolgd door een aantal velden tussen {} geplaatst zijn. Dit zijn de variabelen die we willen kunnen gebruiken in de “request override” of de “header”. In dit geval zijn dat:

Token = Autorisatie token (zie eerdere posts)
Periode = De periode waarvan we de data op willen halen, dit gaan we in een filter gebruiken
Connector = De naam van de connector die we op willen roepen.

Het resultaat van deze route template komt terug in de URL die je gebruikt in Power BI.

Backend url

Dit is het adres waarop de AFAS Profit REST API benaderd kan worden. Je ziet hier aan het einde {connector} staan, dat wil dus zeggen dat hij de variabele uit de request URL overneemt naar de backend url.

Request override

Vervolgens zal je de “Request override” open moeten klikken en invullen, voor de duidelijkheid staat hieronder nog specifiek een screenshot van dat onderdeel:

Azure Function Apps - Request override

Dit is het deel waar we het request dat naar de Azure Funtion App Proxy gestuurd is om gaan zetten naar het request waar onze AFAS Profit omgeving wat mee kan.

De skip en take velden zijn gelijk aan wat we kennen uit de directe koppeling. We kunnen hier direct ook een specifieke periode ophalen. We gebruiken hiervoor de standaard filter opties van de AFAS Profit REST API. Het “filterfieldsids” geeft de velden aan waar je op wil filteren. Het “filtervalues” veld is de waarde waarop je op wil filteren, je ziet hier {periode}  staan, wat weer betekend dat we de variabele die we in de route template gespecificeerd hebben overnemen in het filter voor AFAS. Tot slot staat er nog “operatortypes” en dat is weer een onderdeel van de filteropties vanuit Profit.

Je kan in deze velden eigenlijk alles kwijt wat je normaal ook zou gebruiken bij het ophalen van een getconnector in AFAS Profit.

Headers

Tot slot moeten we nog de autorisatie headers mee geven. Dit is namelijk de hele reden dat we de directe koppeling niet in de gepubliceerde rapportages kunnen gebruiken. Het token wat we nodig hebben zit al in het route template. Zoals eerder zie je ook hier weer dat we de variabele kunnen gebruiken, in dit geval het veld {token}:

Het “ContentType” veld en de inhoud (“application/json;charset=utf-8”) zijn voor Profit connectoren altijd gelijk.

Als we dit alles ingevuld hebben kan de proxy opgeslagen worden. Je krijgt dan een URL terug die je in het vervolg kan gebruiken voor het ophalen van de data uit AFAS Profit. De URL ziet er grofweg als volgt uit:

https://****.azurewebsites.net/naca/{token}/{periode}/{connector}

Verwerking in Power BI

Je kan de URL hier boven nu gebruiken in de rapporten die je wil publiceren. Hiervoor maak je in Power BI een “web” bron aan:

Je bouwt deze vervolgens op aan de hand van de structuur voor de proxy url zoals we deze in de vorige stap gemaakt hebben:

Power BI databron gevuld

Wanneer je deze bron nu opslaat kan je de data gebruiken op dezelfde manier als de directe koppeling die we in een van de eerdere posts gemaakt hebben. In het voorbeeld hierboven heb ik gebruik gemaakt van parameters in Power BI om de variabelen op te slaan en mee te nemen. Je kan hier ook direct de waardes voor de variabelen vullen.

Veiligheid

Op zich is het gebruik van de proxy net minder veilig dan de directe koppeling naar Profit. Echter, het is wel altijd een goed idee om een stap extra te zetten om de hoeveelheid mensen die potentieel de data kunnen benaderen te verkleinen. Je kan daarvoor op IP niveau filtering aanbrengen voor je Azure Function App. In ons geval weten we zeker dat alleen vanaf 2 kantoren en onze datacenters gewerkt mag worden met deze data (alles voor Power BI loopt via onze “On-premises Data Gateways”).

Open hiervoor het overzicht van je function app, kies hier voor “Platform features”:

Azure Function Apps  - Overview

Vervolgens voor “networking”:

Azure Function Apps - Networking

Onderaan zie je de optie “ip restrictions”:

Azure Function Apps - beveiliging - IP

Je ziet dan een pagina zoals hier onder:

Azure Function Apps - beveiliging - IP Filter

Hier kan je regels toevoegen om de adressen vanaf waar de apps benaderd mogen worden te beperken.

Tot slot

Het heeft even geduurd voordat ik dit artikel daadwerkelijk helemaal af heb kunnen maken. De techniek hier achter is niet heel complex maar er zijn talloze mogelijkheden en oplossingen denkbaar in Azure. Ik wilde graag iets meer ervaring opdoen voordat ik dit stuk helemaal af zou ronden. Dit zodat iemand die hier mee aan de slag gaat geen onnodige stappen hoeft te zetten of onnodige risico’s loopt.

Mochten er naar aanleiding van dit stuk nog vragen zijn hoor ik het graag!

Leave a Reply

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.