¡Hola! Soy Josefina Depetris, soy Economista y cuando estudiaba siempre mis materias favoritas fueron aquellas relacionadas a los datos y al manejo de los mismos. En ese momento trabajaba en BI y de a poquito me fui metiendo en el mundo de Data Engineering. Me desvié bastante de mi carrera y encontré algo muy interesante. Ahora hace ya casi un año que trabajo en Pi Data Strategy & Consulting como Data Engineer donde utilizo principalmente los servicios de Azure y trabajo diariamente con Azure Data Factory.
Siempre me han servido mucho los videos y los posts que encuentro en los distintos blogs, y es por eso que en este momento quiero compartirles algo que a mí me viene sirviendo, como refrescar un dataset de Power BI desde Azure Data Factory a través de Service Principal.
En 2019 Martín Zurita junto con Ignacio Barrau escribieron un post en LaDataWeb sobre "Usar Power Bi API sin permiso del administrador" y hoy quiero completarlo añadiendo la opción de usar Service Princial en vez de usuario y ya que estamos, como hacerlo desde Data Factory.
En general, los usuarios siempre estarán interesados en mostrar siempre el último dato o actualización disponible. Podríamos programar una actualización del DataSet de Power BI en determinado horario o cada cierta cantidad de horas, pero si hacemos la carga y transformación de los datos desde un pipeline… ¿Por qué no hacer la actualización apenas finaliza? La respuesta es "deberíamos", puesto que es mejor para tener todo el flujo orquestado por una sola herramienta. Para esto, agregaremos a nuestro pipeline de Data Factory la actualización del DataSet y estaremos siempre al día.
Seguiremos con la premisa de Martin e Ignacio, conectarnos sin que el administrador le otorgue los permisos a la app que leerá la API y realizaremos los primeros pasos de manera similar.
Configuración en Azure
Primero vamos a registrar la app o Service Principal en Azure Active Directory y agregar URI de redirección https://localhost:13526/Redirect

Una vez que tenemos la app, vamos a asignarle los permisos adecuados:
Permisos de API – conceder permisos de Read and Write All en Power BI Service - DataSet

Y en este momento es cuando separamos el camino del post anterior, una vez que hemos agregado los permisos de la API y la URI de redirección, no necesitaremos agregar más permisos a la app dentro de Active Directory. Ahora necesitamos obtener la clave de esta app.

¡IMPORTANTE!
Debemos asegurarnos de copiar el secreto porque aparecerá visible una única
vez. Para almacenarlo en un lugar seguro y luego poder utilizarlo. Lo
guardaremos en el Azure Key Vault.
Más información
de Azure Key Vault
Ya que estamos en el Key Vault, nos adelantaremos un poco y le daremos permisos al Data Factory para que pueda acceder a los Secretos. Esto lo hacemos para luego utilizar la API de Power BI y no tener que escribir el Secreto en la llamada de la API – estamos agregando una capa de seguridad a nuestro proceso.

Ahora del lado de Power BI…
Primero debemos asegurarnos qué se les permita a los Service Principals usar la API de Power BI. Para este paso necesitaremos los permisos de administrador o pedirle al administrador de Power BI que nos dé una mano y lo habilite por nosotros.
En el Admin Portal de Power BI, en la pestaña de "Tenant Settings" se debe habilitar (Enable) la opción "Allow service principals to use Power BI APIs". Acá hay dos opciones, se puede habilitar para toda la organización o para un grupo de seguridad en particular (en ese caso generar Grupo de Seguridad en Azure Active Directory y agregar al Service Principal como miembro de este).
Por último, debemos darle acceso al Service Principal al Workspace o al DataSet de Power BI (debemos buscar el nombre del Service Principal donde pide el Email).

¡Ya tenemos todo configurado y listo para usar las APIs de Power BI!
Podemos utilizar las APIs desde cualquier plataforma, en este caso lo haremos desde Azure Data Factory. Si quisiéramos usar Python, podemos seguir los pasos del post anterior.
El pipeline está completamente parametrizado, y podrán encontrar el código JSON en el repositorio con el cual podrán copiar el mismo y completar con sus valores los parámetros necesarios.
Azure Data Factory - Configuración general del pipeline

PASOS:

1- Service Principal Secret desde AKV
En este paso vamos a obtener el secreto que habíamos guardado en el Key Vault.
Direccion URL: https://@{pipeline().parameters.key_vault_name}.vault.azure.net/secrets/@{pipeline().parameters.secret_name}?api-version=7.0
Método: GET
Autenticacion: MSI (para esto es que le dimos permisos al
Data Factory en el Key Vault)
Recurso: https://vault.azure.net
En la pestaña General seleccionar Salida segura para que no quede expuesto el secreto.

2- Obtener Bearer Token
En este paso obtendremos el Bearer Token para autentificarnos en la API de Power BI
Direccion URL: https://login.microsoftonline.com/@{pipeline().parameters.tenant_id}/oauth2/token
Método: POST
Encabezados: Content-Type application/x-www-form-urlencoded
Cuerpo: grant_type=client_credentials&client_id=@{pipeline().parameters.service_principal_client_id}&client_secret=@{activity('Service
Principal Secret desde
AKV').output.value}&resource=https://analysis.windows.net/powerbi/api
En la pestaña General seleccionar Entrada segura para que no quede expuesto el secreto.

3- Refrescar
DataSet
En este paso obtendremos haremos finalmente el refresh del DataSet a través de la API de Power BI
Direccion URL: https://api.powerbi.com/v1.0/myorg/groups/@{pipeline().parameters.group_id}/datasets/@{pipeline().parameters.dataset_id}/refreshes
Método: POST
Encabezados:
· Content-Type application/json
·
Authorization Bearer
@{activity('Obtener Bearer Token').output.access_token}
Cuerpo: {"parametro":"no borrar"}
En la pestaña General seleccionar Entrada segura para que no quede expuesto el secreto.

Ahora ya hemos realizado el refresh en el DataSet, pero no sabemos si ha terminado exitosamente, agregaremos unos cuantos pasos más al pipeline para asegurarnos que así sea.
4- Hasta refresh completo
El paso 4 consiste en hacer otra llamada a una API de Power BI solicitando esta información. Utilizaremos una Actividad de "Hasta" en la que ejecutaremos una API que solicita información sobre los refresh del DataSet hasta que la respuesta no nos devuelva el estado "Unkown" que es aquel estado que devuelve la API mientras el refresh está en progreso.
Le estableceremos "Tiempo de espera agotado" de 1 hora ya que este es el tiempo que tiene validez el Bearer Token.
Expresión: @not(equals('Unknown',variables('Status')))
Esperar:
Tiempo
de espera en segundos: @int(pipeline().parameters.wait_seconds)
Refresh Status:
Dirección
URL:
https://api.powerbi.com/v1.0/myorg/groups/@{pipeline().parameters.group_id}/datasets/@{pipeline().parameters.dataset_id}/refreshes?$top=1
Método: GET
Encabezados:
Authorization Bearer @{activity('Obtener Bearer Token').output.access_token}
Status:
Valor:
@activity('Refresh Status').output.value[0].status

Así concluimos nuestra configuración para llamar un refresh de un dataset en Power Bi desde Azure Data Factory.
Espero que les haya sido de
utilidad.
¡Gracias por leer!
Nos vemos la próxima 😊
Escrito por Josefina Depetris