En esta nueva entrada del Blog vamos a explicar paso a paso cómo se puede redimensionar, pausar y activar automáticamente PowerBi Embedded de Azure de una manera sencilla y rápida. Para ello vamos a intentar plasmar paso a paso cuál sería el procedimiento, pero antes de nada debemos tener en cuenta los siguientes puntos necesarios de partida:

  • Creamos un “Resource Group” donde ubicaremos los elementos necesarios.
  • Crearemos un “Storage Account” para alojar logs y scripts.
  • Crearemos un “Function App” para automatizar las tareas que necesitemos.
  • Crearemos un “App Registration” para conceder permisos sobre la instancia de PowerBI.
  • Escribiremos unos pequeños scripts en PowerShell que realizarán las tareas de redimensionado, pause y activado de PowerBI.

Ahora ya podemos comenzar a explicar paso por paso el procedimiento a seguir:

1.- Presuponemos que tenemos ya creada una instancia de PowerBI Embedded en Azure y nos hemos logado en el portal de Azure.

2.- Creamos un “Resource Group” donde alojar los distintos elementos, en este caso se llamará rg_auto:

3.- Desde dentro del “Resource Group” buscaremos y crearemos un “Function App”:

4.- Definiremos el “Function App” con los siguientes datos:

  • App Name: startstoppowerbi (Elegimos un nombre)
  • Resource Group: rg_auto (Creado anterioemente)
  • OS: Windows (Utilizaremos el Stack PowerShell)
  • Hosting Plan: Consumption Plan (Pagaremos únicamente por las ejecuciones realizadas)
  • Runtime Stack: PowerShell Core (Preview)
  • Storage: Seleccionamos “Create new” e indicamos un nombre para la cuenta de almacenamiento donde se guardarán los script y logs)
  • Application Insights: Dejamos la opción activada la cual nos ayudará a comprobar posibles problemas.
  • Pulsamos en “Create”

5.- Los elementos resultantes serán:

6.- Pasaremos a dar permisos sobre la instancia de PowerBI a la “Function App” recién creada. En el menú de la izquierda, buscamos la opción “Azure Active Directory” y pulsamos sobre ella:

7.- En el menú de la izquierda del blade “Azure Active Directory” pulsamos sobre “App registrations”:

8.- Crearemos una nueva “App registration“ desde el botón:

9.- Indicaremos un nombre que podamos recordar a posterior y pulsamos sobre “Register”:

10.- Una vez se ha creado, crearemos un secreto desde “Certificates & secrets“:

11.- Pulsamos en “New client secret”:

12.- Indicamos un nombre en el campo “Description” y cuanto tiempo de duración queremos:

13.- Copiamos el valor del secreto, ya que solo podremos verlo en este momento antes de cambiar de blade, en este caso es: 0FMemcCl1Dpy1z]7Q-+ESD_@3l6+4udS

14.- Pulsamos sobre la opción Overview para ver los datos generales y tomar los que necesitamos:

15 .- Los datos necesarios además del secreto son:

  • Application (client) ID
  • Directory (tenant) ID

16.- Abriremos el “Resource Group” que contiene la instancia de PowerBI Embedded, y en esta, iremos a la opción “Access control (IAM)”:

17.- Pulsamos sobre el botón “Add a role assignment”:

18.- Buscaremos nuestra “App Registration”, la seleccionaremos, daremos el rol de “Contributor”, y pulsaremos en “Save”:

19.- Para que las tareas se ejecuten a las horas seleccionadas, debemos configurar el “App Service” en la franja horaria que corresponda. Volveremos al “Resource Group” que contiene el “App Service“ anteriormente creado, y lo seleccionaremos:

20.- Bajo configured features, pulsamos “Configuration”:

21.- Añadimos una nueva configuración pulsando en:

22.- Insertamos los valores de nuestra zona horaria, y guardamos la configuración:

23.- Reiniciamos el “Function App

24.- Pulsamos sobre el símbolo “+” junto a Functions para añadir una nueva función:

25.- Indicamos la opción “In-portal” y pulsamos en “Continue”:

26.- Indicamos la opción “Timer” y pulsamos en “Create”:

27.- Veremos una pantalla como la siguiente:

28.- Ahora escribiremos el código en PowerShell necesario para por ejemplo pausar la instancia de PowerBI Embedded, reemplazaremos el código anterior por:

  • # Input bindings are passed in via param block.

param($Timer)

  • # Get the current universal time in the default string format

$currentUTCtime = (Get-Date).ToUniversalTime()

  • # The ‘IsPastDue’ porperty is ‘true’ when the current function invocation is later than scheduled.

if ($Timer.IsPastDue) {

Write-Host «PowerShell timer is running late!«}

  • # Write an information log with the current time.

Write-Host «PowerShell timer trigger function ran! TIME: $currentUTCtime»

  • #Connect to Azure:

$azureAplicationIdXXXXXXXXXXXXXXXXXXXXXXXXXXXXX«

$azureTenantId= «XXXXXXXXXXXXXXXXXXXXXXXXXXXXX«

$azurePassword = ConvertTo-SecureString «XXXXXXXXXXXXXXXXXXXXXXXXXXXXX» -AsPlainText -Force

$psCred = New-Object System.Management.Automation.PSCredential($azureAplicationId , $azurePassword)

Connect-AzAccount -Credential $psCred -TenantId $azureTenantId -ServicePrincipal

  • #Parada de servicio:

Suspend-AzPowerBIEmbeddedCapacity -Name XXXXXXX -ResourceGroupName XXXXXXX

  • #Preguntamos el estado

Get-AzPowerBIEmbeddedCapacity

[TimeZoneInfo]::Local

Get-Date -format r

En este script necesitaremos modificar los valores que en el código aparecen con “XXX” por los datos recogidos cuando creamos el “App Registration”, el Resouce Group de la instancia de PowerBI, y el nombre de la instancia PowerBI:

  • $azureAplicationIdApplication (client) ID«
  • $azureTenantId= «Directory (tenant) ID«
  • $azurePassword = ConvertTo-SecureString «SECRET» -AsPlainText -Force

Suspend-AzPowerBIEmbeddedCapacity -Name NOMBRE DE RESOURCE GROUP -ResourceGroupName NOMBRE DE INSTANCIA

29.- Una vez modificado, pulsamos en guardar:

30.- Para probarlo, pulsaremos en “Run”:

31.- En la parte inferior  se abrirá una ventana mostrando el log de ejecución, deberíamos recibir un mensaje del estilo:

2019-08-21T09:55:41.382 [Information] Executed ‘Functions.TimerTrigger1’ (Succeeded, Id=8a5ca854-7a19-4036-8a58-ce88252fb521)

32.- En la opción “Activity log” de la instancia de PowerBi deberemos ver el evento iniciado por el “App Registration”:

Y la instancia deberá estar en estado “Paused”:

33.- Para programar este apagado automáticamente a una hora de nuestra elección, pulsaremos sobre la opción “Integrate” en nuestra función:

Para parar la instancia todos los días a las 20:00 horas indicaríamos en formato “cron” y pulsaremos en “Save”:

En el link “Documentation” disponemos de mas información al respecto:

34.- En la opción “Monitor” de la función, podremos ver el resultado de las ejecuciones:

Pulsando sobre una de ellas veremos los detalles de la misma:

35.- Para iniciar la instancia automáticamente crearemos una nueva función, utilizando el mismo código que anteriormente, y reemplazando:

  • #Parada de servicio: Suspend-AzPowerBIEmbeddedCapacity -Name XXXXXXX -ResourceGroupName XXXXXXX
  • Lo cambiamos por #Inicio de servicio: Resume-AzPowerBIEmbeddedCapacity -Name XXXXXXX -ResourceGroupName XXXXXXX

36.- Para cambiar el tamaño de la  instancia automáticamente crearemos una nueva función, utilizando el mismo código  que anteriormente, y reemplazando:

  • #Parada de servicio: Suspend-AzPowerBIEmbeddedCapacity -Name XXXXXXX -ResourceGroupName XXXXXXX
  • Lo cambiamos por #Cambio de capacidad a A1: Update-AzPowerBIEmbeddedCapacity -Name XXXXXXX -ResourceGroupName rg_XXXXXXX -Sku A1. Esto sería para un tamaño “A1”.

– Para un tamaño “A2”: #Cambio de capacidad a A2: Update-AzPowerBIEmbeddedCapacity -Name XXXXXXX -ResourceGroupName XXXXXXX-Sku A2

– Para un tamaño “A3”: #Cambio de capacidad a A3: Update-AzPowerBIEmbeddedCapacity -Name XXXXXXX -ResourceGroupName XXXXXXX-Sku A3

– Y sucesivamente hasta el tamaño máximo “A6”

37.- Para este ejemplo hemos utilizado como disparador de la función, un momento del día usando la opción:

Pero disponemos de otros disparadores diferentes que pueden adecuarse mejor a nuestras necesidades como:

Y muchos otros que encontrarás en la colección.

About Mariano

Senior technician in electricity and electronics. He is certified in Gk4509 - Big Data on AWS, AWS Certified Solutions Architect - Associate and AWS Certified Solutions Architect - Professional. He began his professional career 15 years ago in Telvent, passing through the positions of monitoring operator, Backoffice, systems administrator, and Service architect. Later, in Tecnocom he worked 3 years as a systems administrator, and finally in 2017 he joined the Enimbos team as Cloud Consultant.