メンバーズ CUR でやってみよう!Savings Plans コミットメント分析編
今回は以下の環境で時間単位での Savings Plans(SP)の使用率とカバー率に加えて、EC2 インスタンスのリソース情報をクラスメソッドが提供するレガシー CUR の仕様に則ったメンバーズ CUR から取得して、コミットメント状況をグラフ化します。
検証環境情報:
- 単一のメンバーアカウント
- アカウント内で複数の EC2 インスタンス(t4g.nano)が稼働
- EC2 Instance Savings Plans(前払いなし)と Compute Savings Plans(全額前払い)を購入
アウトプットイメージ:
事前準備
メンバーズ CUR と Athena での分析環境を準備します。詳細な手順は下記をご確認ください。
- メンバーズ CUR
- Athena 分析環境
CUR でやってみよう
SP 使用率(Utilization)
以下のクエリで CUR から指定した期間での時間単位での SP 使用率を取得します。
SELECT
DATE_FORMAT((line_item_usage_start_date),'%Y-%m-%d %H:%i:%s') as "Time period",
(SUM(savings_plan_used_commitment) / SUM(savings_plan_total_commitment_to_date)) AS Utilization
FROM
${table_name}
WHERE
${date_filter}
AND savings_plan_savings_plan_a_r_n <> ''
AND line_item_line_item_type IN ('Usage', 'SavingsPlanCoveredUsage', 'SavingsPlanRecurringFee', 'SavingsPlanUpfrontFee')
GROUP BY
DATE_FORMAT((line_item_usage_start_date),'%Y-%m-%d %H:%i:%s')
ORDER BY
1;
結果をダウンロードします。
SP カバー率(Coverage)
以下のクエリで CUR から指定した期間での時間単位での SP カバー率を取得します。
with sp as
(Select DATE_FORMAT((line_item_usage_start_date),'%Y-%m-%d %H:%i:%s') as "Time period", line_item_product_code as Service, product_instance_type_family as "Instance family", product_region as Region,
SUM(CASE
WHEN line_item_line_item_type = 'SavingsPlanCoveredUsage' THEN line_item_unblended_cost
ELSE 0
END) AS "Spend covered by Savings Plan",
SUM(CASE
WHEN line_item_line_item_type = 'Usage' THEN line_item_unblended_cost
ELSE 0
END) AS "On-Demand spend"
FROM
${table_name}
WHERE
${date_filter}
AND line_item_line_item_type in ('SavingsPlanCoveredUsage', 'Usage') and line_item_product_code LIKE '%AmazonEC2%' and line_item_usage_type LIKE '%BoxUsage%'
group by
1,2,3,4)
select
"Time period", ("Spend covered by Savings Plan" / ("Spend covered by Savings Plan" + "On-Demand spend")) as Coverage
from sp
order by
1;
結果をダウンロードします。
EC2 リソース利用情報
以下ページのサンプルクエリをベースに CUR から指定した期間での EC2 インスタンスの時間単位での利用情報を取得します。
SELECT
line_item_usage_start_date,
line_item_usage_account_id,
CASE
WHEN (line_item_usage_type LIKE '%SpotUsage%') THEN SPLIT_PART(line_item_usage_type, ':', 2)
ELSE product_instance_type
END AS case_product_instance_type,
CASE
WHEN (savings_plan_savings_plan_a_r_n <> '') THEN 'SavingsPlan'
WHEN (reservation_reservation_a_r_n <> '') THEN 'Reserved'
WHEN (line_item_usage_type LIKE '%Spot%') THEN 'Spot'
ELSE 'OnDemand'
END AS case_purchase_option,
SUM(CASE
WHEN line_item_line_item_type = 'SavingsPlanCoveredUsage' THEN savings_plan_savings_plan_effective_cost
WHEN line_item_line_item_type = 'DiscountedUsage' THEN reservation_effective_cost
WHEN line_item_line_item_type = 'Usage' THEN line_item_unblended_cost
ELSE 0
END) AS sum_amortized_cost,
SUM(line_item_usage_amount) AS sum_line_item_usage_amount
FROM
${table_name}
WHERE
${date_filter}
AND (line_item_product_code = 'AmazonEC2'
AND product_servicecode <> 'AWSDataTransfer'
AND line_item_operation LIKE '%RunInstances%'
AND line_item_usage_type NOT LIKE '%DataXfer%'
)
AND (line_item_line_item_type = 'Usage'
OR (line_item_line_item_type = 'SavingsPlanCoveredUsage')
OR (line_item_line_item_type = 'DiscountedUsage')
)
AND product_capacitystatus != 'AllocatedCapacityReservation'
GROUP BY
1,2,3,4
ORDER BY
1;
結果をダウンロードします。
データ整形とグラフ作成
グラフ化する方法はいくつか考えられますが、馴染みのある Excel を使用します。
他にも以下のような方法も面白いかと思います。
Excel でのグラフ作成の作業は割愛します。最終的に冒頭で紹介したグラフが出来ました。
現状分析
作成したグラフとデータから現在のリソースと SP コミットメントの推移を考察します。
期間 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
日付 | 7/1-7/18 | 7/18-7/25 | 7/25-7/29 | 7/29-7/30 | 7/30-7/31 |
OnDemand 利用費 | $0.0054 | $0.0108 | $0.0054 | $0 | $0 |
SavingsPlan 適用額 | $0.0034 | $0.0034 | $0.0074 | $0.0074 | $0.0034 |
(インスタンス個数) | 2 | 3 | 3 | 2 | 1 |
使用率(Utilization) | 100% | 100% | 100% | 100% | 50% |
カバー率(Coverage) | 50% | 33% | 66% | 100% | 100% |
- 期間1 で OnDemand が$0.0054 分、SP が $0.0034 分のリソースが稼働
- 実際には EC2(t4g.nano)が2つ稼働しており、1つ分の EC2 SP を購入している状態
- 期間2 で OnDemand が増加したため SP カバー率が低下
- EC2(t4g.nano)を1つ追加
- 期間3 で $0.004 分 SP 追加
- EC2(t4g.nano) 向けの Compute SP を購入
- 期間4 でリソースに変更があり SP で全リソースをカバーする状態
- 期間5 でさらにリソースが減少したことで SP に余剰が発生し使用率が低下
このケースは7月終了時点では購入した SP に余剰が発生しているため、これ以上の追加購入検討より関係者へエスカレーションして、特に期間5のリソース変更に関する状況と対応方針の確認がネクストアクションとして想定されます。
また実際の追加購入ケースであれば、期間1-2 においてワークロードのリソース変動サイクルに合わせた期間で評価を行い SP 購入を検討するアプローチが取られるのではないかと思います。
AI 分析
ここまでデータが揃ったなら手作業でグラフ化と分析するよりも Claude Code で分析してもらえるのでは?と思ったので、やってみます。
まず何も考えずに、取得した1ヶ月分のデータを読み込ませたらトークン制限により不完全な結果となりました。
ファイルサイズが大きく(54,908トークン)、制限により全データ読み込み不可
工夫することでクリアできるかもしれませんが...
今回の主題ではないので 1日分に限定したデータを作成し、再度実行します。
> /User/xxx/desktopにあるsp-coverage_1hour.csvとsp-utilization_1hour.csvとec2-hours-a-day_1hour.csvのファイルを利用してカバー率を80%を目標、EC2 Savings Plans
が優先、1年前払いなし、東京リージョンでの購入を前提としたSavingsPlansの時間単位での追加コミットメント額の購入推奨事項を提案してください。
コスト効果分析(1年No Upfront)
現在のコスト構造(24時間)
- SP適用: 24時間 × $0.0034 = $0.0816
- OnDemand: 24時間 × $0.0054 = $0.1296
- 日次総コスト: $0.2112
80%カバー率達成後の推定コスト
- 既存SP: 24時間 × $0.0034 = $0.0816
- 追加SP: 24時間 × $0.00204 = $0.04896
- 残存OnDemand: 24時間 × $0.00216 = $0.05184
- 日次総コスト: $0.18240
削減効果
- 日次削減額: $0.0288
- 削減率: 13.6%
- 年間削減額: $10.51
EC2 Instance Savings Plans の利点
1年No Upfrontの特徴
1. 初期費用不要: 前払い金額なし
2. キャッシュフロー改善: 月次支払い
3. 柔軟性: t4gファミリー内での変更可能
4. 高割引率: EC2 Instance SPは最大の割引率を提供
リスク評価
- 低リスク: 24時間の安定使用パターン確認済み
- 高利用率: 既存SP利用率100%
- 予測可能: t4g.nanoへの集中使用
実装推奨事項
推奨アクション
1. EC2 Instance Savings Plans購入
- インスタンスファミリー: t4g
- リージョン: ap-northeast-1(東京)
- コミットメント: 0.6インスタンス/時間
- 期間: 1年
- 支払い: No Upfront
2. 時間単位コミットメント額: $0.00204/時間
監視項目
- SPカバー率: 50% → 80%達成確認
- SP利用率: 100%維持
- 月次コスト削減: 約$0.86削減
最終推奨
推奨コミットメント: $0.00204/時間のEC2 Instance Savings Plans(1年、No Upfront)
期待効果:
- カバー率向上: 50% → 80%
- 年間コスト削減: $10.51
- 初期投資: $0(No Upfront)
この推奨により、前払いなしで確実なコスト削減効果を実現できます。
限定的なデータでの結果ではありますが、期待した結果を提案してくれました。
初回から期待した結果は得られず途中計算に誤りがあるなど、何度かやり直しました。記述したプロンプトにも多いに課題がありますが、他での生成 AI 活用と同じく全てを鵜呑みにするのではなく支援として利用するのが安全そうです。
さいごに
今回は特定サービス(EC2)かつインスタンスタイプ(t4g.nanoのみ)で24時間稼働の変動がないというシンプル環境のため、ここまでしなくても現状理解や購入検討が可能ではありますが、実際にはもっと複雑な状況が想定されるため、数値や視覚化することは SP 管理や購入対応に有効なのではないかなと思います。
従来であれば購入アナライザーや推奨事項をベースに購入することが定石ですが諸般の事情で別の手段で実施されたい場合などで一助となれば幸いです。
参考情報
- https://docs.aws.amazon.com/ja_jp/cur/latest/userguide/table-dictionary-cur2-savings-plan.html
- https://docs.aws.amazon.com/ja_jp/cur/latest/userguide/cur-sp.html
- https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AWS-CostAndUsageReports_1031_v1.pdf
- https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2025_SavingsPlans_0430_v1.pdf
- https://catalog.workshops.aws/well-architected-cost-optimization/en-US/2-expenditure-and-usage-awareness/70-cost-and-usage-analysis-sql/cur-analysis
- https://catalog.workshops.aws/cur-query-library/en-US