AWS 賬單看不懂、不知道錢花在哪?本文用 Cost Explorer 拆解 6 個可執行的 AWS 雲成本最佳化做法:清理閒置資源、實例與磁碟瘦身、Savings Plans 選擇、資料傳出最佳化、預算告警與團隊治理,附 30 天執行清單。
AWS 賬單看不懂,通常不是賬單太複雜,而是你開啟的是付款檢視——它只告訴你這個月被扣了多少錢,卻不告訴你哪臺機器、哪個環境、哪塊磁碟在燒錢。要做 AWS 雲成本最佳化,第一步不是去申請折扣,而是把賬單切換成成本檢視:按服務、按用量型別、按標籤、按可用區一層層拆開。如果賬單是突然漲了、而你要先弄清是誰漲的,那是另一條路徑——見 AWS 賬單突然變高怎麼排查。
下面 6 個做法按「收益 ÷ 見效速度」排列,不是按理論難度。前 3 個通常就能吃掉你 30%–60% 的可最佳化支出,而且大多不需要任何架構改動。(順帶一句:折扣是賬單最佳化的其中一層,不是第一層——五家廠商的折扣機制差別很大,橫向對比見 五家雲廠商折扣機制對比。)
執行順序很重要:先清理(3 天見效)→ 再瘦身(1–2 周)→ 再鎖定折扣(1 個月起算)→ 最後才是預算告警與治理。反過來做,你會先買下 1 年的承諾,然後發現一半資源根本用不到。
30 分鐘先把賬單切成成本檢視
AWS 自帶三層賬單介面,粒度完全不同。你要用的是 Cost Explorer,而不是賬單頁。
- Billing(賬單頁):只有總額和發票。適合確認「我付了多少」,不適合找原因。
- Cost Explorer:按服務、用量型別、區域、標籤、賬號做多維拆解,支援自定義時間對比。這才是排查工具。
- Cost and Usage Report(CUR):落到 S3 的原始明細資料,配合 Athena 可以寫 SQL 自助分析。團隊規模到「多人共用一個賬號」時,這一步最終都要做。
路徑是 Billing Console → Cost Explorer → Cost and Usage Report。前兩個免費;Cost Explorer 在前兩個賬單週期免費,之後按所跟蹤資源成本計費(量級是月支出的零點幾個百分點,最低約 $1/月,具體以官方實時報價為準)。
| 檢視 | 能回答什麼問題 | 資料延遲 |
|---|---|---|
| Billing 賬單頁 | 這個月一共扣了多少錢 | 總額實時 |
| Cost Explorer(按小時用量) | 哪個服務或用量型別在漲 | 約 12–24 小時 |
| Cost Explorer(含跨區域/資源級) | 具體是哪臺機器、哪塊卷 | 約 24–48 小時 |
| CUR + Athena | 自定義維度,如團隊、標籤、單個功能 | 通常 24 小時以上 |
別指望今天就看懂昨天的完整賬單。 AWS 用量資料是分批到達的,跨區域流量、資料傳輸這類聚合項通常最慢(可達 48 小時以上)。月初第一週看到的資料偏少是正常現象,做同比或環比分析時避開這一週,否則你會得出「成本暴跌」的錯覺。
先找出真正吃錢的 5 個大頭
不要憑感覺最佳化。開啟 Cost Explorer,按下面四步拆,10 分鐘就能拿到一張成本大頭清單:
- Group by 選 Service,時間範圍選上個月,看 Top 5 服務各佔多少。
- 對佔比最高的 2–3 個服務,把 Group by 換成 Usage type(用量型別),看底是
DataTransfer-Out-Bytes、BoxUsage:m5.large還是別的。 - Group by 換成 Region + Availability Zone。很多賬單裡「同區域跨 AZ 流量」是一個不起眼但穩定增長的項。
- 開啟 Cost allocation tags(成本分配標籤),按
Env、Owner、Service分組。沒有標籤的支出會浮在 Untagged 裡,那本身就是第一優先順序問題。
拆完之後,絕大多數中小團隊會得到類似這樣的結構(以下是經驗區間,不代表任何一家公司的真實賬單):
| 排名 | 成本項 | 常見佔比 | 可最佳化空間 |
|---|---|---|---|
| 1 | EC2 計算(折扣前的按需部分) | 30%–50% | 20%–40% |
| 2 | 資料傳出(跨 AZ、NAT、跨區域、網際網路出站) | 10%–25% | 30%–60% |
| 3 | EBS 卷與快照 | 8%–20% | 15%–35% |
| 4 | 託管資料庫(RDS/Aurora)及其儲存與備份 | 8%–20% | 10%–25% |
| 5 | NAT 閘道器、負載均衡器、閒置公網 IP 等隱形項 | 5%–15% | 50%–90% |
別把「佔比最高」直接等同於「最該先動」。 上表第 5 項佔比不大,但可最佳化空間最高,而且通常一晚上就能清完。正確的排序依據是「可最佳化空間 × 見效速度」,不是絕對金額。
做法一:先關掉沒人用的東西
這是投入產出比最高的一步,也是最常被跳過的一步。很多團隊不是不知道有浪費,而是沒人真的去查。把下面的動作交給值班的人,或者寫進 IaC(Terraform/Pulumi)流水線,而不是靠人肉回憶。
- 未掛載的 EBS 卷:用
DescribeVolumes按State=available過濾。卷按建立時的規格全額計費,掛不掛載都一樣。 - 閒置的 Elastic IP:未關聯任何實例的 EIP 仍按小時計費。
- 跨可用區的 NAT 閘道器:NAT Gateway 按每個可用區分別計費。多可用區架構如果在每個 AZ 都放一個,而其中一個 AZ 沒有真實流量,那是一整份按小時費用。
- 縮容到 0 的 Auto Scaling 組、已停機但未登出的 EC2、長期保留的 RDS 快照與舊 AMI。
- CloudWatch Logs 沒設保留期:日誌按 GB 長期累積,通常屬於「看一眼不心疼、半年後很貴」那一項。
- 閒置的負載均衡器,以及沒有任何快照依賴鏈的孤立快照。
| 檢查動作 | 具體做法 | 為什麼值錢 |
|---|---|---|
| 未掛載卷清理 | DescribeVolumes 過濾 available → 確認後刪除 | 按規格全額計費,清一次就一勞永逸 |
| 閒置 EIP 回收 | DescribeAddresses 找沒有 AssociationId 的條目 | 約 $0.005/hour 量級;20 個殭屍 EIP 累積起來就是數百美元量級(以官方實時報價為準) |
| NAT 閘道器收斂 | 看每個 AZ 的流量指標,把無流量的合併到 1–2 個 | 按 AZ 全額計費,3 個合併到 1 個通常省掉一半以上 NAT 費用 |
| 日誌保留期 | 給 Log Group 設 30–90 天 retention,錯誤日誌另存 S3 | 常能砍掉日誌費用的 50% 以上 |
| 快照生命週期 | 對非基線快照配 Lifecycle Policy 自動過期 | 防止快照量只增不減 |
刪除流程也要補上。 清理動作本身只要幾分鐘,但被誤刪的風險要用流程擋住:給生產賬號加 SCP 或 IAM 策略,要求刪除必須走工單 / 必須帶審批標籤;或者先 stop 保留 7 天再刪,讓回滾有視窗。
做法二:給實例和磁碟瘦身
清理完之後,第二步是把仍在付全價但用不滿的資源改小。這一步的判斷標準要用指標,不要用直覺。
EC2:看 p95 和記憶體,不是平均值
開啟 Compute Optimizer(免費),它基於 CloudWatch 歷史指標給出降配、升配和遷移到新一代架構的建議;EC2 側的建議大約可以回看 12 周曆史,正好覆蓋工作日與週末的完整週期。具體怎麼按負載挑實例族和區域,見 EC2 實例型別與區域怎麼選。
- CPU 看 p95,別看平均值。p95 才 15% 的實例通常可以小一檔。
- 記憶體常常才是真瓶頸:Java / Node 服務堆配置很高但實際只用 30% 的情況非常普遍。
- 別按平均值裁:留 20%–30% 餘量。突發流量是常態,按平均值裁換來的是更高的重啟/遷移頻率和更差的 P99 延遲。
- 換機型常常比改尺寸更划算:同效能的新一代實例通常便宜 10%–25%;Graviton(ARM)在支援負載上通常便宜 20%–40%。遷移前務必確認依賴不是 x86 原生二進位制。
EBS:GP3 的 IOPS 和吞吐是可以降的
GP3 卷最常見的浪費是按峰值規格買滿。它支援在建立後單獨調整 IOPS 與吞吐(基線以上部分立即生效),所以先把規格降到基線,再按實際用量逐檔調高,比一步到位買滿便宜很多。判斷依據看 CloudWatch 的 VolumeReadOps / VolumeWriteOps 的 p95 用量。
另外兩件常被忽略的事:同一份資料被多個實例掛載時,舊實例上那份卷不會被自動合併,舊卷照樣全額計費;AWS 現在有 EBS Optimizer 會列出可最佳化的卷與預計節省,值得每月跑一次。
快照是獨立的計費項。 你可以把卷降到基線規格,但快照按儲存容量單獨計價,歷史快照不會因為卷降規格而變便宜。所以「刪掉舊卷再做新 AMI」通常比「重做 AMI 卻留著舊快照」便宜。
做法三:Savings Plans、預留實例和 Spot 怎麼選
鎖定折扣的本質是用錢換靈活性。選錯的代價不是折扣小,而是接下來一年都在為一個根本用不滿的承諾付錢。三種方式各自的適用條件,完整版見 節省計劃與預留實例怎麼選。
| 方式 | 大致折扣(相對按需) | 靈活度 | 適合 |
|---|---|---|---|
| Spot 競價實例 | 最高約 90% off | 最低,可能 2 分鐘內被回收 | 批處理、渲染、CI、資料轉換等可中斷任務 |
| 計算類 Savings Plans(1 年 / 3 年) | 約 10%–20% / 20%–30% | 較高,自動覆蓋同區域計算用量,含 Fargate / Lambda | 算力規格會變的團隊(容器、無伺服器) |
| EC2 實例類 Savings Plans | 與計算類同檔,區間接近 | 只作用於 EC2 指定實例族 | 主力負載集中在少數幾個實例族 |
| 標準預留實例(RI) | 1 年約 25%–40%,3 年更高 | 最低:繫結單實例族 + 單區域 | 實例族 6 個月以上不會變的穩定負載 |
實際的決策規則只有四條:
- 能用 Spot 的先全部用 Spot。 配上自動伸縮和斷點續跑,把系統設計成「隨時可被打斷」,批處理成本可以降到接近按需的一成。
- 主力 EC2 穩定在 2–3 個實例族 → 計算類 Savings Plans 1 年。 它對實例族不敏感,比 RI 更不容易買錯,是絕大多數中小團隊的正確選擇。
- 不要一上來就鎖 3 年。 提前退出的代價是真金白銀:賣出售餘預留實例最高可能被收取預付額約一半的手續費,Savings Plans 的兌換與退出也有條件和費用。先買 1 年驗證負載穩定,第二年再決定要不要延。
- 承諾金額只買「穩態基線」。 把最低那部分(通常是正夜間的最低負載)算作承諾量,彈性部分繼續按需或走 Spot。買多了不會退,這是最常見的虧損點。
Savings Plans 的覆蓋範圍常被誤解:它在單個區域內自動抵扣用量,跨區域不通用,也不覆蓋資料傳出和大部分託管服務費用。購買前一定在控制檯看「可抵扣用量預覽」,別憑印象估算覆蓋率。
做法四:資料傳出(egress):最容易出意外的一項
在賬單裡,DataTransfer-Out-Bytes 通常是增速最陡、也最沒被主動設計過的一項。根因幾乎總是同一個:請求從哪個可用區的實例出去,就從哪個可用區的出口計費,而不是走 CDN 或統一出口。完整拆解(流量其實有六個計費邊界,以及每一條怎麼省)見 AWS 流量費為什麼這麼貴。
- 同 AZ 內實例間通訊免費;同區域跨 AZ 流量按每 GB 單價計費,雙向都會產生費用。
- 跨區域流量同樣計費,量級通常比跨 AZ 高一檔。
- NAT Gateway 除按小時外還有按 GB 的資料處理費——每個 NAT 都收一次,這是 NAT 流量的雙份成本。
- 網際網路出站:靜態資源、API 響應、圖片下載都算在內,而且通常佔大頭。
| 場景 | 常見做法 | 大致節省 |
|---|---|---|
| 靜態資源(圖片、JS/CSS、字型) | 放 CloudFront,S3 作源站 | CloudFront 到網際網路的出站本身免資料傳輸費,這一項常能砍掉 50%–90% |
| 微服務跨 AZ 呼叫 | 把同服務副本放在同一 AZ,或改走 PrivateLink | 同 AZ 內部呼叫免費,可省掉跨 AZ 那筆 |
| NAT 閘道器流量 | 按 AZ 收斂到少量 NAT;訪問 S3/DynamoDB 改用 VPC Endpoint | VPC Endpoint 走內部路徑,替代 NAT 的按 GB 處理費 |
| 資料庫跨區域災備 | 把複製頻率從每 5 分鐘降到業務能容忍的程度 | 複製頻率減半,跨區域流量接近減半 |
| 日誌與資料匯出 | 壓縮後再出站,或改成拉取模式 | gzip / zstd 通常能把傳輸量壓掉 60%–80% |
今天就能做的一個動作:在 Cost Explorer 裡把 Group by 設為 Usage type 並篩 DataTransfer,然後按 Availability Zone 拆開。你通常會發現某兩個 AZ 的流量明顯異常——那基本就是 NAT 閘道器或某個沒最佳化的服務在漏錢。
做法五:把預算告警設成剎車片
最佳化不是一次性專案,是持續動作。沒有告警的賬號,三個月就能把省下的錢花回去——新增資源、測試環境、誤配都會悄悄推高賬單。AWS Budgets 的價值不在報表,而在閾值觸發時能及時通知到具體的人。
- 進 AWS Budgets → Create budget → 選 Cost budget,範圍先鎖定你負責的那個賬號。
- 金額設成上月實際支出的 1.1–1.2 倍,不要設成理想值。否則第一週就天天報警,最後所有人直接忽略通知。
- 同時設 50% / 80% / 100% 三個閾值,再加一個 Actual vs Forecasted 閾值,用來抓「按當前趨勢月底會超支」。
- 通知渠道至少兩個:郵件 + 團隊聊天(SNS → Chatbot)。只有郵件的告警在實踐中等於沒有。
- 開啟 Cost Anomaly Detection,它基於歷史模式做異常檢測,能在賬單明顯上漲之前發現「某個資源的使用方式突然變了」。
| 告警型別 | 閾值建議 | 作用 |
|---|---|---|
| Actual 成本 | 50% / 80% / 100% | 控制當月支出上限 |
| Actual vs Forecasted | 超預測 10% | 提前一週知道要超支 |
| Cost Anomaly Detection | 用系統預設值,需要時再調 | 發現單日異常消耗 |
| 服務用量閾值 | 按服務設基線的 2 倍 | 提前發現流量尖峰 |
再補一條治理動作:成本分配標籤必須在資源建立時就強制帶上。 標籤如果靠人記得打,半年後 Untagged 通常會佔總支出的 15%–30%,你就永遠說不清這部分花在了誰身上。用 Organizations 的 SCP,或者在 IaC 裡加必填標籤來兜底。
做法六:讓成本變成團隊能管的事
以上六件事做完,剩下的瓶頸通常不是技術,而是「誰有權決定花多少錢」。這一步決定最佳化能不能持續下去。
- 按環境拆賬號:生產一個賬號、測試一個賬號。測試環境最容易失控,獨立賬號讓「先關測試環境」變成一個普通操作。
- 給測試環境加自動關停:工作日 19:00 定時停機、週末全天停機。一個 20 臺實例的環境每月能省掉幾十小時按需費用,幾個人的成本差就出來了。
- 上線前過一道成本評審:新服務要有預估月支出,超過某個閾值(比如 $500/月)需要架構評審說明。這比事後省錢便宜得多。
- 每週 30 分鐘成本例會:只看三樣——總支出趨勢、Top 5 服務、本週異常項。堅持三個月,效果通常超過任何一次性的架構重構。
- 把明細做成可查詢的資料:CUR 落 S3 + Athena(按掃描量付費,單價很低),讓業務方能自助查「我這個功能花了多少錢」,而不是每次都來問架構師。
| 治理動作 | 頻率 | 通常的負責人 |
|---|---|---|
| Untagged 支出佔比 | 每週 | 平臺 / 雲管理 |
| 閒置資源掃描與清理 | 每月 | 平臺 / 雲管理 |
| Savings Plans 覆蓋率與承諾利用率 | 每月 | 技術負責人 |
| 新增 / 下線服務的成本登記 | 每次釋出 | 服務 owner |
兩個值得盯的訊號:承諾利用率(Savings Plans Utilization)低於 90%,說明你在為用不到的承諾付錢;某項資源「連續 30 天從未被使用」,就是一個明確的清理訊號。這兩個指標比總支出更能提前發現問題。
30 天執行清單
把上面的內容壓縮成一個四周節奏,按這個順序做,收益基本線性累積:
- 第 1 周 — 看清:在 Cost Explorer 裡按 Service / Usage type / AZ 三層拆一遍,輸出一張 Top 10 成本項清單;開啟成本分配標籤。
- 第 2 周 — 清零:刪掉未掛載卷、閒置 EIP、冗餘 NAT 閘道器、過期快照;給所有 Log Group 設 30–90 天保留期;測試環境加定時關停。
- 第 3 周 — 瘦身:跑 Compute Optimizer 與 EBS Optimizer,按建議改小一批實例、把主力卷遷到 GP3 並下調 IOPS/吞吐、評估一次 Graviton 遷移。
- 第 4 周 — 鎖定:按「最低穩態負載」買 1 年計算類 Savings Plans;把批處理任務遷到 Spot;配置 50/80/100% 預算告警與 Cost Anomaly Detection 通知。
做完這四周,常見結果是把可最佳化支出壓掉 25%–50%,而且很多項是一次性的、會立刻體現在下一張賬單上。真正決定長期效果的是第 4 周之後:告警有人看、標籤有人填、閒置資源有人掃。
下一步可以具體到今天下午:開啟 Cost Explorer,切到「上個月」,Group by 選 Service,把前 3 名的佔比記下來。這三個數字就是你後面所有最佳化工作的起點。如果你拆不出有意義的資料,或者拆出來發現賬單結構和預期差很多——這本身就是很值得解決的技術問題。帶上你的服務清單、區域分佈和上個月賬單摘要,我們可以先幫你做一版成本結構判斷,看哪些是可動空間、哪些是必要開銷。