运维成本优化实战:云资源与硬件资源精细化管理

一、引言

在数字化转型的浪潮中,企业 IT 基础设施规模持续扩大,运维成本成为 CFO 和 CTO 共同关注的焦点。根据 Gartner 调研,企业 IT 预算中约有 30% 被浪费在闲置或未充分利用的资源上。本文从实战角度,系统介绍云资源和硬件资源的成本优化方法论、工具和最佳实践。

1.1 成本优化的重要性

1
2
3
4
5
6
7
8
9
┌─────────────────────────────────────────────────────────┐
│ IT 成本构成分析 │
├─────────────────────────────────────────────────────────┤
│ 云资源费用 ████████████████████░░░░░░░░ 45% │
│ 硬件折旧 ██████████████░░░░░░░░░░░░░░ 25% │
│ 软件许可 ████████░░░░░░░░░░░░░░░░░░░░ 15% │
│ 人力成本 ██████░░░░░░░░░░░░░░░░░░░░░░ 10% │
│ 其他 ███░░░░░░░░░░░░░░░░░░░░░░░░░ 5% │
└─────────────────────────────────────────────────────────┘

1.2 成本优化目标

目标 描述 预期收益
消除浪费 识别并释放闲置资源 15-25% 成本降低
合理选型 选择最适合的资源规格 20-30% 成本降低
弹性伸缩 根据负载动态调整资源 30-40% 成本降低
长期规划 预留实例和长期合约 40-60% 成本降低
架构优化 改进系统设计降低成本 长期持续收益

二、成本优化方法论

2.1 成本优化四步法

1
2
3
4
5
6
7
8
┌─────────────┐    ┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│ 发现 │ → │ 分析 │ → │ 执行 │ → │ 监控 │
│ Discover │ │ Analyze │ │ Execute │ │ Monitor │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
↓ ↓ ↓ ↓
资源清单 浪费识别 优化实施 持续跟踪
成本分摊 根因分析 变更管理 效果验证
基线建立 优先级排序 自动化执行 报告生成

2.2 成本责任模型

建立清晰的成本责任体系是优化的前提:

1
2
3
4
5
6
7
8
9
10
11
┌────────────────────────────────────────────────────────────┐
│ 成本责任矩阵 │
├──────────────┬──────────────┬──────────────┬───────────────┤
│ 资源类型 │ 所有者 │ 审批者 │ 优化负责人 │
├──────────────┼──────────────┼──────────────┼───────────────┤
│ 计算资源 │ 开发团队 │ 技术总监 │ SRE 团队 │
│ 存储资源 │ 数据团队 │ 数据总监 │ 存储工程师 │
│ 网络资源 │ 网络团队 │ 网络总监 │ 网络工程师 │
│ 数据库 │ DBA 团队 │ 技术总监 │ DBA │
│ 中间件 │ 架构团队 │ 首席架构师 │ 中间件工程师 │
└──────────────┴──────────────┴──────────────┴───────────────┘

三、云资源成本优化

3.1 计算资源优化

3.1.1 实例规格右 sizing

问题:过度配置是最常见的浪费来源

优化策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 收集实例性能数据(AWS CloudWatch)
aws cloudwatch get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUUtilization \
--dimensions Name=InstanceId,Value=i-1234567890abcdef0 \
--start-time 2026-02-21T00:00:00Z \
--end-time 2026-03-21T00:00:00Z \
--period 3600 \
--statistics Average Maximum

# 2. 分析结果
# - 平均 CPU < 20%:考虑降配
# - 平均 CPU 20-40%:保持或微调
# - 平均 CPU > 70%:考虑升配或优化应用

规格对照表(以 AWS 为例):

当前规格 vCPU 内存 月成本 建议规格 节省
m5.2xlarge 8 32GB $280 m5.xlarge 50%
m5.4xlarge 16 64GB $560 m5.2xlarge 50%
r5.2xlarge 8 64GB $364 r5.xlarge 50%
c5.2xlarge 8 16GB $248 c5.xlarge 50%

3.1.2 预留实例(RI)和 Savings Plans

购买策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌─────────────────────────────────────────────────────────┐
│ 预留实例购买决策树 │
├─────────────────────────────────────────────────────────┤
│ │
│ 负载是否稳定? │
│ │ │
│ 是 ├──────────────→ 3 年期全预付 RI(最大折扣 72%) │
│ │ │
│ 否 ├──────────────→ 负载是否可预测? │
│ │ │ │
│ 是 ├───────────→ 1 年期部分预付 RI(折扣 50%) │
│ │ │ │
│ 否 ├───────────→ Savings Plans(灵活折扣 40%) │
│ │ │
│ 按需实例 + Spot(波动负载) │
│ │
└─────────────────────────────────────────────────────────┘

成本对比(以 m5.xlarge 为例,us-east-1):

计费方式 小时价格 月成本 年成本 折扣
按需实例 $0.192 $140 $1,689 0%
1 年 RI(无预付) $0.120 $88 $1,051 38%
1 年 RI(部分预付) $0.099 $72 $867 49%
1 年 RI(全预付) $0.088 $64 $771 54%
3 年 RI(全预付) $0.058 $42 $508 70%
Savings Plans $0.115 $84 $1,007 40%

3.1.3 Spot 实例应用

适用场景

  • 批处理任务
  • 数据分析
  • CI/CD 构建
  • 无状态服务
  • 容错应用

Spot 实例配置示例

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
# Kubernetes Spot 实例配置
apiVersion: v1
kind: Pod
metadata:
name: batch-processor
annotations:
spot-instance: "true"
spec:
nodeSelector:
lifecycle: spot
tolerations:
- key: "spot"
operator: "Equal"
value: "true"
effect: "NoSchedule"
containers:
- name: processor
image: batch-processor:latest
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: spot-price
operator: Lt
values:
- "0.05" # 只使用价格低于$0.05 的 Spot 实例

Spot 实例中断处理

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
# Spot 实例中断通知处理脚本
import boto3
import requests
import time

def handle_spot_interruption():
"""处理 Spot 实例中断通知"""

# 获取实例元数据
metadata_url = "http://169.254.169.254/latest/meta-data/spot/termination-time"

try:
response = requests.get(metadata_url, timeout=5)
if response.status_code == 200:
termination_time = response.text
print(f"Spot 实例将在 {termination_time} 被终止")

# 执行优雅关闭
graceful_shutdown()

# 保存检查点
save_checkpoint()

# 通知监控系统
send_alert("Spot 实例即将终止")

except requests.exceptions.RequestException:
print("非 Spot 实例或无中断通知")

def graceful_shutdown():
"""优雅关闭应用"""
# 停止接收新请求
drain_connections()

# 完成正在处理的任务
complete_pending_tasks()

# 保存状态
persist_state()

# 每 30 秒检查一次中断通知
while True:
handle_spot_interruption()
time.sleep(30)

3.2 存储资源优化

3.2.1 存储分层策略

1
2
3
4
5
6
7
8
9
10
11
┌─────────────────────────────────────────────────────────────┐
│ AWS 存储分层决策 │
├──────────────┬──────────────┬──────────────┬───────────────┤
│ 存储类型 │ 每 GB 月成本│ 适用场景 │ 访问频率 │
├──────────────┼──────────────┼──────────────┼───────────────┤
│ S3 Standard│ $0.023 │ 热数据 │ 每天多次 │
│ S3 IA │ $0.0125 │ 温数据 │ 每月几次 │
│ S3 Glacier │ $0.004 │ 冷数据 │ 每季度几次 │
│ S3 Deep │ $0.00099 │ 归档数据 │ 每年几次 │
│ Archive │ │ │ │
└──────────────┴──────────────┴──────────────┴───────────────┘

生命周期策略配置

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
{
"Rules": [
{
"ID": "LogArchival",
"Status": "Enabled",
"Prefix": "logs/",
"Transitions": [
{
"Days": 30,
"StorageClass": "STANDARD_IA"
},
{
"Days": 90,
"StorageClass": "GLACIER"
},
{
"Days": 365,
"StorageClass": "DEEP_ARCHIVE"
}
],
"Expiration": {
"Days": 1825
}
}
]
}

3.2.2 EBS 优化

常见问题

  • 未挂载的 EBS 卷(孤儿卷)
  • 过大容量的卷
  • 未使用的快照

清理脚本

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
#!/bin/bash
# ebs-cleanup.sh - EBS 资源清理脚本

AWS_REGION="us-east-1"

echo "=== EBS 成本优化检查 ==="

# 1. 查找未挂载的 EBS 卷
echo -e "\n[1] 未挂载的 EBS 卷:"
aws ec2 describe-volumes \
--region $AWS_REGION \
--filters Name=status,Values=available \
--query 'Volumes[*].[VolumeId,Size,CreateTime]' \
--output table

# 2. 查找低利用率的 EBS 卷
echo -e "\n[2] 低利用率 EBS 卷(需结合 CloudWatch):"
aws cloudwatch get-metric-statistics \
--namespace AWS/EBS \
--metric-name VolumeIdleTime \
--dimensions Name=VolumeId,Value=vol-1234567890abcdef0 \
--start-time $(date -d "7 days ago" -Iseconds) \
--end-time $(date -Iseconds) \
--period 86400 \
--statistics Average \
--query 'Datapoints[*].[Timestamp,Average]' \
--output table

# 3. 查找旧快照
echo -e "\n[3] 超过 90 天的快照:"
aws ec2 describe-snapshots \
--region $AWS_REGION \
--owner-ids self \
--query "Snapshots[?StartTime<$(date -d "90 days ago" -Iseconds)].[SnapshotId,VolumeId,StartTime]" \
--output table

# 4. 自动清理(谨慎使用)
# aws ec2 delete-volume --volume-id vol-xxx
# aws ec2 delete-snapshot --snapshot-id snap-xxx

3.3 网络资源优化

3.3.1 数据传输成本

AWS 数据传输定价

传输类型 价格(每 GB)
AZ 内传输 $0.00
同区域跨 AZ $0.01
跨区域传输 $0.02
出站到互联网 $0.09
入站互联网 $0.00

优化策略

1
2
3
4
5
1. 使用 VPC Endpoint 访问 AWS 服务(避免 NAT Gateway 费用)
2. 同区域服务尽量在同一 AZ
3. 使用 CloudFront 缓存静态内容
4. 跨区域传输使用 Direct Connect 或专线
5. 启用 S3 Transfer Acceleration 优化大文件传输

3.3.2 NAT Gateway 优化

NAT Gateway 是常见的成本黑洞:

1
2
3
4
5
6
7
8
9
10
11
12
13
┌─────────────────────────────────────────────────────────┐
│ NAT Gateway 成本分析 │
├─────────────────────────────────────────────────────────┤
│ 费用构成: │
│ - 每小时费用:$0.045 × 24 × 30 = $32.40/月 │
│ - 数据处理:$0.045/GB │
│ │
│ 优化方案: │
│ 1. 使用 NAT Instance(小规模场景) │
│ 2. 使用 VPC Endpoint(访问 AWS 服务) │
│ 3. 合并 NAT Gateway(多个子网共享) │
│ 4. 启用 VPC Flow Logs 分析流量模式 │
└─────────────────────────────────────────────────────────┘

四、硬件资源成本优化

4.1 服务器生命周期管理

4.1.1 服务器折旧模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌─────────────────────────────────────────────────────────┐
│ 服务器折旧曲线(5 年周期) │
├─────────────────────────────────────────────────────────┤
│ │
│ 价值 │████████ │
│ 100% │████████ │
│ 80% │██████ │
│ 60% │████ │
│ 40% │███ │
│ 20% │██ │
│ 0% │█ │
│ └────────────────────────────────────── │
│ Y1 Y2 Y3 Y4 Y5 年份 │
│ │
│ 建议:3-4 年后评估是否替换(维护成本 > 新购成本) │
└─────────────────────────────────────────────────────────┘

4.1.2 服务器利用率提升

问题:传统数据中心服务器平均利用率仅 15-20%

优化方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 1. 虚拟化整合
虚拟化前:
- 物理服务器:50
- 平均利用率:15%
- 总功耗:50 × 500W = 25kW

虚拟化后:
- 物理服务器:10
- 平均利用率:75%
- 总功耗:10 × 500W = 5kW
- 节省:80% 硬件 + 80% 电力

# 2. 容器化进一步整合
容器化后:
- 物理服务器:5
- 平均利用率:85%
- 部署密度提升 3-5

资源调度优化脚本

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
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env python3
"""
服务器资源利用率分析与优化建议
"""

import psutil
import json
from datetime import datetime

class ServerOptimizer:
def __init__(self):
self.metrics = {}

def collect_metrics(self):
"""收集服务器性能指标"""
self.metrics = {
'timestamp': datetime.now().isoformat(),
'cpu_percent': psutil.cpu_percent(interval=1),
'cpu_count': psutil.cpu_count(),
'memory_percent': psutil.virtual_memory().percent,
'memory_total_gb': psutil.virtual_memory().total / (1024**3),
'disk_usage_percent': psutil.disk_usage('/').percent,
'network_io': psutil.net_io_counters()._asdict(),
}
return self.metrics

def analyze(self):
"""分析并给出优化建议"""
recommendations = []

cpu = self.metrics['cpu_percent']
mem = self.metrics['memory_percent']

if cpu < 20 and mem < 30:
recommendations.append({
'level': 'HIGH',
'type': 'OVER_PROVISIONED',
'message': '服务器资源严重过剩,建议降配或合并负载',
'potential_savings': '50-70%'
})
elif cpu < 40 and mem < 50:
recommendations.append({
'level': 'MEDIUM',
'type': 'UNDER_UTILIZED',
'message': '服务器利用率偏低,可考虑整合',
'potential_savings': '20-40%'
})
elif cpu > 80 or mem > 85:
recommendations.append({
'level': 'WARNING',
'type': 'OVER_LOADED',
'message': '服务器负载过高,建议扩容或优化应用',
'risk': '性能下降或服务中断'
})

return recommendations

def generate_report(self):
"""生成优化报告"""
self.collect_metrics()
recommendations = self.analyze()

report = {
'server': psutil.users()[0].name if psutil.users() else 'unknown',
'metrics': self.metrics,
'recommendations': recommendations,
'generated_at': datetime.now().isoformat()
}

print(json.dumps(report, indent=2, ensure_ascii=False))
return report

if __name__ == '__main__':
optimizer = ServerOptimizer()
optimizer.generate_report()

4.2 电力成本优化

4.2.1 功耗计算模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌─────────────────────────────────────────────────────────┐
│ 数据中心电力成本计算 │
├─────────────────────────────────────────────────────────┤
│ │
│ 单机柜功耗 = 服务器数量 × 单机功耗 + 网络设备 + 存储 │
│ │
│ 年电力成本 = 功耗 (kW) × 24 × 365 × 电价 │
│ │
│ 示例计算: │
│ - 10 台服务器 × 500W = 5kW │
│ - 网络设备 1kW │
│ - 总功耗 6kW │
│ - PUE 1.5(含制冷)→ 实际 9kW │
│ - 电价 1 元/kWh │
│ - 年成本 = 9 × 24 × 365 × 1 = 78,840 元 │
│ │
│ 优化空间: │
│ - 低功耗硬件:减少 20-30% │
│ - 智能调度:减少 15-25% │
│ - 高效制冷:降低 PUE 至 1.2,减少 20% │
└─────────────────────────────────────────────────────────┘

4.2.2 智能功耗管理

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
#!/bin/bash
# power-optimization.sh - 服务器功耗优化脚本

# 1. CPU 频率调节
# 设置为节能模式
sudo cpufreq-set -g powersave

# 查看当前频率
cpufreq-info

# 2. 磁盘休眠
# 设置 30 分钟无访问后休眠
sudo hdparm -S 240 /dev/sda

# 3. 网卡节能
# 启用 Energy Efficient Ethernet
sudo ethtool -s eth0 wol d
sudo ethtool -K eth0 rx on tx on

# 4. 未使用设备禁用
# 禁用未使用的 USB 端口
echo 1 | sudo tee /sys/bus/usb/devices/usb*/power/controlled

# 5. 生成功耗报告
sudo powertop --html=/tmp/power_report.html

4.3 存储硬件优化

4.3.1 存储分层架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌─────────────────────────────────────────────────────────┐
│ 企业存储分层架构 │
├─────────────────────────────────────────────────────────┤
│ │
│ Tier 0: NVMe SSD(性能关键) │
│ - 数据库、实时分析 │
│ - 成本:$0.50-1.00/GB │
│ │
│ Tier 1: SATA SSD(高性能) │
│ - 应用服务器、虚拟化 │
│ - 成本:$0.20-0.40/GB │
│ │
│ Tier 2: HDD(容量型) │
│ - 文件存储、备份 │
│ - 成本:$0.05-0.10/GB │
│ │
│ Tier 3: 磁带/归档(冷存储) │
│ - 合规归档、历史数据 │
│ - 成本:$0.01-0.02/GB │
│ │
└─────────────────────────────────────────────────────────┘

五、成本监控与告警

5.1 成本监控架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌─────────────────────────────────────────────────────────────┐
│ 成本监控体系 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 数据采集 │ → │ 数据处理 │ → │ 数据展示 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ ↓ ↓ ↓ │
│ - 云 API - 数据清洗 - Grafana │
│ - 账单导出 - 成本分摊 - 自定义 Dashboard │
│ - CMDB - 趋势分析 - 成本报告 │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ 告警通知 │ ← │ 阈值检测 │ │
│ └──────────┘ └──────────┘ │
│ ↓ ↓ │
│ - 邮件/短信 - 预算超支 │
│ - Slack/钉钉 - 异常波动 │
│ - 工单系统 - 资源浪费 │
│ │
└─────────────────────────────────────────────────────────────┘

5.2 成本告警配置

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
# Prometheus 成本告警规则
groups:
- name: cost_alerts
rules:
# 日成本超预算
- alert: DailyCostExceedsBudget
expr: sum(aws_billing_daily_cost) > 1000
for: 1h
labels:
severity: warning
annotations:
summary: "日成本超过预算"
description: "当日 AWS 成本 {{ $value }} 美元,超过预算 1000 美元"

# 成本异常增长
- alert: CostSpikeDetected
expr: rate(aws_billing_daily_cost[1h]) > 0.5
for: 30m
labels:
severity: critical
annotations:
summary: "检测到成本异常增长"
description: "小时成本增长率 {{ $value }} 美元/小时"

# 闲置资源检测
- alert: IdleResourcesDetected
expr: aws_ec2_instance_cpu_utilization < 5
for: 24h
labels:
severity: info
annotations:
summary: "发现闲置 EC2 实例"
description: "实例 {{ $labels.InstanceId }} CPU 利用率持续低于 5%"

5.3 成本报告模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 运维成本周报

## 本周概览
- 总成本:$XX,XXX(环比 +X%)
- 预算使用率:XX%
- 优化节省:$X,XXX

## 成本分布
| 类别 | 金额 | 占比 | 环比 |
|------|------|------|------|
| 计算 | $X,XXX | XX% | +X% |
| 存储 | $X,XXX | XX% | -X% |
| 网络 | $X,XXX | XX% | +X% |
| 其他 | $X,XXX | XX% | 0% |

## 异常项
1. [警告] EC2 实例 i-xxx 利用率<5%,建议降配
2. [警告] S3 存储增长 20%,需清理旧数据
3. [信息] 预留实例即将到期,需续订

## 优化建议
1. 合并 3 台低负载实例,预计节省$XXX/月
2. 清理 90 天以上快照,预计释放$XXX
3. 购买 1 年期 RI,预计节省$X,XXX/年

六、自动化成本优化

6.1 自动降配脚本

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#!/usr/bin/env python3
"""
自动降配脚本 - 识别并建议低利用率实例的降配方案
"""

import boto3
from datetime import datetime, timedelta

class CostOptimizer:
def __init__(self, region='us-east-1'):
self.ec2 = boto3.client('ec2', region_name=region)
self.cloudwatch = boto3.client('cloudwatch', region_name=region)

def get_underutilized_instances(self, threshold=20, days=7):
"""获取低利用率实例"""
end_time = datetime.utcnow()
start_time = end_time - timedelta(days=days)

instances = self.ec2.describe_instances(
Filters=[{'Name': 'instance-state-name', 'Values': ['running']}]
)

underutilized = []

for reservation in instances['Reservations']:
for instance in reservation['Instances']:
instance_id = instance['InstanceId']

# 获取 CPU 利用率
metrics = self.cloudwatch.get_metric_statistics(
Namespace='AWS/EC2',
MetricName='CPUUtilization',
Dimensions=[{'Name': 'InstanceId', 'Value': instance_id}],
StartTime=start_time,
EndTime=end_time,
Period=3600,
Statistics=['Average']
)

if metrics['Datapoints']:
avg_cpu = sum(d['Average'] for d in metrics['Datapoints']) / len(metrics['Datapoints'])

if avg_cpu < threshold:
underutilized.append({
'InstanceId': instance_id,
'InstanceType': instance['InstanceType'],
'AvgCPU': avg_cpu,
'CurrentCost': self.get_instance_cost(instance['InstanceType'])
})

return underutilized

def get_instance_cost(self, instance_type):
"""获取实例成本(简化版)"""
costs = {
'm5.large': 0.096,
'm5.xlarge': 0.192,
'm5.2xlarge': 0.384,
'c5.large': 0.085,
'c5.xlarge': 0.17,
'r5.large': 0.126,
'r5.xlarge': 0.252,
}
return costs.get(instance_type, 0.1)

def recommend_downgrade(self, instance_type):
"""推荐降配方案"""
downgrade_map = {
'm5.2xlarge': 'm5.xlarge',
'm5.xlarge': 'm5.large',
'c5.2xlarge': 'c5.xlarge',
'c5.xlarge': 'c5.large',
'r5.2xlarge': 'r5.xlarge',
'r5.xlarge': 'r5.large',
}
return downgrade_map.get(instance_type, instance_type)

def generate_report(self):
"""生成优化报告"""
underutilized = self.get_underutilized_instances()

print("=" * 60)
print("成本优化报告")
print("=" * 60)

total_savings = 0
for inst in underutilized:
recommended = self.recommend_downgrade(inst['InstanceType'])
current_cost = inst['CurrentCost']
new_cost = self.get_instance_cost(recommended)
savings = (current_cost - new_cost) * 24 * 30 # 月节省

print(f"\n实例:{inst['InstanceId']}")
print(f" 当前规格:{inst['InstanceType']}")
print(f" 平均 CPU: {inst['AvgCPU']:.1f}%")
print(f" 建议规格:{recommended}")
print(f" 预计月节省:${savings:.2f}")

total_savings += savings

print(f"\n{'=' * 60}")
print(f"预计总月节省:${total_savings:.2f}")
print(f"{'=' * 60}")

if __name__ == '__main__':
optimizer = CostOptimizer()
optimizer.generate_report()

6.2 自动清理脚本

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
#!/bin/bash
# auto-cleanup.sh - 自动清理闲置资源

set -e

REGION="us-east-1"
RETENTION_DAYS=30

echo "=== 开始自动清理 ==="

# 1. 清理未挂载的 EBS 卷(超过 7 天)
echo "[1] 清理未挂载的 EBS 卷..."
aws ec2 describe-volumes \
--region $REGION \
--filters Name=status,Values=available \
--query 'Volumes[?CreateTime<`'$(date -d "7 days ago" -Iseconds)'`].VolumeId' \
--output text | while read vol_id; do
echo " 删除卷:$vol_id"
aws ec2 delete-volume --volume-id $vol_id --region $REGION
done

# 2. 清理旧快照
echo "[2] 清理旧快照(>${RETENTION_DAYS}天)..."
aws ec2 describe-snapshots \
--region $REGION \
--owner-ids self \
--query "Snapshots[?StartTime<\`$(date -d "${RETENTION_DAYS} days ago" -Iseconds)\`].SnapshotId" \
--output text | while read snap_id; do
echo " 删除快照:$snap_id"
aws ec2 delete-snapshot --snapshot-id $snap_id --region $REGION
done

# 3. 清理未使用的弹性 IP
echo "[3] 清理未使用的弹性 IP..."
aws ec2 describe-addresses \
--region $REGION \
--filters Name=association-id,Values= \
--query 'Addresses[*].AllocationId' \
--output text | while read alloc_id; do
echo " 释放 IP:$alloc_id"
aws ec2 release-address --allocation-id $alloc_id --region $REGION
done

# 4. 清理旧 AMI
echo "[4] 清理旧 AMI..."
aws ec2 describe-images \
--region $REGION \
--owners self \
--query "Images[?CreationDate<\`$(date -d "${RETENTION_DAYS} days ago" -Iseconds)\`].ImageId" \
--output text | while read ami_id; do
echo " 删除 AMI:$ami_id"
aws ec2 deregister-image --image-id $ami_id --region $REGION
done

echo "=== 清理完成 ==="

七、总结与行动清单

7.1 成本优化检查清单

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
□ 计算资源
□ 审查所有实例规格,降配低利用率实例
□ 为稳定负载购买预留实例
□ 为波动负载配置 Spot 实例
□ 设置自动伸缩组

□ 存储资源
□ 清理未挂载的 EBS 卷
□ 删除旧快照和 AMI
□ 配置 S3 生命周期策略
□ 评估存储分层需求

□ 网络资源
□ 使用 VPC Endpoint 减少 NAT 费用
□ 优化跨区域数据传输
□ 清理未使用的弹性 IP

□ 监控告警
□ 配置成本预算告警
□ 设置闲置资源检测
□ 建立周/月成本报告

□ 流程制度
□ 建立资源申请审批流程
□ 定义成本责任矩阵
□ 定期成本审查会议

7.2 预期收益

优化项 实施难度 预期节省 实施周期
实例降配 15-25% 1-2 周
预留实例 30-50% 1 周
Spot 实例 60-90% 2-4 周
存储清理 10-20% 1 周
自动伸缩 20-40% 4-8 周
架构优化 长期 持续

7.3 关键成功因素

  1. 高层支持:成本优化需要跨部门协作
  2. 数据驱动:基于实际使用数据做决策
  3. 自动化:将优化措施固化为自动化流程
  4. 持续改进:成本优化是持续过程,非一次性项目
  5. 平衡取舍:在成本和性能/稳定性间找到平衡点

参考资源

  • AWS Well-Architected Framework - Cost Optimization Pillar
  • Google Cloud Cost Management Guide
  • Azure Cost Management Best Practices
  • FinOps Foundation: https://www.finops.org
  • 《云成本优化实战》- O’Reilly