雲端成本優化(Cost Optimization)
是什麼?
雲端成本優化是一套持續性的實踐,確保用最少的花費獲得需要的雲端服務。不是一次性的削減,而是融入架構設計和日常營運的習慣。
ℹ️雲端帳單常見分布
典型的雲端帳單中:Compute 佔 60-70%(VM、Container、Serverless)、Storage 佔 15-20%、Network 佔 5-10%、其他服務佔剩餘。Compute 是最大的優化目標。
核心觀念
- Right-sizing(規格適配):選擇匹配工作負載的實例規格。CPU 長期低於 20% 表示規格太大,應該縮小。是最直接的省錢方式
- Reserved Instance / Savings Plan:承諾使用 1-3 年可節省 30-70%。適合穩定的基底負載(Baseline)
- Spot / Preemptible Instance:使用雲端的閒置容量,便宜 60-90% 但可能隨時被回收。適合可中斷的任務(批次處理、CI/CD)
- Auto-Scaling:根據負載自動增減實例。離峰時縮到最小,尖峰時擴展。避免 24/7 用尖峰配置
- Storage 分層:頻繁存取用 Hot、偶爾存取用 Cool、歸檔用 Archive。自動生命週期管理可節省 60-80% 儲存費
常見誤區
⚠️常見誤區
- 只看單價不看總費用:便宜的小實例跑了 100 台可能比 10 台大實例貴。要看總 TCO(Total Cost of Ownership)
- Reserved Instance 買太多:RI 是承諾,用不完也要付錢。先分析 3 個月的使用數據,只對穩定的基底負載買 RI
- 不設預算警報:月底才發現帳單爆掉。在 Day 1 就設定預算警報,超過 80% 就通知
流程/步驟
可視化成本
設定 Cost Dashboard,了解錢花在哪裡
辨識浪費
找出閒置資源、過大規格、未使用的 IP 和磁碟
Right-sizing
根據使用率調整 VM/Container 規格
購買 RI/Savings Plan
對穩定的基底負載購買 1-3 年承諾
設定 Auto-Scaling
離峰自動縮減,尖峰自動擴展
持續監控
每月 Review 成本報告,設定預算警報
流程解讀:先看清楚錢花在哪裡(可視化),再找出最大的浪費(閒置資源、過大規格)。Right-sizing 是最快見效的措施。穩定負載買 RI 省長期成本。Auto-Scaling 解決離峰浪費。持續監控確保不會回到浪費狀態。
程式碼範例
C# 版本
// Azure Cost Management SDK — 查詢成本
using Azure.Identity;
using Azure.ResourceManager;
using Azure.ResourceManager.CostManagement;
var credential = new DefaultAzureCredential();
var armClient = new ArmClient(credential);
// 查詢本月成本
var scope = $"/subscriptions/{subscriptionId}";
var costManagement = armClient.GetCostManagementViewResource(
new ResourceIdentifier($"{scope}/providers/Microsoft.CostManagement/views/AccumulatedCosts")
);
// 設定預算警報
// Bicep 定義// budget.bicep — 設定每月預算和警報
resource budget 'Microsoft.Consumption/budgets@2023-05-01' = {
name: 'monthly-budget'
properties: {
category: 'Cost'
amount: 5000 // 每月預算 $5,000
timeGrain: 'Monthly'
timePeriod: {
startDate: '2024-01-01'
}
notifications: {
alert80: {
enabled: true
operator: 'GreaterThanOrEqualTo'
threshold: 80 // 達到 80% 就通知
contactEmails: ['team@example.com']
}
alert100: {
enabled: true
operator: 'GreaterThanOrEqualTo'
threshold: 100 // 達到 100% 緊急通知
contactEmails: ['team@example.com', 'manager@example.com']
}
}
}
}TypeScript 版本
// AWS Cost Explorer SDK
import { CostExplorerClient, GetCostAndUsageCommand } from "@aws-sdk/client-cost-explorer";
const costExplorer = new CostExplorerClient({ region: "us-east-1" });
// 查詢本月各服務的成本
const result = await costExplorer.send(new GetCostAndUsageCommand({
TimePeriod: {
Start: "2024-01-01",
End: "2024-01-31",
},
Granularity: "MONTHLY",
Metrics: ["UnblendedCost"],
GroupBy: [{ Type: "DIMENSION", Key: "SERVICE" }],
}));
result.ResultsByTime?.[0].Groups?.forEach((group) => {
console.log(`${group.Keys?.[0]}: $${group.Metrics?.UnblendedCost?.Amount}`);
});
// Auto-Scaling 設定# Kubernetes HPA — 根據 CPU 自動擴縮
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 2 # 離峰最少 2 個
maxReplicas: 20 # 尖峰最多 20 個
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70 # CPU 超過 70% 就擴展Python 版本
# AWS — 用 boto3 找出閒置的 EC2 Instance
import boto3
from datetime import datetime, timedelta
cloudwatch = boto3.client("cloudwatch")
ec2 = boto3.client("ec2")
# 找出過去 7 天平均 CPU 低於 5% 的 Instance(可能閒置)
instances = ec2.describe_instances(Filters=[{"Name": "instance-state-name", "Values": ["running"]}])
idle_instances = []
for reservation in instances["Reservations"]:
for instance in reservation["Instances"]:
instance_id = instance["InstanceId"]
metrics = cloudwatch.get_metric_statistics(
Namespace="AWS/EC2",
MetricName="CPUUtilization",
Dimensions=[{"Name": "InstanceId", "Value": instance_id}],
StartTime=datetime.utcnow() - timedelta(days=7),
EndTime=datetime.utcnow(),
Period=86400,
Statistics=["Average"],
)
avg_cpu = sum(d["Average"] for d in metrics["Datapoints"]) / max(len(metrics["Datapoints"]), 1)
if avg_cpu < 5:
idle_instances.append({
"id": instance_id,
"type": instance["InstanceType"],
"avg_cpu": round(avg_cpu, 2),
})
print(f"Found {len(idle_instances)} potentially idle instances")
for inst in idle_instances:
print(f" {inst['id']} ({inst['type']}): {inst['avg_cpu']}% avg CPU")架構圖/概念圖
雲端帳單中 Compute 佔最大比例,是優化的首要目標。Right-sizing、Reserved Instance 和 Auto-Scaling 三管齊下可以節省 40-60% 的 Compute 費用。Storage 用分層和生命週期管理可節省 60-80%。
實戰補充
Q: 如何說服管理層投資成本優化?
A: 先做 3 個月的成本分析,找出明確的浪費(閒置 VM、過大規格)。計算優化後能省多少錢。通常第一次優化能省 20-30%,這個數字足以讓管理層支持。
Q: Reserved Instance 要買多少?
A: 只對穩定的基底負載買 RI。分析 3 個月的使用數據,找出最低使用量(如最少同時跑 5 台 D4s_v3),這 5 台買 RI。尖峰的額外需求用 Pay-as-you-go 或 Spot。
Q: 開發環境怎麼省錢?
A: (1) 非工作時間自動關機(晚上和週末)。(2) 用最小規格。(3) 用 Spot Instance。(4) 共用開發環境而非每人一套。(5) 設定自動刪除策略清理 7 天以上的臨時資源。
理解測驗
🤔 Right-sizing 的核心判斷依據是什麼?
🤔 Reserved Instance 的風險是什麼?
🤔 Spot Instance 適合什麼場景?
重點整理
💡一句話記住
雲端省錢三板斧:選對規格、買對承諾、關掉沒用的。 口訣:「Right-size 先做,RI 穩買,Spot 撿便宜」
| 策略 | 節省幅度 | 適用場景 | |------|---------|---------| | Right-sizing | 20-40% | 所有過大規格的資源 | | Reserved Instance | 30-70% | 穩定的基底負載 | | Spot Instance | 60-90% | 可中斷的批次任務 | | Auto-Scaling | 20-50% | 有明顯離峰尖峰的服務 | | Storage Tiering | 60-80% | 低存取頻率的舊資料 |