- AWS VPCネットワーキングとNAT Gatewayの設定ミスにより、S3データ転送コストが1日で約900ドル、月間累計で1,000ドルを超えた事例
- EC2からS3への転送は無料と認識されがちだが、VPC内でNAT Gatewayを経由すると有料のデータ処理料金が発生
- 問題の原因はS3向けVPC Gateway Endpointの欠落で、NAT Gatewayを通らずにS3へ直接接続する設定がなかったこと
- Gateway Endpointは無料で、データ転送料金も発生しないため、Terraformなどで簡単に設定可能
- AWSインフラ運用におけるコスト監視とVPC Endpoint構成確認の重要性を示す事例
問題の背景
- Geocodioは内部の大容量地理データファイルをS3にミラーリングするためにAWSを利用
- データは住所ポイント、境界データ、国勢調査情報などで、数GBから数百GB規模
- HetznerでホストされているETLプラットフォームからAWS処理インフラへ定期的な同期が必要
- AWSのデータ転送コストの高さは業界全体の共通不満であり、CloudflareやCorey Quinnらも関連問題を指摘
- 著者はプロジェクト開始前にコスト構造を確認し、
- 同一リージョン内のEC2–S3転送は無料
- S3へのアップロード(入力)は無料
という点を確認してコストを見積もっていた
想定外のコスト発生
- S3同期プロセスのデプロイ後、AWS Cost Anomaly Detectionから異常アラートを受信
- 1日でNAT Gatewayのデータ転送量が20,167.32GB、コスト907.53ドルが発生
- 月間累計コストはすでに1,000ドルを超過
- EC2–S3転送は無料だと思っていた状況で、なぜNAT Gateway料金が請求されたのかを調査
原因分析: NAT Gateway経由
- VPCでNAT Gatewayを使用している場合、S3トラフィックもデフォルトでNAT Gateway経由にルーティングされる
- 同一リージョン内のAWSサービスへのリクエストであっても、NATを経由すると1GBあたり0.045ドルのデータ処理料金が発生
- その結果、EC2–S3間の転送自体は無料でも、NAT Gatewayのコストが請求された
- 解決策はS3向けVPC Gateway Endpointの作成
- NAT GatewayやInternet Gatewayを経由せず、VPCからS3へ直接接続
- 完全無料で、時間単位料金や転送料金もない
解決までの流れ
- Terraformでインフラを管理していたため、Gateway Endpointリソースを追加してルートテーブルに関連付け
- AWSが自動でルーティングを更新し、S3トラフィックをNAT GatewayではなくEndpointへ送信
- その後、NAT Gateway関連の課金は停止
教訓と推奨事項
- 長年AWSを使っていても、S3向けVPC Endpoint設定の漏れによりコストが発生しうる
- AWSネットワーキングは複雑で、コスト構造は設定方法によって大きく変わりうる
- 再発防止のための推奨事項
- AWS Cost Anomaly Detectionを有効化: 異常コストを早期に検知可能
- VPC Endpointを利用: NAT Gatewayを使うVPCでS3・DynamoDBへアクセスする際は必須
- 前提を検証する: 「EC2–S3転送は無料」という前提をうのみにせず、少量テスト後にコスト監視が必要
- クラウドは複雑: 長期利用者であっても継続的な注意が必要
- 類似事例として、Recall.aiがWebSocketデータ処理コストとして年間100万ドルを支払った例にも言及
その後の対応
- GeocodioはすべてのVPCのS3通信経路を点検し、Gateway Endpointの構成を完了
- AWS利用者にVPC Endpoint設定の確認を推奨
- 要約: NAT GatewayはAWSサービス向けトラフィックも課金対象であり、VPC Endpointの利用でコスト回避が可能
追加資料
1件のコメント
Hacker Newsの意見
主要なクラウド系サブレディット3つで、こうした請求爆発の事例が1日に1回くらいの頻度で投稿されるのをよく見る
クラウド事業者はいつも遅れて通知を出すだけで、ユーザーはただ祈って救済を求めるしかない状況だ
しかも一部では「技術的にハードキャップ付きアカウントを提供するのは不可能だ」と主張するが、実際には Azure にすでにそういうアカウントが存在する
10年以上 AWS を使ってきたが、サービス間の設計の不連続性と組織内のサイロ化が深刻だった
大きな組織では、KPI を傷つける問題を解決しようとする役員はおらず、その代わりに AI やブロックチェーンのような流行りのサービスを出して昇進ポイントを稼ぐことに集中する
月額 $0、$15、$200 のプランから選べば、想定外のリクエストやデータ転送増加による請求爆発を防げる
AWS 公式ブログへのリンク
関連 HN スレッド
コスト上限を設定しつつサービスの安定性を維持するのは難しいが、この事例で技術的に可能であることが証明された
サービス停止やインフラ障害による評判リスクを避けるためだ
だが問題はクラウドそのものかもしれない。予測可能なコスト構造を必要とする小規模事業者には、クラウドは向いていない可能性がある
こういうことがあまりにも頻繁に起きるので、S3 VPC エンドポイントは VPC 作成時のデフォルトにすべきだと思う
そして NAT ゲートウェイの代わりに fck-nat のような代替を使えば、GB あたりのトラフィック料金を節約できる
デフォルト拒否の状態から明示的にインターネットアクセスを許可すべきで、そうでないと攻撃者にデータを流出させられる
私も似たようなミスをしたことがある
AWS の推薦アルゴリズムにテスト用データをアップロードして忘れていたら、数か月後に銀行から残高不足の通知を受けた
アルゴリズムが動き続けて毎月 1,000 ドル以上請求され、結局5,000 ドルが消えた
毎日残高を確認し、すべての請求メールを重要扱いにしている
そして各サービスごとにバーチャルカードの利用上限を設定する習慣をつけた
私も同じミスで6万ドルを失ったことがある
なぜ S3 エンドポイントがデフォルトでデプロイされないのか理解できない
「なぜ AWS の料金が爆発したのか」とよく聞かれるが、たいていはNAT + S3 + 間違った前提の組み合わせだ
EC2→S3 転送は無料だが、NAT を通ると有料になる
だから私は次のチェックリストを渡している
Cost Anomaly Detection が間に合ったのは幸いだった。1,000 ドルの損失も痛いが、2万ドルよりはましだ
AWS からデータをダウンロードすると GB あたり $0.09 かかると知って驚いた
データをアップロードするときは無料なのに、取り出すにはお金を払うのか?
今回の件は、NAT 設定ミスにより内部転送が外部転送として計算された特殊なケースだ
Amazon はこうしたミスについて返金してくれるのか気になる
VPC NAT Gatewayは悪名高い
以前 Amazon 在籍時に似た問題を経験したが、会社アカウントだったので自分では払わなかった
実際にお金を払わなければならない人たちは本当に気の毒だ
今回の件には直接は役立たないが、AWS は昨日CDN 向けの定額料金プランを開始した
S3 ストレージと帯域幅を含む $0 ティアもある
関連リンク
今後ほかのサービスにも広がることを期待している
私も22歳のとき、初めてインフラを触って2日で300ドルの請求を食らったことがある
AWS は素晴らしいが、初心者にとってはコスト計算があまりにも不透明だ