雲端成本優化(Cost Optimization)

是什麼?

雲端成本優化是一套持續性的實踐,確保用最少的花費獲得需要的雲端服務。不是一次性的削減,而是融入架構設計和日常營運的習慣。

ℹ️雲端帳單常見分布

典型的雲端帳單中:Compute 佔 60-70%(VM、Container、Serverless)、Storage 佔 15-20%Network 佔 5-10%、其他服務佔剩餘。Compute 是最大的優化目標。

核心觀念

常見誤區

⚠️常見誤區

  • 只看單價不看總費用:便宜的小實例跑了 100 台可能比 10 台大實例貴。要看總 TCO(Total Cost of Ownership)
  • Reserved Instance 買太多:RI 是承諾,用不完也要付錢。先分析 3 個月的使用數據,只對穩定的基底負載買 RI
  • 不設預算警報:月底才發現帳單爆掉。在 Day 1 就設定預算警報,超過 80% 就通知

流程/步驟

1

可視化成本

設定 Cost Dashboard,了解錢花在哪裡

2

辨識浪費

找出閒置資源、過大規格、未使用的 IP 和磁碟

3

Right-sizing

根據使用率調整 VM/Container 規格

4

購買 RI/Savings Plan

對穩定的基底負載購買 1-3 年承諾

5

設定 Auto-Scaling

離峰自動縮減,尖峰自動擴展

6

持續監控

每月 Review 成本報告,設定預算警報

流程解讀:先看清楚錢花在哪裡(可視化),再找出最大的浪費(閒置資源、過大規格)。Right-sizing 是最快見效的措施。穩定負載買 RI 省長期成本。Auto-Scaling 解決離峰浪費。持續監控確保不會回到浪費狀態。

程式碼範例

C# 版本

csharp
// 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 定義
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 版本

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 設定
yaml
# 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 版本

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")

架構圖/概念圖

Monthly Cloud Bill
biggest cost
Compute (60-70%)
right-sizing + RI + auto-scale
Storage (15-20%)
tiering + lifecycle
Network (5-10%)
Optimization Actions

雲端帳單中 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% | 低存取頻率的舊資料 |

你可能也想看

Serverless 架構Well-Architected Framework

按 ← → 鍵切換課程