Public/Get-AzRetirementRecommendation.ps1
|
function Get-AzRetirementRecommendation { <# .SYNOPSIS Gets Azure service retirement recommendations for HighAvailability category and ServiceUpgradeAndRetirement subcategory #> [CmdletBinding()] param( [Parameter(ValueFromPipeline)] [string[]]$SubscriptionId ) begin { if (-not $script:AccessToken) { throw "Not authenticated. Run Connect-AzRetirementMonitor first." } if (-not (Test-AzRetirementMonitorToken)) { throw "Access token has expired. Run Connect-AzRetirementMonitor again." } $headers = @{ Authorization = "Bearer $script:AccessToken" "Content-Type" = "application/json" } $allRecommendations = [System.Collections.Generic.List[object]]::new() } process { if (-not $SubscriptionId) { $subsUri = "https://management.azure.com/subscriptions?api-version=2020-01-01" $subs = Invoke-AzPagedRequest -Uri $subsUri -Headers $headers $SubscriptionId = $subs.subscriptionId } foreach ($subId in $SubscriptionId) { Write-Verbose "Querying subscription: $subId" $uri = "https://management.azure.com/subscriptions/$subId/providers/Microsoft.Advisor/recommendations?api-version=$script:ApiVersion" # Filter for HighAvailability category and ServiceUpgradeAndRetirement subcategory only $filter = "Category eq 'HighAvailability' and SubCategory eq 'ServiceUpgradeAndRetirement'" $uri += "&`$filter=$filter" try { $recommendations = Invoke-AzPagedRequest ` -Uri $uri ` -Headers $headers foreach ($rec in $recommendations) { $isRetirement = $rec.properties.shortDescription.problem -match 'retire|deprecat|end of life|eol|sunset' # Extract ResourceType from ResourceId $resourceId = $rec.properties.resourceMetadata.resourceId $resourceType = if ($resourceId) { # Extract provider/type from resourceId # Example: /subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.Compute/virtualMachines/{name} if ($resourceId -match '/providers/([^/]+/[^/]+)(?:/|$)') { $matches[1] } else { "N/A" } } else { "N/A" } # Extract Resource Group from ResourceId $resourceGroup = if ($resourceId) { # Extract resource group name from resourceId # Example: /subscriptions/{sub}/resourceGroups/{rg}/providers/... if ($resourceId -match '/resourceGroups/([^/]+)') { $matches[1] } else { "N/A" } } else { "N/A" } # Build Azure Resource portal link $resourceLink = if ($resourceId) { "https://portal.azure.com/#resource$resourceId" } else { $null } $allRecommendations.Add([PSCustomObject]@{ SubscriptionId = $subId ResourceId = $resourceId ResourceName = ($resourceId -split "/")[-1] ResourceType = $resourceType ResourceGroup = $resourceGroup Category = $rec.properties.category Impact = $rec.properties.impact Problem = $rec.properties.shortDescription.problem Solution = $rec.properties.shortDescription.solution Description = $rec.properties.extendedProperties.displayName LastUpdated = $rec.properties.lastUpdated IsRetirement = $isRetirement RecommendationId = $rec.name LearnMoreLink = $rec.properties.learnMoreLink ResourceLink = $resourceLink }) } } catch { Write-Warning "Failed to query subscription $($subId) $_" } } } end { return $allRecommendations.ToArray() } } |