成本管理:RI / Spot / FinOps 省錢三板斧

你的 AWS 帳單每個月都在長,但你不知道錢花在哪裡?等到月底看帳單已經太晚了——那些 NAT Gateway 流量費和忘記關的 dev 環境已經燒掉一大筆。

先講結論

AWS 省錢三板斧:Reserved Instance / Savings Plan(穩定負載省 30-60%)、Spot Instance(可中斷的工作省 60-90%)、FinOps 流程(Budget Alert + 自動清理 + 定期 review)。最重要的不是技術手段,是建立看帳單的習慣——每週花 15 分鐘看 Cost Explorer,比任何省錢技巧都有效。


第一步:搞懂你的錢花在哪裡

Cost Explorer

# 查看過去 30 天的費用(按服務分)
aws ce get-cost-and-usage \
  --time-period Start=$(date -d '30 days ago' +%Y-%m-%d),End=$(date +%Y-%m-%d) \
  --granularity MONTHLY \
  --metrics BlendedCost \
  --group-by Type=DIMENSION,Key=SERVICE
 
# 查看費用趨勢(每日)
aws ce get-cost-and-usage \
  --time-period Start=$(date -d '7 days ago' +%Y-%m-%d),End=$(date +%Y-%m-%d) \
  --granularity DAILY \
  --metrics BlendedCost

常見的燒錢兇手

服務為什麼貴怎麼省
NAT Gateway0.045/hrECR/S3 走 VPC Endpoint(免流量費)
EBS Snapshot存著就收錢,很容易忘記清Data Lifecycle Manager 自動刪舊的
ALBIdle ALB 每月 $22不用的環境刪掉
CloudWatch Logs按 ingestion 量計費設 retention、減少 verbose log
Data Transfer跨 AZ 流量 $0.01/GB同 AZ 部署、減少跨 AZ 呼叫
RDS Multi-AZ費用翻倍Dev/Staging 不需要 Multi-AZ

Reserved Instance / Savings Plan

RI vs Savings Plan

Reserved InstanceSavings Plan
綁定對象特定 instance type + Region任何 instance type(Compute SP)
彈性低(換 type 要轉換)高(自動套用到最省的地方)
折扣30-60%30-60%
期限1 年 / 3 年1 年 / 3 年
付費方式全預付 / 部分預付 / 不預付同左

2026 年建議:用 Compute Savings Plan 取代 RI。彈性更高,折扣差不多。

# 查看 Savings Plan 建議
aws ce get-savings-plans-purchase-recommendation \
  --savings-plans-type COMPUTE_SP \
  --term-in-years ONE_YEAR \
  --payment-option NO_UPFRONT \
  --lookback-period-in-days SIXTY_DAYS
 
# 購買 Savings Plan
aws savingsplans create-savings-plan \
  --savings-plan-offering-id offering-xxx \
  --commitment 10.00 \
  --purchase-time "2026-05-01T00:00:00Z"

計算要不要買

On-Demand 月費:$500
Savings Plan (1yr, No Upfront):$350/月
月省:$150
年省:$1,800
風險:如果你不再用這個服務,還是要付 $350/月

原則:只對穩定跑超過 6 個月的負載買 Savings Plan。Dev 環境和短期專案不要買。


Spot Instance:可中斷工作的省錢神器

Spot Instance 用 AWS 的閒置容量,價格比 On-Demand 便宜 60-90%。代價是 AWS 可以隨時在 2 分鐘前通知你回收。

適合 Spot 的場景

  • CI/CD build(中斷了重跑就好)
  • Batch 處理(有 checkpoint)
  • 無狀態 Web Server(後面有 ALB 接)
  • 大數據處理(EMR、Spark)

不適合 Spot 的場景

  • 資料庫
  • 有狀態服務
  • 單點故障的服務
# 用 Spot 跑 ECS Task
aws ecs create-service --cluster prod-cluster \
  --service-name worker \
  --task-definition worker:1 \
  --desired-count 5 \
  --capacity-provider-strategy '[
    {"capacityProvider": "FARGATE_SPOT", "weight": 4, "base": 0},
    {"capacityProvider": "FARGATE", "weight": 1, "base": 1}
  ]'
# base=1 確保至少一個 Task 跑在 On-Demand 上
# weight 4:1 表示 80% Spot、20% On-Demand
# EC2 Spot Fleet(跑 CI/CD build)
aws ec2 request-spot-fleet --spot-fleet-request-config '{
  "IamFleetRole": "arn:aws:iam::123456789012:role/spot-fleet-role",
  "TargetCapacity": 5,
  "SpotPrice": "0.05",
  "LaunchSpecifications": [
    {
      "ImageId": "ami-xxx",
      "InstanceType": "c5.xlarge",
      "SubnetId": "subnet-private-1a"
    },
    {
      "ImageId": "ami-xxx",
      "InstanceType": "c5a.xlarge",
      "SubnetId": "subnet-private-1a"
    }
  ],
  "AllocationStrategy": "priceCapacityOptimized"
}'

注意:lowestPrice 配置策略已被 AWS 標記為 deprecated,建議改用 priceCapacityOptimized(兼顧價格和容量可用性,減少中斷機率)。

技巧:指定多個 instance type 提高 Spot 可用性。只指定一個 type 容易被回收。


Budget Alert:最重要的防線

# 建立月度預算 + 告警
aws budgets create-budget --account-id 123456789012 \
  --budget '{
    "BudgetName": "monthly-total",
    "BudgetLimit": {"Amount": "500", "Unit": "USD"},
    "TimeUnit": "MONTHLY",
    "BudgetType": "COST"
  }' \
  --notifications-with-subscribers '[
    {
      "Notification": {
        "NotificationType": "ACTUAL",
        "ComparisonOperator": "GREATER_THAN",
        "Threshold": 80,
        "ThresholdType": "PERCENTAGE"
      },
      "Subscribers": [{"SubscriptionType": "EMAIL", "Address": "ops@example.com"}]
    },
    {
      "Notification": {
        "NotificationType": "FORECASTED",
        "ComparisonOperator": "GREATER_THAN",
        "Threshold": 100,
        "ThresholdType": "PERCENTAGE"
      },
      "Subscribers": [{"SubscriptionType": "EMAIL", "Address": "ops@example.com"}]
    }
  ]'

我建議設兩道告警:

  1. 實際花費 80%:提醒你注意
  2. 預測花費 100%:如果照這個趨勢下去會超標

VPC Endpoint:省 NAT Gateway 流量費

NAT Gateway 的流量費是隱藏的燒錢兇手。S3 和 ECR 的流量走 VPC Endpoint 可以完全免費。

# S3 Gateway Endpoint(免費)
aws ec2 create-vpc-endpoint --vpc-id vpc-xxx \
  --service-name com.amazonaws.ap-northeast-1.s3 \
  --route-table-ids rtb-private
 
# ECR Interface Endpoint(有 endpoint 費但省 NAT 流量)
aws ec2 create-vpc-endpoint --vpc-id vpc-xxx \
  --vpc-endpoint-type Interface \
  --service-name com.amazonaws.ap-northeast-1.ecr.dkr \
  --subnet-ids subnet-private-1a subnet-private-1c \
  --security-group-ids sg-endpoint

省多少?

一個 ECS cluster 每月拉 100 GB 的 image:

  • 走 NAT Gateway:100 GB x 4.50/月**
  • 走 VPC Endpoint:$0

看起來不多?如果你有多個環境、多個服務,每個月幾十 GB 的 NAT 流量很正常。


FinOps 流程:最重要的不是工具

  1. 每週 Review:每週一花 15 分鐘看 Cost Explorer,標記異常
  2. Tag 一切:每個資源打上 EnvironmentTeamProject tag
  3. Dev 環境自動關機:下班後自動 stop EC2、scale down ECS
  4. Unused Resource 掃描:定期找沒在用的 EBS、EIP、NAT GW
# 找沒掛載的 EBS Volume(花錢但沒用)
aws ec2 describe-volumes \
  --filters Name=status,Values=available \
  --query "Volumes[*].[VolumeId,Size,CreateTime]" --output table
 
# 找沒關聯的 Elastic IP($3.6/月)
aws ec2 describe-addresses \
  --query "Addresses[?AssociationId==null].[PublicIp,AllocationId]" --output table
 
# 找舊的 EBS Snapshot
aws ec2 describe-snapshots --owner-ids self \
  --query "Snapshots[?StartTime<='2025-01-01'].[SnapshotId,VolumeSize,StartTime]" --output table

自架 vs AWS 成本比較

場景自架月費AWS 月費備註
2 台 Web Server~$100(Hetzner)~$150(ECS Fargate)AWS 省維運時間
PostgreSQL HA~$80(2 台 VPS)~$200(RDS Multi-AZ)AWS 省 DBA 時間
監控(Prometheus+Grafana)~$40(1 台 VPS)~$50(CloudWatch)差不多
CI/CD~$20(GitLab Runner)~$30(CodeBuild)GitHub Actions 免費
總計~$240~$430AWS 貴 80% 但省 80% 維運

結論:AWS 的價值不在「便宜」,在「你不需要半夜三點起來修 server」。如果你的時間成本計入,AWS 通常更划算。但如果你享受自己管 server,自架永遠更便宜。

更深入的成本分析和 FinOps 策略,看 Cloud 系列的費用優化概念篇實戰篇


系列導覽


省錢最有效的方法不是買 RI,是關掉你忘記在跑的東西。