/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

AWS Cost Categoriesの按分(Split Charge)で使用量ベースの配分ができない時の対処法

AWS Cost CategoriesのSplit Charge Rulesとは

マルチプロダクトやマルチチームで共有しているAWSリソース(RDS、NAT Gateway、サポートプランなど)のコストを、各プロダクトやチームに按分したいというのはよくある話だと思います。

AWS Cost Categoriesには「Split Charge Rules」という機能があって、これを使うと共有コストを複数のコストカテゴリ値に分配できます。

設定できる方式は三つです。

方式 内容
Even Split 対象に均等割り
Fixed 手動で比率を指定(合計100%)
Proportional 按分対象として指定したカテゴリ値の既存コスト比率で按分

Proportionalを使っても「使用量比率」にはならない

調べてたら分かったんですよね。Proportionalというのは「使用量に比例する」ではなく「按分対象のカテゴリ値に既に計上されているコストの比率に比例する」という意味なんです。

たとえば按分ターゲットに指定したプロダクトAのコストが60%、プロダクトBが40%であれば、共有RDSのコストもその6:4で按分される、という動きになります。

実態としてプロダクトAがRDSを9割使っていたとしても、各カテゴリのコスト比率が反映されるだけなのでズレが生じます。「プロダクトごとのクエリ数やコネクション数に応じて按分したい」といったケースには対応できません。

按分結果がCost ExplorerやCURに出ない制約もある

もうひとつ引っかかったのが、Split Chargeの按分結果はCost Categoriesのビューでしか確認できない、という点です。

Cost ExplorerやCUR(Cost and Usage Report)には按分後のコストが反映されません。つまり「按分結果を使ってBudgetsのアラートを設定する」「按分後のコストでCost Explorerのダッシュボードを作る」「CURのデータで独自レポートを組む」といったことができないです。

按分はしてくれるけど、その結果を活用する導線が閉じているのが厄介なところです。

使用量ベースで按分したいなら別の手段が必要

現状、使用量メトリクスを使って動的に按分するには、Cost Categoriesだけでは完結しないです。

CUR + Athenaで自前ロジックを組む

CUR(Cost and Usage Report)をS3に出力してAthenaでクエリを書くのが、柔軟性が一番高いやり方です。たとえばRDSのコストを按分する場合、CloudWatchやRDSのデータベースログから各サービスのコネクション数やクエリ数を別途取得しておいて、Athenaで結合して按分比率を計算する、というイメージになります。

Athenaで按分を計算する場合のクエリのイメージはこんな感じです。

WITH usage AS (
  SELECT
    product_name,
    SUM(query_count) AS queries
  FROM usage_metrics
  GROUP BY product_name
),
total AS (
  SELECT SUM(queries) AS total_queries FROM usage
),
shared_cost AS (
  -- チャージバック用途では line_item_unblended_cost の方が適切な場合あり
  SELECT SUM(line_item_unblended_cost) AS cost
  FROM cur_data
  WHERE resource_tags_user_component = 'shared-rds'
)
SELECT
  u.product_name,
  u.queries / t.total_queries AS ratio,
  u.queries / t.total_queries * s.cost AS allocated_cost
FROM usage u, total t, shared_cost s

自前でメトリクスを持ってくる必要があるので手間はかかりますが、任意のロジックで按分できます。

なお、CURのコスト列は blended_cost(一括請求割引を混合した値)と unblended_cost(実際の課金額)がありますが、チャージバックや按分用途では unblended_cost 系を使うのが一般的です。

ECS / EKSならSplit Cost Allocation Dataが使える

ECSとEKSに限定されますが、「Split Cost Allocation Data」という機能があって、これはコンテナレベルの使用量(CPU、メモリ)をもとにEC2インスタンスやFargateのコストを自動的に按分してくれます。

有効化は2段階です。まずAWS Cost Management preferencesでSplit Cost Allocation Dataをオプトインし、そのうえでData Exports(CUR 2.0)の設定でも有効化する必要があります。片方だけだとデータが出てこないので注意です。

対象リソースがECS/EKSであればこちらを使うのがシンプルです。

手動比率で割り切るケースも現実的

使用量の実態が大きく変わらないプロダクト構成であれば、Fixedで手動比率を設定しておいて、四半期に一回レビューして更新するというやり方も現実的な選択肢です。精度と運用コストのトレードオフで判断するのがいいと思います。

まとめ

  • Cost CategoriesのSplit Charge Rulesには Even Split / Fixed / Proportional の三方式がある
  • Proportionalは使用量比率ではなく既存コスト比率での按分
  • 使用量メトリクスを使った動的按分はCost Categoriesでは対応していない
  • 按分結果はCost Categoriesビューのみで確認可能(Cost Explorer / CUR / Budgetsには非反映)
  • 使用量ベースの按分が必要なら CUR + Athena で自前実装、ECS/EKSなら Split Cost Allocation Data

共有RDSのコスト按分をやろうとしてちょっと詰まったんですが、Cost Categoriesの守備範囲を把握しておくと設計の判断が早くなりそうです。

参考