AWS の請求が突然跳ね上がる理由 — よくある 7 つの原因

予期しない AWS コスト増加が取る 7 つの形、それぞれが Cost Explorer でどう見えるか、そして再発する前に突き止める方法を整理します。

前月比 30% の AWS 請求増には、たいていその中に隠れた単一の原因が あります。難しいのは、AWS がデータを切り分けるための軸を十数個も 与えてくること ── サービス、使用タイプ、リージョン、アカウント、 タグ ── そして急増が、最初に試した軸できれいに現れることはまれだ という点です。本稿では、私たちが見てきた請求急増インシデントの 大半を占める 7 つの原因、それぞれが Cost Explorer に残す特徴、そして 最初に切り分けるべき軸をたどります。

1. NAT ゲートウェイのデータ処理

NAT ゲートウェイは、定額の時間料金に加えて GB あたりのデータ処理 料金を課します。時間料金は小さく安定していますが、新しいワーク ロードが VPC の外からイメージ、モデル、バックアップを引き込み始める と、データ処理料金が音もなく 10 倍になることがあります。よくある パターンはこうです。Kubernetes のノードプールがスケールアップし、 新しい Pod ごとに 500 MB のコンテナイメージを NAT ゲートウェイ経由 で引き込み、請求が静かに膨らんでいきます。

Cost Explorer の特徴 — EC2-Other の使用タイプで、内訳に NatGateway-Bytes が含まれます。Service 列は VPC ではなく EC2 に なります。

対処 — VPC エンドポイント (S3 と DynamoDB は Gateway、それ以外は Interface) は NAT を完全に迂回します。コンテナレジストリ (ECR) には 専用の Interface エンドポイントがあり、ある程度の規模でイメージを 引き込むなら数日で元が取れます。

2. AZ 間データ転送

同一リージョン内でアベイラビリティーゾーン (AZ) 間を 1 GB 移動させる 価格は、多くの場合まったく別のリージョンへ移すのと同じ ── 方向ごと に GB あたり $0.01 です。マルチ AZ の回復力を念頭に設計するエンジニア は、AZ 境界をまたぐすべてのリクエストが双方向で課金されることを しばしば見落とします。ゾーン認識ルーティング (zone-aware routing) の ないおしゃべりなマイクロサービスメッシュは、単一リージョン内でも 4 桁の月次転送料金を生み出しかねません。

Cost Explorer の特徴 — EC2-Other または特定サービスの料金で、 使用タイプに DataTransfer-Regional-Bytes または InterZone-Out が 含まれます。

対処 — サービスメッシュ (Istio、Linkerd、App Mesh) でトポロジー 認識ルーティングを有効にするか、読み取りがローカル AZ のレプリカに 当たるようにクライアント認識のパーティショニングを設定します。1 日 あたりの AZ 間バイトをグラフ化して確認してください。

3. CloudWatch Logs の取り込み

CloudWatch Logs は保存された GB ではなく取り込まれた GB あたりで課金 され、取り込み価格 ($0.50/GB) は保存価格 ($0.03/GB) の 10 倍を超え ます。負荷時に追加されたデバッグレベルのログ文 1 つが 1 時間あたり 数ギガバイトを生み出すことがあり、コストは急速にせり上がります。

Cost Explorer の特徴 — AmazonCloudWatch で、DataProcessing-Bytes または Storage-ByteHrs が含まれます。使用列がロググループ名を表示 するのは、リソースレベルのグループ化を有効にした場合だけです。

対処 — デバッグログの行を削除するか、サンプリングフィルタを 通します。大量の構造化ログには、同じ保持期間に対して Kinesis Firehose 経由で S3 に直接書き出すほうが 90% 安いことが多いです。

4. 終了したインスタンスから切り離された EBS ボリューム

EC2 インスタンスを終了すると、ブートボリュームはデフォルトで一緒に 消えますが、追加でアタッチしたボリュームは消えません。時間が経つに つれ、切り離されたボリュームが積み上がります。個々には安い (gp3 で GB 月あたり $0.08) のですが、数は単調に増え、後始末を誰も引き受け ません。

Cost Explorer の特徴 — EC2-Other、EBS:VolumeUsage.gp3 (または gp2) で、インスタンス時間に連動しないまま日次コストが着実に上昇 します。

対処 — AWS Config ルール ebs-snapshot-public-restorable-check に加えて、30 日以上切り離されたボリュームを自動削除する Lambda を 用意します。手動なら、EBS ボリュームのコンソールを state = available で並べ替え、最後のアタッチ時刻を確認します。

5. CloudFront のキャッシュミス

CloudFront の料金は 2 つの要素から成ります。ユーザーへ出ていく帯域幅 と、HTTP リクエストです。キャッシュヒットはエッジから配信し、帯域幅 だけを支払います。キャッシュミスはオリジンから配信し、帯域幅に 加え て オリジンの egress を支払います。設定を誤ったキャッシュ (24 時間で あるべき TTL が 60 秒、あるいは正規化すべきクエリ文字列に敏感な キャッシュキー) は、エンドユーザー体験を変えずに 10 倍のコスト差を 生み出しかねません。

Cost Explorer の特徴 — Amazon CloudFront のコストが、オリジン (S3、ALB、または EC2) の DataTransfer-Out と歩調を合わせて上昇します。 この 2 つの数字は一緒に動くべきではありません。一緒に動くなら、 キャッシュはほとんど機能していません。

対処 — ディストリビューションのレポートタブで CloudFront の キャッシュヒット率を確認します。80% 未満は問題、50% 未満はキャッシュ が壊れています。キャッシュキーを見てください。クエリ文字列、ヘッダー、 Cookie は過剰に含めがちです。

6. リージョンをまたぐ API Gateway / Lambda の設定ミス

対象リソースと別のリージョンから呼び出される Lambda は、Lambda の 呼び出しコストに加えてリージョン間データ転送を支払います。よくある 形はこうです。us-east-1 にデプロイされた関数が eu-west-1 の DynamoDB テーブルを呼び出す ── 移行中に誰かがテーブルの ARN の更新を忘れた ためです。呼び出しのたびにリクエストとレスポンスのバイトが大西洋を 渡ります。

Cost Explorer の特徴 — 本来は片方のリージョンだけがアクティブな はずなのに、DataTransfer-Out-Bytes が両方のリージョンにほぼ同量で 現れます。

対処 — スタックにリージョンタグを付け、定期的に監査します。 リージョンをまたいで通信するものはすべて明示的かつ意図的であるべきで (グローバルレプリケーション、ディザスタリカバリのテスト)、決して 偶発的であってはなりません。

7. トライアル期間またはマーケットプレイスの期限切れ

AWS Marketplace のサブスクリプションとリザーブドインスタンスの割引 は、どちらも暦の境目、通常は月末に期限切れになります。その翌日、 基盤となるリソースにオンデマンドのレートが適用されます。インスタンス 数も使用プロファイルも前月とまったく同じに見えます ── 変わったのは レートだけです。

Cost Explorer の特徴 — 同じサービス、同じインスタンスタイプ、 同じ時間なのに、Pricing の単位あたりコストが跳ね上がります。コスト と使用量の列で両方の明細を並べて表示すると見つけやすくなります。

対処 — 単なる絶対額ではなく、単位あたりコストの乖離で通知する Cost Explorer の予算を設定します。RI については、Trusted Advisor の 予約期限切れチェックが 2 週間前にこれを捕捉します。

まとめ

特定の急増については、最も頻繁に効く診断の順序はこうです。まず サービスでグループ化し、次に最上位の寄与要因の中で使用タイプ、続いて 連結アカウントまたはタグでグループ化します。急増のほとんどは使用 タイプのレベルで解決します。そうでない場合、問題はたいてい #6 (リージョン間) か #5 (キャッシュ設定) で、コストデータではなくリクエスト レベルのデータを見る必要があります。

この作業を定期的に行っているなら、AWS Billing Analyzer が Cost Explorer の CSV エクス ポートを受け取り、上記の 7 つのパターンを、それぞれの最悪の要因と ともに直接浮かび上がらせます。完全にブラウザ内で動作します ── CSV は あなたのマシンを離れません。ファイルにはアカウント ID やリソース ARN が含まれており、通常それらを第三者のサイトにアップロードしたくない ので、これは重要です。