Pide tu presupuesto ya!

¿Se está retirando su servicio Azure? Construya un monitor PowerShell

Implementó un servicio en Azure hace tres meses. Funciona. Flujos de tráfico. Nadie se queja. Luego recibirá un correo electrónico: “Su servicio Azure se retirará en 90 días. Migre inmediatamente”. Y no tiene idea de qué servicio están hablando porque su entorno tiene 400 recursos repartidos en seis suscripciones.

¿Te suena familiar? Azure opera en un modelo de ciclo de vida continuo en el que los servicios se actualizan o quedan obsoletos sin avisar a todo el equipo. El Libro de trabajo de jubilación de servicio proporciona una vista centralizada, pero revisar el panel del portal cada semana no es automatización, es simplemente una forma más rápida de incumplir los plazos.

A continuación se explica cómo crear un monitor PowerShell que consulte Gráfico de recursos de Azure (ARG)identifica los servicios que se retiran y alerta a su equipo antes de que esos 90 días se conviertan en 9.

Requisitos previos

Necesitarás:

  • Módulo de Azure PowerShell (Az.ResourceGraph)

  • Acceso de lector a las suscripciones que desea monitorear

  • Un principal de servicio o identidad administrada (La forma en que Azure proporciona a las cuentas de automatización sus propias credenciales) si se ejecuta en Azure Automation

Verifique su entorno:

Get-Module -ListAvailable Az.ResourceGraph

Si no está instalado:

Install-Module -Name Az.ResourceGraph -Scope CurrentUser

Autenticarse en Azure:

Connect-AzAccount

Consejo profesional: si planea ejecutar esto como un runbook automatizado, use una identidad administrada asignada por el sistema en lugar de autenticación interactiva. Otorgue a la identidad acceso de lector en el nivel del grupo de administración para realizar consultas en todas las suscripciones.


Comprender el modelo de datos de jubilación de Azure

Azure no tiene una única “API de jubilación”. Los datos de jubilación se encuentran dispersos en dos sistemas distintos y es necesario consultar ambos para obtener una imagen completa.

Fuente de datos Lo que te dice Tabla en ARG
Estado del servicio de Azure Anuncios de retiro de alto nivel (por ejemplo, “La versión X de API está obsoleta”) ServiceHealthResources
Asesor de Azure Recursos específicos impactados por las jubilaciones AdvisorResources

Estado del servicio rastrea el evento en sí: el anuncio de que algo se está retirando. Asesor de Azure escanea sus recursos implementados y marca cuáles están realmente afectados.

Ambos son consultables a través de Gráfico de recursos de Azureel motor de consultas entre suscripciones de Microsoft que utiliza Lenguaje de consulta Kusto (KQL). Piense en ARG como SQL para todo su entorno de Azure: suscripciones, grupos de recursos, datos de cumplimiento y eventos de estado del servicio.

Consulta de Salud del Servicio para Anuncios de Retiro

Comience por buscar todos los eventos de jubilación activos en su inquilino. El ServiceHealthResources La tabla contiene avisos de salud y las jubilaciones son un subtipo de evento específico.

$query = @"
ServiceHealthResources
| where type =~ 'Microsoft.ResourceHealth/events'
| extend eventType = properties.EventType
| extend eventSubType = properties.EventSubType
| where eventType == 'HealthAdvisory' and eventSubType == 'Retirement'
| project TrackingId=properties.TrackingId,
          Title=properties.Title,
          ImpactStartTime=properties.ImpactStartTime
"@

$retirementEvents = Search-AzGraph -Query $query
$retirementEvents | Format-Table

Esto devuelve todos los anuncios de jubilación que Azure ha emitido y que aún se encuentran dentro del período de retención de 60 días. Sí, 60 días, no 90. Las notificaciones de jubilación en Service Health se conservan durante 60 díaspor lo que si desea realizar un seguimiento histórico, deberá exportar estos datos a Análisis de registros o una cuenta de almacenamiento.

La salida incluye:

  • ID de seguimiento: Identificador único para el evento

  • Título: Descripción legible por humanos de la jubilación.

  • Impacto Hora de inicio: Cuando se anunció el retiro

esto te dice qué se jubila. no te lo dice cual de tus recursos se ven impactados.

Asesor de consultas para recursos afectados

Para saber qué máquinas virtuales, cuentas de almacenamiento o servicios de aplicaciones específicos necesitan migración, consulte la AdvisorResources mesa. Advisor escanea su entorno y genera recomendaciones de recursos que coinciden con las firmas de retiro.

$impactQuery = @"
advisorresources
| where type == 'microsoft.advisor/recommendations'
| where properties.category == 'Reliability'
| where properties.extendedProperties.recommendationSubCategory == 'ServiceUpgradeAndRetirement'
| extend retirementFeatureName = properties.extendedProperties.retirementFeatureName
| extend retirementDate = properties.extendedProperties.retirementDate
| extend resourceId = properties.resourceMetadata.resourceId
| project retirementFeatureName, retirementDate, resourceId
"@

$impactedResources = Search-AzGraph -Query $impactQuery
$impactedResources | Format-Table

Esto devuelve todos los ID de recursos marcados para su retiro, junto con el nombre de la función y la fecha límite. La consulta utiliza extendedProperties campos que contienen metadatos específicos de jubilación: es posible que estas propiedades no se completen de manera consistente en todos los escenarios de jubilación, pero brindan la información más detallada cuando está disponible.


Verificación de la realidad: los datos de Advisor no son exhaustivos. Cubre aproximadamente 40 servicios y características, principalmente retiros de infraestructura como series VM o versiones API. Si está utilizando un servicio de vista previa especializado, es posible que no reciba una advertencia previa aquí.


Manejo de la paginación para inquilinos grandes

Si su entorno tiene cientos de recursos marcados, Search-AzGraph truncará los resultados en 1.000 registros. Necesitas implementar la paginación usando el -SkipToken parámetro.

A continuación se explica cómo recuperar todos los resultados:

$allResults = @()
$skipToken = $null

do {
    if ($skipToken) {
        $response = Search-AzGraph -Query $impactQuery -First 1000 -SkipToken $skipToken
    } else {
        $response = Search-AzGraph -Query $impactQuery -First 1000
    }

    $allResults += $response
    $skipToken = $response.SkipToken
} while ($skipToken)

$allResults | Format-Table

Este bucle continúa consultando hasta que ARG deja de devolver un token de omisión, lo que significa que ha recuperado el conjunto de datos completo. Omita este paso si está seguro de que su inquilino tiene menos de 1000 recursos afectados. (Probablemente no sepas ese número que se te viene a la cabeza, que es exactamente la razón por la que estás construyendo este monitor).

Enriquecimiento de resultados con el repositorio Azure EOL

Microsoft mantiene un repositorio EOL de código abierto en GitHub que contiene una lista JSON de todos los retiros de Azure. Este archivo incluye enlaces de migración y descripciones legibles por humanos que no siempre están presentes en los resultados de la consulta ARG. El repositorio sirve como una fuente única de verdad para la documentación de retiro, algo que se vuelve crítico cuando se intenta explicar a la gerencia por qué esa máquina virtual de producción debe moverse para el próximo trimestre.

Descarga la lista:

$eolUrl = "https://raw.githubusercontent.com/Azure/EOL/main/service_list.json"
$eolData = Invoke-RestMethod -Uri $eolUrl

Ahora puede comparar los resultados de ARG con los datos de EOL para agregar orientación sobre la migración:

$enrichedResults = $allResults | ForEach-Object {
    $feature = $_.retirementFeatureName
    $eolEntry = $eolData | Where-Object { $_.RetiringFeature -eq $feature }

    [PSCustomObject]@{
        ResourceId = $_.resourceId
        RetirementFeature = $feature
        RetirementDate = $_.retirementDate
        MigrationLink = $eolEntry.Link
    }
}

$enrichedResults | Format-Table

Esto le brinda datos procesables: qué recursos se ven afectados, cuándo se retiran y dónde encontrar la guía de migración. El vínculo migratorio es lo que transforma esto de “tenemos un problema” a “aquí se explica cómo solucionarlo”: la diferencia entre pánico y un plan de proyecto.

Construyendo el script del monitor

Combine todo en un script de monitor único que se ejecute según una programación. Guarda esto como Monitor-AzureRetirements.ps1—Y sí, el nombre del archivo importa cuando tu yo futuro intente encontrarlo dentro de seis meses.

El script realiza tres operaciones principales:

Operación Objetivo Producción
Estado del servicio de consulta Recuperar avisos de jubilación activos Metadatos de eventos de jubilación (ID de seguimiento, nombres de servicios)
Asesor de consultas Identificar los recursos impactados ID de recursos marcados para retiro
Exportar resultados Persistir datos para seguimiento Archivo CSV con detalles de recursos
#Requires -Modules Az.ResourceGraph

Connect-AzAccount

# Query for retirement advisories
$healthQuery = @"
ServiceHealthResources
| where type =~ 'Microsoft.ResourceHealth/events'
| extend eventType = properties.EventType
| extend eventSubType = properties.EventSubType
| where eventType == 'HealthAdvisory' and eventSubType == 'Retirement'
| project TrackingId=properties.TrackingId, Title=properties.Title
"@

$retirementEvents = Search-AzGraph -Query $healthQuery

# Query for impacted resources with pagination
$impactQuery = @"
advisorresources
| where type == 'microsoft.advisor/recommendations'
| where properties.category == 'Reliability'
| where properties.extendedProperties.recommendationSubCategory == 'ServiceUpgradeAndRetirement'
| extend retirementFeatureName = properties.extendedProperties.retirementFeatureName
| extend retirementDate = properties.extendedProperties.retirementDate
| extend resourceId = properties.resourceMetadata.resourceId
| project retirementFeatureName, retirementDate, resourceId
"@

$allResources = @()
$skipToken = $null

do {
    if ($skipToken) {
        $response = Search-AzGraph -Query $impactQuery -First 1000 -SkipToken $skipToken
    } else {
        $response = Search-AzGraph -Query $impactQuery -First 1000
    }
    $allResources += $response
    $skipToken = $response.SkipToken
} while ($skipToken)

# Output results
Write-Host "Found $($retirementEvents.Count) retirement events"
Write-Host "Found $($allResources.Count) impacted resources"

$allResources | Export-Csv -Path "AzureRetirements.csv" -NoTypeInformation

Ejecútelo:

.\Monitor-AzureRetirements.ps1

Verifique el archivo de salida:

Import-Csv AzureRetirements.csv | Format-Table

Automatización con Azure Automation

Ejecutar esto manualmente anula el propósito. Implementarlo como un runbook de Azure Automation que se ejecuta diariamente. Si todavía estás iniciando sesión en el portal para ejecutar scripts en 2026, no estás automatizando, simplemente estás haciendo clic con más pasos.

Cree un libro de ejecución:

$automationAccount = "MyAutomationAccount"
$resourceGroup = "MyResourceGroup"

New-AzAutomationRunbook -Name "Monitor-Retirements" `
    -Type PowerShell `
    -AutomationAccountName $automationAccount `
    -ResourceGroupName $resourceGroup

Sube el guión:

Import-AzAutomationRunbook -Path ".\Monitor-AzureRetirements.ps1" `
    -Name "Monitor-Retirements" `
    -Type PowerShell `
    -AutomationAccountName $automationAccount `
    -ResourceGroupName $resourceGroup `
    -Force

Publicarlo:

Publish-AzAutomationRunbook -Name "Monitor-Retirements" `
    -AutomationAccountName $automationAccount `
    -ResourceGroupName $resourceGroup

Prográmelo para que se ejecute diariamente:

$schedule = New-AzAutomationSchedule -Name "DailyRetirementCheck" `
    -AutomationAccountName $automationAccount `
    -ResourceGroupName $resourceGroup `
    -StartTime (Get-Date).AddHours(1) `
    -DayInterval 1

Register-AzAutomationScheduledRunbook -RunbookName "Monitor-Retirements" `
    -ScheduleName "DailyRetirementCheck" `
    -AutomationAccountName $automationAccount `
    -ResourceGroupName $resourceGroup

El runbook utilizará la identidad administrada asignada por el sistema de la cuenta de automatización para autenticarse. Otorgue a la identidad acceso de lector a su grupo de administración o suscripciones y documente qué identidad tiene qué permisos, porque la próxima persona que herede esta automatización se lo agradecerá.

Acercarse Ejecución Notificación Escalabilidad
Guión manual Se requiere inicio de sesión interactivo Ninguno No escala más allá de un solo operador
Libro de ejecución programado Se ejecuta automáticamente todos los días Requiere integración (Teams, correo electrónico) Escala en todo el inquilino

Advertencia: si su runbook falla con un error de autenticación, verifique que la identidad administrada tenga permisos de lector. El mensaje de error no le dirá eso; solo dirá “no autorizado”.


Alertas a través de Microsoft Teams

Generar un archivo CSV en una cuenta de automatización no notifica a nadie. Canalice los resultados a un Equipos de Microsoft webhook para que su equipo de ingeniería realmente vea las alertas. Una notificación de jubilación guardada en una cuenta de almacenamiento es simplemente un tipo diferente de silencio: más fuerte que nada, pero no lo suficientemente fuerte.

Cree un webhook entrante en su canal de Teams y luego agréguelo al runbook:

$teamsWebhook = "https://outlook.office.com/webhook/YOUR-WEBHOOK-URL"

if ($allResources.Count -gt 0) {
    $message = @{
        text = "Azure Retirement Alert: $($allResources.Count) resources require migration"
    } | ConvertTo-Json

    Invoke-RestMethod -Method Post -Uri $teamsWebhook -Body $message -ContentType "application/json"
}

Ahora, cada vez que el script encuentra recursos afectados, publica una notificación en Teams. Su equipo ve la alerta antes de que desaparezca el servicio. El valor real no es el webhook, sino la ventaja inicial de 90 días que te ofrece.

De los correos electrónicos reactivos a la gobernanza proactiva

Creó un monitor de PowerShell que consulta Azure Resource Graph para obtener avisos de retiro, identifica recursos afectados específicos, maneja la paginación de grandes conjuntos de datos y envía alertas a Microsoft Teams, lo que convierte un proceso reactivo basado en correo electrónico en una gobernanza proactiva.

Esto es lo que ofrece la solución completa:

Componente Fuente de datos Producción Valor empresarial
Escáner de jubilación Eventos de estado del servicio a través de ARG Anuncios de jubilación activa Sepa qué se retira en Azure
Identificador de recursos Recomendaciones del asesor vía ARG ID de recursos específicos marcados para migración Sepa cuáles de sus recursos se ven afectados
Enriquecimiento de la migración Repositorio GitHub de Azure EOL Enlaces a guías oficiales de migración Sepa cómo solucionar el problema.
Capa de automatización Runbook programado de Azure Automation Funciona diariamente sin intervención manual. Monitoreo continuo a escala
Distribución de alertas Webhook de equipos de Microsoft Notificaciones en tiempo real al equipo de ingeniería. Ley sobre jubilaciones antes de plazos

El modelo de ciclo de vida continuo de Azure significa que las jubilaciones son inevitables. La diferencia entre una migración forzada a las 2 a.m. y un período de mantenimiento planificado durante el fin de semana es si lo sabía con 90 días de anticipación o con 9. Este monitor garantiza que siempre lo sabrá primero.

Written by

Leave a comment