NATGateway-Bytes、DataProcessing-Bytes 之類的字眼在上升,
大機率就是它在燒。
1) NAT Gateway 到底在收什麼錢?為什麼特別容易「不小心」變大頭
NAT Gateway 的麻煩點在於:你不會把它當成「主要服務」,但它可能承擔了你整個私網的出入口。 很多團隊對 NAT 的印象停留在「流量費」,結果忽略了它其實像一個必經的收費站: 只要你的 private subnet 裡任何東西要碰到公網(或走到某些外部 endpoint),就可能經過它。
最容易爆的不是「偶爾打幾次外部 API」,而是那種你平常不會盯的背景流量: 例行更新、容器拉 image、agent 上報 metrics、某個 job 失敗重試、或是把大檔案往外送。 這些行為單看都合理,疊在一起就很可觀。
2) 三種最常見的爆費路徑(你可以直接對照)
(A)容器/EC2 在 private subnet:拉 image、更新套件、下載依賴
這是最常見也最容易忽略的。你把 ECS/EKS/EC2 放在 private subnet 是好事,但只要它們需要出網,
就會走 NAT。最典型的場景是:
部署時拉 Docker image、啟動時下載模型/依賴、定期 apt update、或是你某個 init script 每次都去外網抓東西。
流量不一定誇張,但「頻率」很可怕。
(B)打第三方 API / 外部 webhook:一忙起來 NAT 先爆
私網服務打外部 API 很正常:付款、簡訊、email、地圖、風控、CDN purge… 只要你的流量跟著業務量放大, NAT 成本也會跟著放大。更糟的是有些程式碼遇到 timeout 會重試, 你看到的是「偶爾慢一下」,帳單看到的是「你在外面一直敲門」。
(C)S3 / AWS 服務走錯路:本來能走私網,結果繞到公網
這種是最冤枉的:同樣是在 AWS 裡跑,但因為路由或設定沒處理好,流量繞出去再繞回來,全部算在 NAT 頭上。 常見例子是:private subnet 的工作去抓 S3 物件、打 STS、拉 ECR image, 本來可以用更「內部」的方式完成,但你沒把路徑固定住,就讓它走了 NAT。
3) 第一輪排查:不用先研究定價表,先把「最大頭」抓出來
我通常建議先別急著背費率,也不要一開始就進 VPC 畫大架構。你先做一輪「找最大頭」就好: 哪個時段開始暴增?是不是剛好有部署?剛好有批次?剛好某個服務開始跑?把可疑範圍縮小,才有辦法動手。
- 帳單暴增的那幾天,有沒有剛上新版本 / 新 job / 新容器?(尤其是 image 變大、啟動變頻繁)
- private subnet 裡最近是不是多了「需要出網」的東西?(監控 agent、同步工具、抓外部 API)
- 是否有 timeout / 重試風暴?(看應用 log,或近期錯誤率是否上升)
- 是否大量存取 S3/ECR/STS 等服務但沒有固定路徑?(容易出現「繞 NAT」的冤枉費)
- NAT 是不是單點?(所有私網都指向同一個 NAT,成本集中)
4) 常見誤判:別急著把 NAT 拆掉
NAT 本身不是原罪,它解決的是「私網安全地出網」這件事。真正的問題通常是: 你讓太多本來不需要出網的流量去出網,或是把所有出網都塞到同一條路上。
- 誤判 1:看到 NAT 費用高就把工作負載全搬到 public subnet(省了 NAT,卻把風險搬到公網)。
- 誤判 2:只盯 NAT,不看「為什麼會出網」— 來源行為不改,費用只會換地方出現。
- 誤判 3:用更複雜的架構去治療一個其實是「重試設定」或「下載策略」造成的問題。
5) 降費策略(按投報率排序):先修路徑,再談大改造
(A)先抓出「不必要的出網」:重試、下載、背景同步
如果有重試風暴(尤其是外部 API)先處理它,這種通常修一次就有感。再來看部署/啟動流程: 你是不是每次啟動都去外網抓一堆東西?能不能把依賴打包、做快取、或把下載頻率降下來?
(B)把「本來在 AWS 內部就能完成的」導回內部路徑
這類最冤枉也最值得做:同樣的需求,如果能讓流量不要繞到公網再回來,通常 NAT 成本會直接下去。 你不一定要一次做得很完美,但至少把「大宗」先拉回來。
(C)把 NAT 當成「稀缺資源」管理:分流、限速、上報
如果你的架構注定會有出網,那就把 NAT 視為一條需要被管理的管線:哪些系統可以用?哪些系統不該用? 甚至把它做成顯性的監控指標。很多成本問題,其實是「沒有把它當成需要管的東西」。