メンバーズ CUR でやってみよう!Savings Plans 使用率(Utilization)&カバー率(Coverage)編
今回は以下の環境で Savings Plans(SP)の使用率とカバー率をクラスメソッドが提供するレガシー CUR の仕様に則ったメンバーズ CUR で算出していきます。
検証環境情報:
- メンバーアカウントで複数の EC2 インスタンス(t4g.nano)が稼働
- EC2 Instance Savings Plans(前払いなし)と Compute Savings Plans(全額前払い)を購入
- 一括請求(管理アカウント x1、メンバーアカウント x2)
事前準備
メンバーズ CUR と Athena での分析環境準備します。詳細な手順は下記をご確認ください。
- メンバーズ CUR
- Athena 分析環境
CUR でやってみよう
メンバーズ CUR 及び Athena での分析環境が準備できたら、早速やっていきましょう。
今回 CUR から取得した値の妥当性は AWS マネジメントコンソールで表示される値と比べることで確認していきます。
SP 使用率(Utilization)
以下のレポートの内訳に表示される内容を CUR から指定した期間での SP 使用率を取得します。
SELECT
SPLIT_PART(savings_plan_savings_plan_a_r_n, '/', 2) AS "Savings Plan ID",
savings_plan_offering_type as Type,
savings_plan_instance_type_family as "Instance family",
savings_plan_region as Region,
TRY_CAST(((SUM(TRY_CAST(savings_plan_used_commitment AS DECIMAL(16, 8))) / SUM(TRY_CAST(savings_plan_total_commitment_to_date AS DECIMAL(16, 8)))) * 100) AS DECIMAL(3, 0)) AS Utilization,
SUM(TRY_CAST(savings_plan_total_commitment_to_date AS DECIMAL(16, 4))) as "Total commitment",
SUM(TRY_CAST(savings_plan_used_commitment AS DECIMAL(16, 4))) as "Used commitment",
SUM(TRY_CAST(line_item_unblended_cost - savings_plan_savings_plan_effective_cost AS DECIMAL(16, 4))) AS "Net savings"
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
1,2,3,4
ORDER BY
1;
-
管理アカウント - CUR から取得(7/1 - 7/26)
-
管理アカウント - マネジメントコンソール(7/1 - 7/26)
-
メンバーアカウント - CUR から取得(7/1 - 7/26)
-
メンバーアカウント - マネジメントコンソール(7/1 - 7/26)
取得出来ました。
SP カバー率(Coverage)
続いては、以下のレポートの内訳に表示される内容を CUR から指定した期間での EC2 に対するカバー率を取得します。
with sp as
(Select 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 TRY_CAST(line_item_unblended_cost AS DECIMAL(16, 8))
ELSE 0
END) AS "Spend covered by Savings Plan",
SUM(CASE
WHEN line_item_line_item_type = 'Usage' THEN TRY_CAST(line_item_unblended_cost AS DECIMAL(16, 8))
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)
select *,
TRY_CAST(("Spend covered by Savings Plan" / ("Spend covered by Savings Plan" + "On-Demand spend"))*100 AS DECIMAL(3, 0)) as Coverage
from sp;
-
管理アカウント - CUR から取得(7/1 - 7/26)
-
管理アカウント - マネジメントコンソール(7/1 - 7/26)
-
メンバーアカウント - CUR から取得(7/1 - 7/26)
-
メンバーアカウント - マネジメントコンソール(7/1 - 7/26)
ほぼ等しい値を取得することが出来ました。
SP インベントリ
せっかくなのでインベントリ情報も CUR で取得してみます。
SELECT
SPLIT_PART(savings_plan_savings_plan_a_r_n, '/', 2) AS "Savings Plan ID",
savings_plan_offering_type as Type,
savings_plan_instance_type_family as "Instance family",
savings_plan_region as Region,
savings_plan_total_commitment_to_date as "Commitment ($ per hour)",
DATE_FORMAT(FROM_ISO8601_TIMESTAMP(savings_plan_start_time),'%Y-%m-%d %H:%i:%s') AS Start_date,
DATE_FORMAT(FROM_ISO8601_TIMESTAMP(savings_plan_end_time),'%Y-%m-%d %H:%i:%s') AS End_date
FROM
${table_name}
WHERE
${date_filter}
AND savings_plan_savings_plan_a_r_n <> ''
AND line_item_line_item_type = 'SavingsPlanRecurringFee'
GROUP BY
1,2,3,4,5,6,7
ORDER BY
1;
-
管理アカウント - CUR から取得
-
管理アカウント - マネジメントコンソール
-
メンバーアカウント - CUR から取得
-
メンバーアカウント - マネジメントコンソール
こちらも良い感じの値が取得出来ました。
さいごに
今回、普段はマネジメントコンソールから確認することが多い SP 使用率とカバレッジに関する情報をメンバーズ CUR から取得しました。
冒頭にも記載した通り手元にある環境の特定パターンでの確認ではありますが、ほぼ再現出来たといっても良さそうです。マネジメントコンソールが利用できない場合や CUR をベースにした別ツールで可視化したい場合等では利用出来そうです。
参考情報
- 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://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