Pide tu presupuesto ya!
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.
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.
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.
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.
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í.
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).
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.
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
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”.
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.
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.
Leave a comment