PowerShell 技能连载 - Azure多云成本优化实践

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
function Get-AzureCostAnalysis {
[CmdletBinding()]
param(
[Parameter(Mandatory=$true)]
[string[]]$SubscriptionIds,
[datetime]$StartDate = (Get-Date).AddDays(-30)
)

$report = [PSCustomObject]@{
Timestamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'
ResourceAnalysis = @()
CostRecommendations = @()
}

foreach ($subId in $SubscriptionIds) {
Set-AzContext -SubscriptionId $subId | Out-Null

# 获取资源消耗数据
$resources = Get-AzResource | Where-Object {
$_.ResourceType -notin @('Microsoft.Resources/deployments','Microsoft.Resources/subscriptions')
}

$resourceGroups = $resources | Group-Object ResourceGroupName
foreach ($rg in $resourceGroups) {
$costData = Get-AzConsumptionUsageDetail -StartDate $StartDate -EndDate (Get-Date) -ResourceGroup $rg.Name

$report.ResourceAnalysis += [PSCustomObject]@{
Subscription = $subId
ResourceGroup = $rg.Name
TotalCost = ($costData | Measure-Object PretaxCost -Sum).Sum
UnderutilizedVMs = $rg.Group.Where{ $_.ResourceType -eq 'Microsoft.Compute/virtualMachines' }.Count
}
}
}

# 生成优化建议
$report.ResourceAnalysis | ForEach-Object {
if ($_.UnderutilizedVMs -gt 5) {
$report.CostRecommendations += [PSCustomObject]@{
Recommendation = "调整资源组 $($_.ResourceGroup) 中未充分利用的VM规模"
PotentialSavings = "预计节省 $([math]::Round($_.TotalCost * 0.3)) 美元"
}
}
}

$report | Export-Excel -Path "$env:TEMP/AzureCostReport_$(Get-Date -Format yyyyMMdd).xlsx"
return $report
}

核心功能

  1. 跨订阅资源消耗分析
  2. 闲置VM资源自动识别
  3. 成本节约潜力预测
  4. Excel报告自动生成

典型应用场景

  • 企业多云成本可视化管理
  • FinOps实践中的资源优化
  • 预算执行情况跟踪
  • 云服务商比价数据支持