Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

予期せぬコスト予測オーバーの要因をAWS Cost Explorerで調査してみた

「コスト予測オーバー190%!?」
これは月初に鳴り響いたAWS BudgetsアラートをAWS Cost Explorerで調査した奮闘録である。
※実際の出来事を脚色してお送りしております。

コスト予測オーバー

とある月初めのこと。AWS Budgetsアラートの通知先Slackチャンネルに通知が届きました。通知の内容を見て私は驚愕します。なんと、予測金額が予算設定していた金額の190%を超えると表示されているのです。
AWSは従量課金なので、実際に利用を開始してみないと支払い金額はわかりません。とはいえ、まったく金額感がわからない状態では計画を立てることができないので、利用するリソースのサイジングを行い、平常運転を行っていればどれくらいの料金になるか見積もるのが一般的です。
このプロジェクトでも、AWS Pricing Calculatorを使い予算を見積もっていて、ある程度バッファをもった金額をAWS Budgetsアラートの閾値に設定していました。

ブログ記事でもAWS Budgetsアラートの設定方法を紹介しているので、まだ利用していない方はご参照ください。

AWS Cost Explorerを使って利用状況を分析する

これまで定期的にコストの見積直しをおこなってきていたので、予測金額が予算設定以上になることはありませんでした。想定外のサービス利用が発生していないかを確認するために、私はAWS Cost Explorerにアクセスしました。

AWS Cost ExplorerはAWSのコストをグラフ化して分析できるサービスです。サービスやインスタンスタイプなど、細かな条件を指定してグラフ化ことができ、利用傾向や異常がないかを分析するのに役立ちます。

AWS Cost ExplorerへはAWSマネジメントコンソールの請求ダッシュボードのメニューや、サービス検索バーからアクセスできますが、今回はAWS Budgetsに設定した予算の詳細ページにあるグラフの「AWS Cost Explorerで表示」からアクセスしました。AWS Budgetsから移動することで、アラートに利用している条件でグラフが表示されます。

月別のコストがグラフ化されているので、このままだとコスト予測オーバーの原因を調査することはできません。
直近のデータに絞って詳細にグラフ化するために、レポートパラメータの「日付範囲」を月初めから当日までに変更し、「粒度」を日別に変更します。

AWS Budgetsから遷移したコストグラフ

グラフからは、1日に大きな費用が発生していることがわかりました。

なお、コストデータが反映されるのは24時間以上かかります。このため、当日の費用は0USDになっており、前日の費用も途中までしか計上されていないことにご注意ください。
つまり、AWS Cost Explorerや、AWS Budgetsアラートを使ってコスト監視していても、実際にリソース利用開始してから2日ほど経たないと検知できないということになります。

RI一部前払いコストの除外

1日に発生しているコストには心当たりがあります。
このアカウントではEC2とRDSのリザーブドインスタンス(RI)を毎年3/1に購入しています。
RIの購入形態は、一部前払いにしているので、購入操作をしたタイミングで前払いコストが記録されます。

コスト見積するときに、RIの前払いコストを月ごとのランニングコストとは別で計算しており、AWS Budgetsに設定してた予算閾値は、前払いコストの含まれない金額でした。
前払費用を除外した金額で計算すれば、予算内に収まるはずです。
AWS Cost Explorerのグラフで確認するには、レポートパラメータの「料金タイプ」から「前払いの予約料金」を除外すればいいだけです。

AWS Budgetsから遷移したグラフの料金タイプ

すでに「前払いの予約料金」が含まれていないグラフだった!!!!

AWS Cost Explorerでは「除く」条件が設定できますが、AWS Budgetsでは「含める」条件でしか設定ができません。AWS Budgetsに設定してある条件は次のとおりでした。

AWS Budgetsに設定された料金タイプ

すでに「前払いの予約料金」は除外されてた状態でコスト予測オーバーのアラートとなっており、1日のコスト発生はRIの前払いコストが原因ではありませんでした。

RI月額コストの計上タイミングは月初になる

次に疑わしいと考えたのは、RI月額コストの計上タイミングです。
RIを一部前払いまたは前払いなしで購入した場合、月額コストにRIコストが発生します。
RIはインスタンスの利用予約なので、実際に購入したRIのインスタンスタイプを稼働させていなくても固定でコストが計上します。
RI料金は月初にまとめて1か月分の課金がおこなわれ、以後RIが割り当てられたインスタンスの稼働に料金は発生しません。

RI費用だけにしたグラフ

試しに範囲を別の月に変更し、料金タイプを「定期的な予約料金」のみにしてみると、1日にしかRI料金が発生していないことがグラフでわかります。

このようなRIの月額コスト計上タイミングにより、月初めは予測金額が引っ張られて高くなっているのではないだろうか...

しかしこの疑念はすぐに払拭されます。なぜなら、この仮説が正しいなら毎月月初めにコスト予測アラートが発生するはずだからです。
AWS BudgetsやAWS Cost Explorerの予測は月初に発生するRI料金を適切に均して計算されているようです。

RIの適用状況を確認する

こうなると想定外のインスタンス利用が発生していることが予想されます。しかし、稼働中のインスタンス一覧ではすべて想定通りのインスタンスタイプが設定されていて、意図しないインスタンスが稼働しているということもありませんでした。

次に、購入したRIに誤りがあり、オンデマンド料金でインスタンスが稼働している可能性を調査しました。

RIの利用状況を確認するには、AWS Cost Explorerと同じく、AWSコスト管理 (cost-management) にある使用状況レポートカバレッジレポートを使います。

まずは、左ツリーメニューの「予約」から使用状況レポートを選択します。
使用状況レポートではアカウントで購入したRIの使用状況をパーセンテージでグラフ化してくれます。
使用状況内訳には購入したRIのインスタンスタイプやプラットフォームごとに詳細な使用状況を確認できます。

もし誤ったRIを購入していた場合、使用状況の割合が下がってしまっているはずですが、購入したRIはすべて100%利用されている状態でした。

カバレッジレポートは稼働しているインスタンスのうち、RIが適用されている割合を確認できる機能です。
使用状況レポートで使用率100%になっていたので、カバレッジが前月より低下している場合、購入するRIの数が足りていないか、想定外のインスタンス稼働が発生していることになります。
先ほど想定外のインスタンスが起動していないかをインスタンス一覧から確認しましたが、インスタンス数が多い場合や、全体の傾向を確認するにはこちらのレポートを利用することで簡単に確認できます。

カバレッジについても、RI購入の前後で割合に変化はなく、購入するRIを誤ったために余計な費用が発生しているということはありませんでした。

見積ツールの金額には税金が含まれない

ここまでで、予測金額アラートがRI費用や想定外のインスタンス起動が原因で発生しているわけではないことがわかりました。
次にどのサービスの利用料金上昇が影響しているかを調べてみます。

AWS Cost Explorerのレポートパラメータにある「グループ化の条件」でディメンションを「サービス」に設定することで、どのサービスにいくらかかっているかの内訳をグラフ化できます。わかりやすいようにグラフのスタイルを積み上げ棒グラフにしてみましょう。

サービスごとにグループ化したグラフ

RIの費用が月初に計上されるため、EC2やRDSの費用が多くなるのは前述の調査のとおりです。 その他のサービスですと、Taxの割合が非常に大きくなっていることがわかります。

ここでようやく予測オーバーアラートの要因を掴むことできました。
Tax(税金)はRIの前払い料金を含むAWSへの支払い金額合計にたいして課されます。
RIを一部前払いで購入した日のTaxが爆増したため、前払い料金を含まないランニング費用の予測閾値をオーバーしてしまっていたことがわかりました。

前述のとおり、RIの前払いコストと月額ランニングコストは別見積にしており、前払い料金の税金はそちらで前払いの見積のほうで管理しています。
どうやら、トータルの予算をオーバーするようなことはなさそうということがわかり、ホッと一安心です。
とはいえ、前払い料金の税金分がプラスされただけで、見積もっていたランニング費用の予算の2倍近くになってしまうものだろうか。
そんな疑問があり、見積ツールの金額と税金の関係をしらべてみたところ、見積ツールで算出される金額にはTaxは含まれていないことがわかりました。
一方でAWS Budgetsで監視しているコストにはTaxが含まれていたため、前払い料金のような大きな出費が発生したタイミングで今回のような予測アラートが発生していたのだとわかりました。

AWS Budgetsの設定で、予算の範囲から「税金」を抜くことで、予測アラートが無事に予算内に収まるようになりました。

AWS Budgets設定の料金タイプからTaxを除く

コスト予測が予算内に収まった

Taxと同様に気を付けたいコスト項目

Taxと同様にRIの前払い料金を含むAWSへの支払金額合計に対して課せられる項目として、AWSサポートが存在します。
はじめてRIを購入したときに、前払い料金へのサポート費用は前払い料金の費用請求書に乗ると勘違いしており、月額ランニングコストのサポート費用が爆増して焦ったことがあります。

AWSサポート費用は、AWSの利用金額が一定料金に満たない場合は固定金額で、超えた場合は合計金額への割合で算出というように計算されます。
部分的なスペック変更の見積をするときなどに、見積ツールで設定し忘れしやすい項目ですので注意しましょう。

まとめ

ここまでのコストに関するTips

  • 見積ツールの金額にはTaxは含まれない
  • RIの費用は全額月初に計上されるが、AWS Budgetsの予測金額は適切に均してくれる
  • TaxやサポートはRIの前払い料金を含むAWSへの支払金額合計に加算されるので、RI購入日にまとめて計上される

今回は結果として問題のない見積予算オーバーでしたが、早期に発見して対処できるような監視をしておいてよかったと実感できる体験でした。
予算アラートを受け取ったときは、まずいことが起こっているのではないかと胃が痛くなりましたが、AWSから提供されている各種コスト管理ツールを活用することで、原因調査を簡単におこなうことができました。
AWS Cost Explorerは直感的にコスト分析ができるツールとなっており、今回紹介した分析以外にもいろいろな角度でアカウント利用状況を確認することができるので、ぜひ試しにレポートパラメータをいじってオリジナルのレポートを作成してみてください。