Skip to content

Blog

Power BI On-Premises Data Gateway: guía práctica (instalación estándar)

Resumen

Esta entrada explica de forma práctica qué es el Power BI On-Premises Data Gateway Standard, su arquitectura básica, y cómo realizar una instalación estándar y configurarlo para refrescos y conexiones seguras desde el servicio de Power BI. Está orientada a administradores y responsables de plataforma que necesiten conectar fuentes de datos locales a Power BI sin usar soluciones de red avanzadas (no cubre la instalación en Virtual Network Data Gateway ni escenarios sovereign).

¿Qué es el On-Premises Data Gateway?

El On-Premises Data Gateway es un componente que actúa como puente entre los servicios cloud de Microsoft (por ejemplo, Power BI, Power Automate, Power Apps) y tus datos que residen en la red local o en entornos no accesibles públicamente. Proporciona un canal saliente seguro (TLS) para permitir conexiones desde la nube hacia los orígenes de datos on‑premises sin abrir puertos entrantes en tu red.

Principales funciones:

  • Habilitar refrescos programados de datasets de Power BI.
  • Soportar consultas en vivo (DirectQuery/Live Connection) hacia orígenes compatibles.
  • Permitir que flujos y aplicaciones en cloud accedan a bases de datos y servicios internos.

Arquitectura básica

  • Gateway instalado en uno o varios servidores dentro de la red local.
  • El servicio gateway establece conexiones salientes a los endpoints de Microsoft (no requiere inbound).
  • En producción, se recomienda desplegar gateways en modo cluster (alta disponibilidad) y definir data sources centralizados en el panel de administración de Power BI.

Diagrama (simplificado)

flowchart LR
  PB["Power BI Service"]
  AZ["Azure Relay / Service Bus"]
  GW["On-Premises Gateway"]
  DB["Origen de datos"]
  DB --> GW
  GW --> | TLS saliente | AZ
  AZ --> PB

Arquitectura: Gateway en cluster (alta disponibilidad)

flowchart LR
  subgraph Cloud["Servicio Cloud"]
    PB["Power BI Service"]
  end

  subgraph Cluster["Cluster de Gateways (HA)"]
    GW1["Gateway - Nodo 1"]
    GW2["Gateway - Nodo 2"]
    GW3["Gateway - Nodo N"]
  end

  subgraph OnPrem["Red On-Premises"]
    DB["(Origen de datos)"]
  end
  AZ["Azure Relay / Service Bus"]


  GW1 --- GW2
  GW2 --- GW3
  AZ --> PB
  Cluster --> | TLS saliente | AZ
  DB --> Cluster


Note

Físicamente el Gateway establece conexiones salientes TLS hacia los servicios de Azure (Azure Service Bus / Azure Relay). Las solicitudes brokered se mantienen gracias a las conexiones salientes iniciadas por el gateway.

Instalación (instalación estándar)

Los pasos siguientes describen una instalación típica y segura de un Gateway estándar:

  1. Descargar el instalador oficial
  2. Descargar el instalador del gateway desde el sitio oficial de Microsoft.

  3. Ejecutar el instalador en el servidor destinado

  4. Ejecuta el instalador con privilegios de administrador.
  5. Acepta los términos y elige la instalación estándar cuando se solicite.

  6. Iniciar sesión y registrar el gateway

  7. Al finalizar la instalación se abrirá un asistente que solicita iniciar sesión con una cuenta organizativa (Entra ID).
  8. Registra el gateway en tu tenant y proporciona un nombre descriptivo para el gateway.

  9. Definir la clave de recuperación

  10. El asistente pedirá que crees una "recovery key". Guárdala en un lugar seguro: es necesaria para migrar o restaurar el gateway.

  11. Elegir cuenta de servicio (opcional)

  12. Puedes ejecutar el servicio con la cuenta de sistema local por defecto o configurar una cuenta de dominio/service account con los permisos mínimos necesarios para acceder a los orígenes de datos.

  13. Verificar conectividad

  14. Asegúrate de que el servidor puede establecer conexiones TLS salientes a los endpoints de Microsoft (comprobar reglas de firewall/proxy si existen).

  15. (Opcional) Agregar nodos al cluster

  16. Para alta disponibilidad, instala el gateway en otro servidor y en lugar de registrar un nuevo gateway selecciona unirte al cluster existente.

Configuración en el servicio Power BI

  1. Abrir el portal de Power BI y acceder a "Manage gateways" (Administrar gateways).
  2. Crear y/o revisar Data Sources dentro del gateway: especifica el tipo de origen (SQL Server, Analysis Services, etc.), cadena de conexión, y credenciales.
  3. En los datasets de Power BI: configurar el dataset para usar el gateway correspondiente y programar refrescos.
  4. Para DirectQuery/Live connection: asegúrate de que el data source esté correctamente configurado y que el usuario tenga permisos adecuados.

Consejos prácticos:

  • Centraliza la definición de data sources para facilitar el mantenimiento.
  • Usa credenciales de tipo "service principal" o cuentas administradas cuando el origen lo permita y por seguridad.

Buenas prácticas y seguridad

  • Alta disponibilidad: despliega gateways en cluster para evitar puntos únicos de fallo.
  • Mínimos privilegios: la cuenta que use el gateway solo debería tener los permisos necesarios en los orígenes de datos.
  • Key management: guarda la recovery key en un almacén seguro y documenta el proceso de recuperación.
  • Parches y mantenimiento: aplica actualizaciones del sistema operativo y del gateway según las políticas de tu organización.
  • Monitorización: habilita logs y métricas para detectar problemas de rendimiento y errores en los refrescos.
  • Red y firewall: permite únicamente el tráfico saliente necesario hacia los endpoints de Microsoft y evita abrir puertos entrantes.

Monitorización y diagnóstico

  • Revisa el panel de estado del gateway en Power BI Service para incidentes y estado de los nodos.
  • Examina los registros locales del gateway (ubicación estándar indicada por el instalador) para errores detallados.
  • Utiliza contadores de rendimiento (CPU, memoria, latencia de red) en el servidor para diagnosticar cuellos de botella.
  • Para problemas de refresco: revisa el historial de refrescos del dataset en Power BI y los detalles del error proporcionados por el servicio.

Referencias y lecturas recomendadas

  • Documentación oficial de Microsoft (Power BI - On-premises data gateway): https://learn.microsoft.com/power-bi/connect-data/service-gateway-onprem

Documentar con EPAC

EPAC tiene una opción muy útil llamada "Document All Assignments" que genera Markdown y CSV con todas las asignaciones de policy. Pero hay dos detalles importantes que conviene saber:

1) Antes no se podían excluir tipos enteros de scope (por ejemplo: todas las subscriptions o resourceGroups) desde la configuración.

2) He subido una PR para solucionarlo: https://github.com/Azure/enterprise-azure-policy-as-code/pull/1056

Aquí lo que cambia, rápido y claro.

Problema

Si usas documentAllAssignments y quieres evitar documentar todo lo que hay a nivel de suscripción o de resource groups, la versión anterior obligaba a listar cada id con skipPolicyAssignments o a procesar el CSV resultante. En entornos grandes eso resulta muy tedioso y genera mucho ruido en los informes.

Qué hace la PR #1056

  • Añade excludeScopeTypes en la configuración de documentAllAssignments. Con esto se puede indicar que no se documenten assignments que estén en subscriptions o en resourceGroups.

  • Añade StrictMode (switch) en los scripts. Por defecto está activado. Si lo desactivas (-StrictMode:$false) el script no aborta cuando falta alguna definición; registra avisos y continúa. Útil en pipelines de prueba.

  • Mejora el parsing y el manejo de skipPolicyAssignments/skipPolicyDefinitions (funcionan mejor con arrays u objetos) y corrige bugs menores (p. ej. convertir markdownMaxParameterLength a entero).

PR: https://github.com/Azure/enterprise-azure-policy-as-code/pull/1056

Antes / Después (ejemplo práctico)

Antes tenías que usar algo así:

{
  "documentAssignments": {
    "documentAllAssignments": [
      {
        "pacEnvironment": "EPAC-Prod",
        "skipPolicyAssignments": [],
        "skipPolicyDefinitions": ["/providers/.../policySetDefinitions/..."]
      }
    ]
  }
}

Después basta con añadir excludeScopeTypes:

{
  "documentAssignments": {
    "documentAllAssignments": [
      {
        "pacEnvironment": "EPAC-Prod",
        "excludeScopeTypes": ["subscriptions", "resourceGroups"],
        "skipPolicyAssignments": [],
        "skipPolicyDefinitions": ["/providers/.../policySetDefinitions/..."]
      }
    ]
  }
}

Y si quieres pruebas rápidas sin que el pipeline falle por referencias rotas:

./Build-PolicyDocumentation.ps1 -StrictMode:$false

Recomendaciones prácticas

  • Usa excludeScopeTypes para reducir ruido cuando necesites una vista global.
  • No confundas excludeScopeTypes con exemptions: esto solo evita que se documente; no evita que la policy se aplique. Para eso usa exemptions.

  • Mantén StrictMode activado en producción (ayuda a detectar referencias rotas).

  • Usa skipPolicyAssignments para exclusiones puntuales que conozcas por id.

Cierre

La mejora es pequeña pero práctica: menos limpieza manual, informes más útiles. Si quieres puedo:

  • Añadir un ejemplo real con IDs/outputs.
  • Hacer build local del sitio y comprobar cómo queda el Markdown final.

PR de referencia: https://github.com/Azure/enterprise-azure-policy-as-code/pull/1056

Resumen

Azure Cosmos DB for MongoDB vCore es MongoDB real en Azure, con arquitectura vCore (CPU + RAM) que escala vertical y horizontalmente sin downtime. Soporte nativo para vector search (DiskANN), sharding automático y 99.99% SLA con HA activado. Ideal para lift & shift de aplicaciones MongoDB existentes o nuevas apps que necesiten queries complejas, aggregations y transacciones distribuidas.

Ephemeral OS Disks en Azure Virtual Desktop

Resumen

Azure Virtual Desktop ahora soporta Ephemeral OS Disks (Public Preview desde octubre 2025), una característica que mejora significativamente el rendimiento y velocidad de aprovisionamiento en entornos de escritorios virtuales. Los discos efímeros almacenan el sistema operativo en el almacenamiento local de la VM en lugar de en Azure Storage remoto, proporcionando latencias más bajas y tiempos de reimagen más rápidos, ideales para cargas de trabajo stateless.

¿Qué son los Ephemeral OS Disks?

Los Ephemeral OS Disks son discos de sistema operativo creados en el almacenamiento local de la máquina virtual (SSD local, cache o disco temporal) en lugar de almacenarse en Azure Storage remoto. Esta arquitectura ofrece ventajas clave para entornos AVD donde la persistencia del sistema operativo no es crítica.

Características principales:

  • Almacenamiento en disco local (cache o temp disk de la VM)
  • Aprovisionamiento y reimagen ultra rápidos
  • Menor latencia en operaciones de lectura/escritura
  • Optimizado para host pools de tipo pooled
  • No persistente: reinicio/reimagen/delete únicamente (no soporta stop/deallocate)

¿Por qué usar Ephemeral OS Disks en AVD?

Beneficios concretos:

  1. Rendimiento mejorado: Operaciones I/O directas sobre almacenamiento local
  2. Provisioning más rápido: Creación de session hosts en menos tiempo
  3. Reimagen acelerado: Reset de VMs al estado original en segundos
  4. Coste optimizado: No se consumen recursos de Azure Storage remoto
  5. Ideal para VDI stateless: Los perfiles de usuario se persisten en FSLogix/Azure Files

Arquitectura y funcionamiento

flowchart LR
    A[Session Host VM] -->|OS Disk| B[Local SSD/Cache]
    A -->|User Profiles| C[FSLogix Container]
    C -->|Storage| D[Azure Files/NetApp]

    style B fill:#2ecc71
    style D fill:#3498db

Diferencia clave con discos persistentes:

Aspecto Ephemeral OS Disk Managed OS Disk
Ubicación Almacenamiento local VM Azure Storage remoto
Latencia I/O Muy baja Mayor (red)
Persistencia No persistente Persistente
Operaciones Restart/Reimage/Delete Start/Stop/Deallocate/Snapshot
Coste Incluido en VM Coste adicional storage

Placement options:

  • OS Cache: Para imágenes ≤ 127 GiB (ej: Windows Server)
  • Temp Disk: Para imágenes que requieren >127 GiB y VM con disco temporal suficiente

Requisitos y limitaciones

Requisitos

  • Host pool de tipo Pooled con Session Host Configuration
  • Tamaño de imagen ≤ cache/temp disk disponible en VM size elegida
  • Solo soportado en Azure (no Azure Government durante preview)

Limitaciones importantes

No soporta:

  • Deallocate de VMs (solo restart, reimage, delete)
  • VM snapshots
  • Azure Disk Encryption
  • Azure Backup
  • Azure Site Recovery
  • OS Disk Swap
  • NVMe y Premium SSD (durante preview)

Configuración de autoscaling:

  • Usar Dynamic Autoscaling con Minimum percentage of active hosts = 100%
  • Evita operaciones stop/deallocate incompatibles con ephemeral disks

Configuración práctica

Paso 1: Crear host pool con Ephemeral OS Disk (Portal)

# Configuración requerida en Azure Portal

Host Pool Type: Pooled
Management Type: Automated
Session Host Configuration: Enabled

# En la pestaña Virtual Machines:
Image: Windows 11 Enterprise multi-session
Virtual Machine Size: Standard_D8s_v3 (temp disk 200 GiB)
OS Disk Type: Standard SSD (auto-selected)
Ephemeral OS Disk: Enabled
Placement: Temp Disk

Paso 2: Crear session host configuration con PowerShell

# Variables del entorno
$resourceGroup = "avd-rg"
$hostPoolName = "avd-ephemeral-pool"
$location = "westeurope"
$vmPrefix = "avd-eph"
$vmSize = "Standard_D8s_v3"
$subnetId = "/subscriptions/<SUB_ID>/resourceGroups/<RG>/providers/Microsoft.Network/virtualNetworks/<VNET>/subnets/<SUBNET>"

# Crear session host configuration con ephemeral disk
$parameters = @{
    FriendlyName = "Ephemeral Session Hosts"
    HostPoolName = $hostPoolName
    ResourceGroupName = $resourceGroup
    VMNamePrefix = $vmPrefix
    VMLocation = $location
    ImageInfoType = "Marketplace"
    MarketplaceInfoPublisher = "MicrosoftWindowsDesktop"
    MarketplaceInfoOffer = "Windows-11"
    MarketplaceInfoSku = "win11-22h2-avd"
    MarketplaceInfoExactVersion = "latest"
    VMSizeId = $vmSize
    DiskInfoType = "Standard_LRS"  # Standard SSD requerido en preview
    NetworkInfoSubnetId = $subnetId
    DomainInfoJoinType = "AzureActiveDirectory"
    VMAdminCredentialsUsernameKeyVaultSecretUri = "https://<VAULT>.vault.azure.net/secrets/<SECRET>/..."
    VMAdminCredentialsPasswordKeyVaultSecretUri = "https://<VAULT>.vault.azure.net/secrets/<SECRET>/..."
}

New-AzWvdSessionHostConfiguration @parameters

Paso 3: Validar tamaños de VM compatibles

# Listar VM sizes con soporte ephemeral disk
$location = "westeurope"
$vmSizes = Get-AzComputeResourceSku -Location $location |
    Where-Object {$_.ResourceType -eq 'virtualMachines'}

foreach ($vmSize in $vmSizes) {
    foreach ($capability in $vmSize.Capabilities) {
        if ($capability.Name -eq "EphemeralOSDiskSupported" -and $capability.Value -eq "True") {
            [PSCustomObject]@{
                VMSize = $vmSize.Name
                EphemeralSupported = $capability.Value
                CacheSize = ($vmSize.Capabilities | Where-Object {$_.Name -eq "CachedDiskBytes"}).Value
                TempDiskSize = ($vmSize.Capabilities | Where-Object {$_.Name -eq "MaxResourceVolumeMB"}).Value
            }
        }
    }
}

Paso 4: Configurar autoscaling para ephemeral disks

# Crear scaling plan con configuración específica para ephemeral
$scalingParams = @{
    HostPoolName = $hostPoolName
    ResourceGroupName = $resourceGroup
    ScheduledDateTimeZone = "W. Europe Standard Time"
    UpdateLogOffDelayMinute = 15
    UpdateMaxVmsRemoved = 10
    UpdateDeleteOriginalVM = $true  # Importante: eliminar VMs en lugar de deallocate
    UpdateLogOffMessage = "El sistema se reiniciará para mantenimiento en 15 minutos"
}

New-AzWvdSessionHostManagement @scalingParams

Migración de host pools existentes

Para migrar un host pool con managed disks a ephemeral:

# 1. Actualizar session host configuration
$updateParams = @{
    HostPoolName = $hostPoolName
    ResourceGroupName = $resourceGroup
    VMSizeId = "Standard_D8s_v3"  # VM size con temp disk suficiente
    DiskInfoType = "Standard_LRS"
}

Update-AzWvdSessionHostConfiguration @updateParams

# 2. Programar update para aplicar cambios (reemplaza session hosts)
# Nota: Esto recreará los session hosts con ephemeral disks

# 3. Monitorizar progreso
$progress = Get-AzWvdSessionHostManagementsUpdateStatus @updateParams |
    Format-List PercentComplete, ProgressSessionHostsCompleted, EndTime

$progress

Buenas prácticas

Persistencia de datos:

  • Usar FSLogix Profile Containers para perfiles de usuario
  • Almacenar datos en Azure Files o Azure NetApp Files
  • Configurar redirección de carpetas conocidas (OneDrive, Documents)

Gestión de ciclo de vida:

  • Implementar lógica restart/delete en scripts de autoscaling
  • Evitar usar stop/deallocate (genera pérdida de datos)
  • Programar reimaging periódico para refresh de session hosts

Sizing correcto:

  • Verificar que image size ≤ cache/temp disk disponible
  • Para Windows 11 multi-session (127 GiB): usar VMs con temp disk ≥ 127 GiB
  • Preferir temp disk placement sobre cache para mayor espacio disponible

Monitorización:

  • Alertas sobre tasa de reimage/restart
  • Métricas de latencia de disco en Azure Monitor
  • Revisar logs de deployment failures relacionados con tamaño insuficiente

Troubleshooting común

Error: "Insufficient local storage"

# Causa: VM size sin suficiente cache/temp disk
# Solución: Cambiar a VM size mayor o con temp disk adecuado

# Verificar tamaño requerido
$imageSize = 127  # GiB para Windows 11 multi-session
Get-AzComputeResourceSku -Location $location |
    Where-Object {$_.Name -eq "Standard_D8s_v3"} |
    Select-Object Name, @{N="TempDiskGB";E={[math]::Round(($_.Capabilities |
        Where-Object {$_.Name -eq "MaxResourceVolumeMB"}).Value / 1024)}}

Error: "NVMe placement not supported"

Causa: Selección de NVMe como placement durante preview
Solución: Usar Temp Disk o Cache placement en Azure Portal

Pérdida de datos tras deallocate:

Causa: Operación stop/deallocate borra OS state en ephemeral disks
Solución: Configurar autoscaling con UpdateDeleteOriginalVM = $true
Usar restart en lugar de deallocate para operaciones manuales

Referencias

Analizando VNet Flow Logs en Azure

En este post explico qué son los VNet flow logs (logs de flujo de red de Azure), cómo habilitarlos y cómo analizarlos con un pequeño script PowerShell que desarrollé para facilitar la detección de anomalías y la generación de reportes.

Documentación oficial (Microsoft):

https://learn.microsoft.com/azure/network-watcher/vnet-flow-logs-overview

Resumen rápido

  • Los VNet flow logs capturan información sobre el tráfico IP que atraviesa subredes y recursos dentro de una Virtual Network. Almacenan datos similares a los NSG flow logs pero a nivel de VNet.
  • Se pueden enviar a una cuenta de almacenamiento, a Log Analytics o a Event Hub. El formato JSON resultante contiene un array records con campos que describen cada flujo y sus métricas (bytes, paquetes, acción, puertos, etc.).

Por qué analizarlos

  • Identificar hosts con alto volumen de tráfico.
  • Detectar intentos de escaneo de puertos o reintentos persistentes.
  • Encontrar conexiones denegadas o patrones sospechosos.

Herramienta: script PowerShell

He incluido un script llamado Analyze-VNETFlowLogs.ps1 que procesa archivos JSON con VNet flow logs y genera un análisis en consola. Además puede exportar dos ficheros CSV con el detalle y el resumen del análisis.

(Opcional) Descarga de Flow Logs previa

Si tus logs están aún en la cuenta de almacenamiento, puedes usar el script de apoyo Download-FlowLogs.ps1 para:

  • Descargar todos los blobs del contenedor (por defecto insights-logs-flowlogflowevent).
  • Manejar rutas largas en Windows (hash si usas -AutoShorten).
  • Reorganizar los archivos en una jerarquía YYYY-MM-DD/HH/FlowLog_<timestamp>_*.json.
  • Facilitar un patrón único de entrada para el analizador.

Parámetros clave: - -StorageAccount (obligatorio): Nombre de la storage account. - -ContainerName: Contenedor (default: insights-logs-flowlogflowevent). - -DownloadPath: Carpeta destino local (default: ./FlowLogs). - -AutoShorten: Acorta automáticamente rutas demasiado largas mediante hashing. - -Force: Omite confirmaciones interactivas.

Variables de entorno soportadas: - AZ_STORAGE_KEY: Si está definida se usa esa clave directamente. - AZ_RESOURCE_GROUP: Permite intentar descubrir la key si no se pasó manualmente.

Si no hay clave disponible o el intento de descubrimiento falla, se intentará usar automáticamente --auth-mode login para la autenticación.

Ejemplo de uso completo (descarga + análisis):

# 1. Descargar y organizar
pwsh -File ./Download-FlowLogs.ps1 -StorageAccount mystorageacct -DownloadPath ./FlowLogs -AutoShorten -Force

# 2. Analizar todos los logs resultantes
pwsh -File ./Analyze-VNETFlowLogs.ps1 -LogFiles "./FlowLogs/**/*.json" -ExportCSV -OutputPath ./reports -ShowGraphs

Si ya tienes los JSON en local (por AzCopy u otro método), puedes saltarte el paso 1.

Dónde está el script y ejemplos

Cómo usar el script

  1. Preparar archivos JSON descargados desde la cuenta de almacenamiento o exportados desde Log Analytics.
  2. Abrir PowerShell (Windows) o pwsh (Linux/macOS) y ejecutar (ejemplo):
pwsh -File "./Analyze-VNETFlowLogs.ps1" -LogFiles "./samples/*.json" -ExportCSV -OutputPath "./reports" -ShowGraphs

Explicación rápida de parámetros

  • -LogFiles: rutas a los JSON (acepta wildcards).
  • -ExportCSV: exporta VNetFlowAnalysis_Details_<timestamp>.csv y VNetFlowAnalysis_Summary_<timestamp>.csv.
  • -OutputPath: directorio para los CSV.
  • -SpecificIPs: array de IPs para análisis centrado en hosts concretos.
  • -ShowGraphs: muestra gráficas de barras simples en la consola.

Ejemplo práctico (archivo de ejemplo incluido)

  • He añadido samples/sample-flowlog.json con varios flujos que cubren casos típicos (permitidos, denegados, varios BEGIN para simular reintentos/posible escaneo).
  • Ejecutando el comando anterior sobre ese ejemplo se generan dos CSV de salida en reports/ y se muestra un resumen en consola.

Notas y recomendaciones

  • El script agrupa los flows en memoria para facilitar el análisis; para datasets muy grandes conviene procesar por lotes o filtrar por rango de tiempo antes de ejecutar.
  • Revisa la documentación oficial (enlace arriba) si tu flujo JSON tiene un formato distinto o campos adicionales; la función Parse-FlowTuple del script espera un orden concreto de campos, que puedes adaptar si es necesario.

Contribuciones y siguientes pasos

  • Si quieres, puedo añadir un conjunto de tests que ejecuten el script sobre el ejemplo y verifiquen los CSV generados automáticamente.
  • También puedo crear un pequeño tutorial paso a paso para habilitar VNet flow logs en Azure y obtener los JSON desde una cuenta de almacenamiento.

Archivos incluidos

  • Analyze-VNETFlowLogs.ps1 — script principal.
  • Download-FlowLogs.ps1 — utilidad para descargar y normalizar logs desde la cuenta de almacenamiento.
  • README.md — instrucciones y referencia a la doc oficial.
  • samples/sample-flowlog.json — ejemplo para pruebas.

Espero que esto te ayude a analizar flujos en tus VNets.