成本管理: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 Gateway | 0.045/hr | ECR/S3 走 VPC Endpoint(免流量費) |
| EBS Snapshot | 存著就收錢,很容易忘記清 | Data Lifecycle Manager 自動刪舊的 |
| ALB | Idle 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 Instance | Savings 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"}]
}
]'我建議設兩道告警:
- 實際花費 80%:提醒你注意
- 預測花費 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 流程:最重要的不是工具
- 每週 Review:每週一花 15 分鐘看 Cost Explorer,標記異常
- Tag 一切:每個資源打上
Environment、Team、Projecttag - Dev 環境自動關機:下班後自動 stop EC2、scale down ECS
- 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 | ~$430 | AWS 貴 80% 但省 80% 維運 |
結論:AWS 的價值不在「便宜」,在「你不需要半夜三點起來修 server」。如果你的時間成本計入,AWS 通常更划算。但如果你享受自己管 server,自架永遠更便宜。
更深入的成本分析和 FinOps 策略,看 Cloud 系列的費用優化概念篇 和 實戰篇。
系列導覽
省錢最有效的方法不是買 RI,是關掉你忘記在跑的東西。