1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| function Get-CloudCostReport { [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string[]]$SubscriptionIds, [ValidateSet('Daily','Monthly')] [string]$Granularity = 'Monthly' )
$costReport = [PSCustomObject]@{ Timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss' TotalCost = 0 ServiceBreakdown = @{} OptimizationSuggestions = @() }
try { $costData = $SubscriptionIds | ForEach-Object { Invoke-RestMethod -Uri "https://management.azure.com/subscriptions/$_/providers/Microsoft.CostManagement/query?api-version=2023-03-01" \ -Headers @{ Authorization = "Bearer $env:AZURE_TOKEN" } \ -Body (@{ type = "ActualCost" timeframe = "MonthToDate" dataset = @{ aggregation = @{ totalCost = @{ name = "Cost" function = "Sum" } } grouping = @( @{ type = "Dimension" name = "ServiceName" } ) } } | ConvertTo-Json) }
$costReport.TotalCost = ($costData.properties.rows | Measure-Object -Property [0] -Sum).Sum $costReport.ServiceBreakdown = $costData.properties.rows | Group-Object { $_[1] } -AsHashTable | ForEach-Object { @{$_.Key = [math]::Round($_.Value[0],2)} }
$costData.properties.rows | Where-Object { $_[0] -gt 1000 } | ForEach-Object { $costReport.OptimizationSuggestions += [PSCustomObject]@{ Service = $_[1] Cost = $_[0] Recommendation = "考虑预留实例或自动缩放配置" } } } catch { Write-Error "成本数据获取失败: $_" }
$costReport | Export-Excel -Path "$env:TEMP/CloudCostReport_$(Get-Date -Format yyyyMMdd).xlsx" return $costReport }
|