Artículo · 043 · 16 Nov 2026

Gobernar un tenant Azure con presupuesto fijo: auditar, limpiar y poner el límite como código

FinOps · AzurePresupuestos y alertasGobierno de costes

En un tenant personal con varias suscripciones, el gasto se gobierna con tres piezas: un inventario fiable antes de borrar, una limpieza guiada por ese inventario y un límite mensual declarado como código. Este artículo recorre una auditoría real con ARI y AZQR (de 24 hallazgos a 2), los ahorros obtenidos y por qué el presupuesto con alertas reales y previstas se despliega por plantilla a nivel de suscripción y no con la línea de comandos.

Este artículo cuenta cómo se pone orden en un tenant de Azure con varias suscripciones y un límite de gasto que no es negociable. Es un entorno personal de laboratorio y producción ligera, sin equipo de FinOps ni contrato corporativo, y precisamente por eso las decisiones se ven sin ruido.

1. El punto de partida: un tenant que crece solo

Un tenant personal acumula lo que acumula cualquier otro, solo que más rápido y sin nadie que pregunte por qué existe cada cosa: planes de servicio de aplicaciones de tamaño mayor del necesario, máquinas virtuales que nadie recuerda haber creado, recomendaciones que se quedan abiertas. La diferencia con una empresa es que aquí el gasto sale de un bolsillo concreto, y eso obliga a definir un límite antes de empezar a limpiar.

Fijé uno: 120 € al mes en la suscripción de producción. No es una cifra sofisticada; es el techo a partir del cual quiero enterarme. El resto del trabajo consistió en entender qué había dentro de ese techo y qué sobraba.

2. Auditar antes de tocar

Antes de borrar nada hice dos pasadas de inventario y revisión. Una con ARI (Azure Resource Inventory), para tener la lista real de recursos de cada suscripción, y otra con AZQR (Azure Quick Review), la herramienta de línea de comandos que analiza los recursos frente a las buenas prácticas de Azure y devuelve los hallazgos de configuración que no cumplen. La documentación de Microsoft la presenta como una revisión de alineamiento con recomendaciones, distinta de Azure Policy y de Azure Advisor, y es una distinción útil: cada una ve cosas diferentes.

Resultado de la auditoría: de 24 hallazgos a 2 tras la limpieza y los ajustes. No incluyo aquí la lista, porque los hallazgos concretos dependen de cada tenant; lo relevante es el orden. Primero se mide, después se decide, y solo al final se borra.

3. Dónde estaba el dinero

Los ahorros salieron de tres decisiones, ninguna sofisticada:

DecisiónAhorro aproximadoQué había detrás
Bajar de plan de servicio~33 €/mesUn plan de tamaño superior al necesario
Borrar un plan P0v3 sin uso~70 €/mesUn plan sin uso que seguía facturando
Borrar 3 máquinas virtuales huérfanasNo cuantificado por separadoMáquinas sin propietario identificable

Son cifras aproximadas de mi tenant, redondeadas, no un benchmark. Lo que conviene retener es el patrón: el gasto evitable estaba en recursos que seguían existiendo por inercia, no en la facturación del trabajo útil. La propia documentación de Advisor incluye entre sus recomendaciones de coste, en vista previa, la de «plan de App Service sin aplicaciones»; una señal barata que merece mirarse en cualquier tenant.

4. Dos sorpresas que costaron tiempo

4.1 Recomendaciones fantasma

Tras borrar varios recursos, Advisor seguía mostrando recomendaciones sobre ellos. Es una trampa de lectura: si no se comprueba el inventario real, se acaba «arreglando» algo que ya no existe o dudando de una limpieza que sí funcionó. La regla que adopté es que el inventario manda, y Advisor se contrasta contra él. Una recomendación sobre un recurso que ya no figura en el inventario es ruido, y se descarta o pospone, no se persigue.

4.2 Un ajuste huérfano que bloquea el cambio de plan

Al bajar de SKU, el cambio quedó bloqueado por un ajuste huérfano de «File Change Audit». No bastaba con elegir el plan menor: había que localizar y retirar antes ese ajuste. Es un ejemplo de por qué conviene registrar la configuración de los recursos junto con su tamaño: una bajada de plan no siempre es un cambio de un solo campo. No he verificado en la documentación de Microsoft el mecanismo exacto de ese bloqueo, así que lo cuento como lo que observé, no como un comportamiento documentado.

5. El límite como código: presupuestos con alertas

Con la limpieza hecha, el límite de 120 € necesitaba un mecanismo. Los presupuestos de Cost Management hacen exactamente eso, con tres matices que la documentación deja claros y que conviene tener presentes:

  • Avisan, no frenan. Al superar un umbral se envían notificaciones; los recursos no se ven afectados y el consumo no se detiene.
  • Tienen latencia. Los datos de coste suelen estar disponibles en 8–24 horas y los presupuestos se evalúan cada 24 horas; cuando se alcanza un umbral, el correo suele enviarse en la hora siguiente al análisis.
  • Admiten umbrales reales y previstos. Un presupuesto necesita al menos un umbral y un correo, y admite hasta cinco de cada. Los umbrales de coste previsto avisan antes de llegar al límite.

La combinación que uso es: 80 % real, 100 % real y 100 % previsto. La alerta prevista es la que anticipa; la de 100 % real es la que confirma. Es el mismo principio del artículo sobre la latencia del dato de consumo: el presupuesto es una alarma, no un freno, y su valor depende de cuánto tarda en llegar el dato.

5.1 Por qué por plantilla y no por línea de comandos

Crear el presupuesto con la CLI me dio errores que no he reproducido al redactar esto, pero la documentación explica una parte del porqué. Con la versión 2.91.0 de la CLI de Azure (comprobada el 3 de noviembre de 2026), el comando az consumption budget create está en vista previa y no expone parámetros para notificaciones ni para umbrales. La variante create-with-rg sí acepta un diccionario de notificaciones, pero está pensada para un grupo de recursos y el ejemplo oficial no incluye el tipo de umbral. El comando update exige el eTag más reciente, que hay que obtener antes con una lectura. Y la propia página de Microsoft sobre presupuestos recomienda usar las API REST para crear y editar presupuestos «porque los comandos de la CLI pueden no admitir la última versión de las API».

La salida limpia es un despliegue declarativo a nivel de suscripción, que sí admite el tipo de umbral Forecasted en la API 2023-11-01. Esta es la plantilla que uso, validada con az deployment sub validate el 3 de noviembre de 2026 (sustituye el correo y la fecha de inicio, que debe ser el primer día de un mes):

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "budgetName": { "type": "string", "defaultValue": "budget-limite-mensual" },
    "amount":     { "type": "int",    "defaultValue": 120 },
    "startDate":  { "type": "string", "defaultValue": "2026-11-01" },
    "email":      { "type": "string" }
  },
  "resources": [{
    "type": "Microsoft.Consumption/budgets",
    "apiVersion": "2023-11-01",
    "name": "[parameters('budgetName')]",
    "properties": {
      "category": "Cost",
      "amount": "[parameters('amount')]",
      "timeGrain": "Monthly",
      "timePeriod": { "startDate": "[parameters('startDate')]" },
      "notifications": {
        "actual_80":    { "enabled": true, "operator": "GreaterThanOrEqualTo", "threshold": 80,
                          "thresholdType": "Actual",     "contactEmails": [ "[parameters('email')]" ] },
        "actual_100":   { "enabled": true, "operator": "GreaterThanOrEqualTo", "threshold": 100,
                          "thresholdType": "Actual",     "contactEmails": [ "[parameters('email')]" ] },
        "forecast_100": { "enabled": true, "operator": "GreaterThanOrEqualTo", "threshold": 100,
                          "thresholdType": "Forecasted", "contactEmails": [ "[parameters('email')]" ] }
      }
    }
  }]
}

Se despliega con az deployment sub create --location <región> --template-file budget.json --parameters email=<correo>. Dos advertencias: validar no es lo mismo que desplegar y comprobar que las alertas llegan, y esta plantilla es un punto de partida, no un módulo endurecido. Declarar el presupuesto como código tiene la ventaja de que el límite queda versionado y se puede reponer si alguien lo borra.

6. Trade-offs que hay que decidir explícitamente

DecisiónBeneficioCoste o riesgoCriterio
Límite bajo y fijoFuerza a revisar el gasto cada mesFalsas alarmas si hay picos legítimosFijarlo con un margen sobre el consumo real, no sobre el deseado
Alerta prevista además de la realAviso antes de llegar al techoPuede avisar de un mes que acaba bienMantenerla: prefiero un aviso de más
Borrar rápidoAhorro inmediatoPerder algo que se usabaInventario y propietario identificados antes de borrar
Confiar en AdvisorSeñales baratasRecomendaciones sobre recursos ya borradosEl inventario manda; Advisor se contrasta

7. Qué hacer el lunes

  1. Fija un límite mensual por suscripción y escríbelo. Sin cifra no hay alerta que valga.
  2. Haz un inventario y una revisión de buenas prácticas antes de borrar, y guarda el resultado como línea base.
  3. Busca lo evidente primero: planes sin aplicaciones, máquinas virtuales sin propietario, discos sin asociar.
  4. Declara el presupuesto como código a nivel de suscripción, con un umbral real y otro previsto, y comprueba que el correo llega.
  5. Contrasta Advisor con el inventario antes de actuar sobre cualquier recomendación.

Las opiniones expresadas en este artículo son personales.

Fuentes

Páginas y comandos consultados el 3 de noviembre de 2026 (CLI de Azure 2.91.0). Los comportamientos de la CLI y de las API cambian con frecuencia: conviene revalidarlos antes de usarlos.

¿Sabes cuánto vas a gastar este mes antes de que acabe?

Puedo ayudarte a definir el límite de gasto, el inventario base y los presupuestos con alertas de tu tenant de Azure.

Contactar

Lectura relacionada

El orden de decisiones que redujo la factura cloud: primero etiquetar y medir. Cómo redujimos un 35% la factura cloud →

El mismo principio aplicado a la IA: el dato de consumo llega tarde. La latencia del dato de consumo →

← Volver a artículos Artículo relacionado: FinOps →