HeavyUsage とは何か?RDS のリザーブドインスタンス(RI)料金明細をじっくり見て購入余地を探る
コーヒーが好きな emi です。
クラスメソッドのようなリセラー経由の AWS アカウントの場合、各社の料金値引きの仕組みによって Cost Explorer に表示される料金が実際の請求額とずれている場合があります。
それに伴い Savings Plans(SP)や Reserved Instance(RI、予約)画面で表示される 「推奨事項」 が、実際に購入すべき量や金額と異なっている場合があります。
今回は、そんな割引がある環境で、あとどれくらい RDS のリザーブドインスタンス(RI)を購入する余地があるのかを調査するため、明細をじっくり確認してみました。
結論
RDS に関しては以下の行でオンデマンド料金が発生しているので、RI を購入する際は以下の行に注目いただき、表示されているインスタンスタイプを、表示されている利用量(Quantity)分買うのが良いです。
- クラスメソッドメンバーズの Web 明細上では 「RI」 の列に 「R」 がついていないインスタンス
- 月額料金明細では 「reserved_instance」 に 「N」 がついているインスタンス
料金詳細が確認できるものを用意する
クラスメソッドメンバーズのお客様は、クラスメソッドメンバーズポータル(CMP)にログインし、「AWS アカウント」 メニューから料金の明細を見たい AWS アカウントの詳細に遷移してください。「ご利用料金詳細」 をクリックすると、「詳細」 タブでご利用料金の詳細が確認できます。
「サービス毎の内訳」 で 「Amazon Relational Database Service」 にチェックを入れると、RDS の料金詳細が確認できます。
クラスメソッドなどのリセラー経由でない AWS アカウントをお持ちの方は、以下のブログを参考に料金明細をご用意ください。
用語確認
HeavyUsage
HeavyUsage は、購入した RI の時間単位の使用権利を表しています。
料金明細確認
以下のキャプチャはクラスメソッドメンバーズポータル(CMP)の料金明細画面の例です。
APN1-HeavyUsage:db.m5.xl Oracle SE2
まず、APN1-HeavyUsage:db.m5.xl の Oracle SE2 部分に注目してみます。
ポイントの行を抜き出します。
RI | Type | AZ | Description | Quantity | Cost |
---|---|---|---|---|---|
R | APN1-HeavyUsage:db.m5.xl | USD 0.0 hourly fee per Oracle SE2 (License Included), db.m5.xl instance | 672.00 | $0.00 | |
R | APN1-InstanceUsage:db.m5.xl | ap-northeast-1 | Oracle SE2 (License Included), db.m5.xl reserved instance applied | 672.00 | $0.00 |
RI 列に 「R」 とついているのはリザーブドインスタンス(RI)関連の行であることを表しています。
実線で囲まれた行に注目してください。
RI | Type | AZ | Description | Quantity | Cost |
---|---|---|---|---|---|
R | APN1-HeavyUsage:db.m5.xl | USD 0.0 hourly fee per Oracle SE2 (License Included), db.m5.xl instance | 672.00 | $0.00 |
HeavUsage でコストがゼロなので、全額前払い(All Upfront)であることが分かります。ここにコストが発生している場合は以下のどちらかになります。
- 一部前払い(Partial Upfront)
- 前払いなし(No Upfront)
HeavyUsage は購入した RI の時間単位の使用権利を表すものです。
Description には 「USD 0.0 hourly fee per Oracle SE2 (License Included), db.m5.xl instance」 と書いてあります。つまり、「Oracle SE2、db.m5.xl インスタンスあたりの時間料金は 0.0 USD/時間(無料)」 という意味です。
Quantity は使用量を表していて、Description に書かれた使用量を表します。
今回 Description には hourly と書かれており、Quantity には 「672.00」 とかかれています。つまり 「672.00 時間」 分は RI として料金を前払い済みであるということを表しています。
ちなみにこの明細は 2 月のものなので、672時間 = 24 時間 * 28 日 = 1 ヶ月 です。
次に、点線で囲まれた部分に注目してください。
RI | Type | AZ | Description | Quantity | Cost |
---|---|---|---|---|---|
R | APN1-InstanceUsage:db.m5.xl | ap-northeast-1 | Oracle SE2 (License Included), db.m5.xl reserved instance applied | 672.00 | $0.00 |
Type には APN1-InstanceUsage:db.m5.xl と書かれています。Quantity には 「672.00」 と書かれています。
Description の末尾に applied とついているレコードは、RI が適用されたことを表しています。
つまり、先ほどの HeavyUsage で示された RI の時間単位の使用権は、この APN1-InstanceUsage:db.m5.xl レコードで相殺されてゼロになっていることが分かります。
購入した RI の時間分、きっちり RDS を使い切っているケースです。
APN1-HeavyUsage:db.r5.large Aurora MySQL
次は APN1-HeavyUsage:db.r5.large の Aurora MySQL 部分に注目してみます。
ポイントの行を抜き出します。
RI | Type | AZ | Description | Quantity | Cost |
---|---|---|---|---|---|
R | APN1-HeavyUsage:db.r5.large | USD 0.0 hourly fee per Aurora MySQL, db.r5.large instance | 3,360.00 | $0.00 | |
R | APN1-InstanceUsage:db.r5.2xl | ap-northeast-1 | Aurora MySQL, db.r5.large reserved instance applied | 840.00 | $0.00 |
実線で囲まれた行に注目すると、Description には 「USD 0.0 hourly fee per Aurora MySQL, db.r5.large instance」 とあり、「Aurora MySQL、db.r5.large インスタンスあたりの時間料金は 0.0 USD/時間(無料)」 という意味です。
Quantity には 「3,360.00」 とかかれていますので、つまり 「3,360.00 時間」 分は RI として料金を前払い済みであるということを表しています。
この明細は 2 月のものなので、3,360 時間 = 24 時間 * 28 日 * 5 台 で、5 台分の稼働時間であると計算できます。
次に、点線で囲まれた部分に注目すると、Type には APN1-InstanceUsage:db.r5.2xl と書かれています。これは db.r5.2xl というインスタンスの稼働を表します。
Description には 「Aurora MySQL, db.r5.large reserved instance applied」 と書かれており、「Aurora MySQL、db.r5.large インスタンスの RI が適用された」 ことを表します。
db.r5.2xl というインスタンスの稼働に、db.r5.large インスタンスの RI が適用された??
これは一体どういうことなのでしょう??
リザーブドインスタンスのサイズ柔軟性と正規化単位
RDS の RI には 「インスタンスサイズの柔軟性」 があり、インスタンスサイズごとに 「正規化単位」 が設定されています。
インスタンスサイズの柔軟性 とは、同じ AWS リージョン および同じデータベースエンジンの DB インスタンスで割引が柔軟に適用される仕組みです。
今回のケースだと、
- db.r5.large の正規化単位:4
- db.r5.2xlarge の正規化単位:16
であり、db.r5.2xlarge の RI を 1 台購入すれば、db.r5.large 4 台分稼働させた場合にも RI 割引が適用されます。
サイズ柔軟な RDS RI は、そのインスタンスクラスタイプでしか柔軟性を発揮できません。db.r5.large の RI は db.r5.2xlarge には適用できますが、db.r6g.large には適用できないということです。
サイズ柔軟な RDS RI は、以下の RDS データベースエンジンで使用できます。
- RDS for MariaDB
- RDS for MySQL
- RDS for Oracle (Bring-Your-Own-License)
- RDS for PostgreSQL
- Aurora MySQL
- Aurora PostgreSQL
RDS for SQL Server および RDS for Oracle License Included には適用されません。
正規化単位はドキュメントに書かれていますが、以下に引用します。
インスタンスサイズ | シングル AZ 1 時間あたりの正規化された単位 (1 つの DB インスタンスでのデプロイ) | マルチ AZ DB インスタンス 1 時間あたりの正規化された単位 (1 つの DB インスタンスと 1 つのスタンバイによるデプロイ) | マルチ AZ DB クラスター 1 時間あたりの正規化された単位 (1 つの DB インスタンスと 2 つのスタンバイによるデプロイ) |
---|---|---|---|
micro | 0.5 | 1 | 1.5 |
small | 1 | 2 | 3 |
medium | 2 | 4 | 6 |
large | 4 | 8 | 12 |
xlarge | 8 | 16 | 24 |
2xlarge | 16 | 32 | 48 |
4xlarge | 32 | 64 | 96 |
6xlarge | 48 | 96 | 144 |
8xlarge | 64 | 128 | 192 |
10xlarge | 80 | 160 | 240 |
12xlarge | 96 | 192 | 288 |
16xlarge | 128 | 256 | 384 |
24xlarge | 192 | 384 | 576 |
32xlarge | 256 | 512 | 768 |
さて、仕組みが分かったところで再度計算しましょう。
リザーブドインスタンス消費計算
Type | 時間 | 正規化単位 | 補足 | |
---|---|---|---|---|
購入した Aurora MySQL 用 RI | APN1-HeavyUsage:db.r5.large | 3,360.00時間 | 4 | |
確認できる消費 | APN1-InstanceUsage:db.r5.xl | 840.00時間 | 16 | Type より、Single AZ デプロイであることが分かる |
したがって
- 840 時間の db.r5.2xlarge 使用 = 840 × 4 = 3,360 時間分の db.r5.large RI
つまり、3,360 時間分購入した db.r5.large の RI は、840 時間の db.r5.2xlarge の使用によって完全に消費されていることになります。
購入したRIと実際の消費が完全に一致しているため、効率的に RI を活用できていることが分かりました。
APN1-HeavyUsage:db.m5.large SQL Server Web
次は APN1-HeavyUsage:db.m5.large の SQL Server Web 部分に注目してみます。
これは、購入している RI と消費している稼働が全く同じパターンですね。分かりやすいです。
APN1-HeavyUsage:db.r5.xl MySQL
次は APN1-HeavyUsage:db.r5.xl の MySQL 部分に注目してみます。
ポイントの行を抜き出します。
RI | Type | AZ | Description | Quantity | Cost |
---|---|---|---|---|---|
R | APN1-HeavyUsage:db.r5.large | USD 0.0 hourly fee per MySQL, db.r5.xl instance | 672.00 | $0.00 | |
R | APN1-Multi-AZUsage:db.r5.xl | ap-northeast-1 | MySQL, db.r5.xl reserved instance applied | 504.00 | $0.00 |
R | APN1-InstanceUsage:db.r5.large | ap-northeast-1 | MySQL, db.r5.xl reserved instance applied | 672.00 | $0.00 |
実線で囲まれた行に注目すると、Description には 「USD 0.0 hourly fee per MySQL, db.r5.xl instance」 とあり、「MySQL、db.r5.xlarge インスタンスあたりの時間料金は 0.0 USD/時間(無料)」 という意味です。
Quantity には 「672.00」 とかかれていますので、つまり 「672.00 時間」 分は RI として料金を前払い済みであるということを表しています。
この明細は 2 月のものなので、672時間 = 24 時間 * 28 日 = 1 ヶ月 です。
次に、点線で囲まれた部分に注目します。
RI | Type | AZ | Description | Quantity | Cost |
---|---|---|---|---|---|
R | APN1-Multi-AZUsage:db.r5.xl | ap-northeast-1 | MySQL, db.r5.xl reserved instance applied | 504.00 | $0.00 |
R | APN1-InstanceUsage:db.r5.large | ap-northeast-1 | MySQL, db.r5.xl reserved instance applied | 672.00 | $0.00 |
むむ…計算が合いませんね。
まず、APN1-HeavyUsage:db.r5.large で購入した RI が Single AZ 前提であるならば、マルチ AZ の使用は二倍になるはずですから、APN1-Multi-AZUsage:db.r5.xl の 504 時間が相殺できないのでは?と思いました。
Type | 時間 | 正規化単位 | 補足 | |
---|---|---|---|---|
購入した MySQL 用 RI | APN1-HeavyUsage:db.r5.xl | 672.00時間 | 8 | |
確認できる消費 | APN1-Multi-AZUsage:db.r5.xl | 504.00時間 | 16 | Type より、Multi AZ デプロイであることが分かる |
確認できる消費 | APN1-InstanceUsage:db.r5.large | 672.00時間 | 4 | Type より、Single AZ デプロイであることが分かる |
ならば、購入時の APN1-HeavyUsage:db.r5.xl がマルチ AZ 前提だったとしたらどうでしょう?
Type | 時間 | 正規化単位 | 補足 | |
---|---|---|---|---|
購入した MySQL 用 RI | APN1-HeavyUsage:db.r5.xl | 672.00時間 | ★16 | Multi AZ 672 時間分を購入したと仮定 |
確認できる消費 | APN1-Multi-AZUsage:db.r5.xl | 504.00時間 | 16 | Type より、Multi AZ デプロイであることが分かる |
確認できる消費 | APN1-InstanceUsage:db.r5.large | 672.00時間 | 4 | Type より、Single AZ デプロイであることが分かる |
この前提ならば、APN1-Multi-AZUsage:db.r5.xl の 504 時間分を APN1-HeavyUsage:db.r5.xl の 672 時間分から消費できます。
- 672 時間時間分の db.r5.xl RI - 504 時間分の マルチ AZ db.r5.xl = 168 時間
さて、残った 168 時間分の db.r5.xl RI で 672 時間の db.r5.large は相殺できるでしょうか?正規化単位を考慮して計算します。
- 672 時間の db.r5.large 使用 = 672 × 4/16 = 168 時間分の db.r5.xl RI
ぴったりです!!
ということは、この MySQL に関する APN1-HeavyUsage:db.r5.xl の購入はマルチ AZ 前提のものだった模様です。
購入済みの RI がマルチ AZ かどうかが明細から読み取れないかな…と思い、月額料明細を眺めてみたのですが、私が見る限りでは分かりませんでした…
ちなみに AWS アカウントへログインして購入した RI を確認すれば、購入した RI がマルチ AZ かどうか分かります。正しい情報はコンソールで確認してください。
APN1-InstanceUsage:db.m5.large SQL Server SE (LI)
最後に APN1-HeavyUsage:db.r5.xl の MySQL 部分に注目してみます。SQL Server にはサイズ柔軟性は無いので、そこまで複雑な計算にはならないはず…
ポイントの行を抜き出します。
RI | Type | AZ | Description | Quantity | Cost |
---|---|---|---|---|---|
R | APN1-HeavyUsage:db.m5.large | USD 0.0 hourly fee per SQL Server SE (LI), db.m5.large instance | 4,704.00 | $0.00 | |
R | APN1-InstanceUsage:db.m5.large | ap-northeast-1 | SQL Server SE (LI), db.m5.large reserved instance applied | 2,688.00 | $0.00 |
R | APN1-MirrorUsage:db.m5.large | ap-northeast-1 | SQL Server SE (LI), db.m5.large reserved instance applied | 2,016.00 | $0.00 |
APN1-MirrorUsage:db.m5.large | ap-northeast-1 | USD 2.114 per db.m5.large Multi-AZ instance hour (or partial hour) running SQL Server SE (LI) | 672.00 | $1,420.60 | |
APN1-InstanceUsage:db.m5.large | ap-northeast-1 | USD 1.057 per db.m5.large Single-AZ instance hour (or partial hour) running SQL Server SE (LI) | 672.00 | $710.30 |
濃い青緑の実線で囲まれた行に注目すると、Description には 「USD 0.0 hourly fee per SQL Server SE (LI), db.m5.large instance」 とあり、「SQL Server SE (LI)、db.m5.large インスタンスあたりの時間料金は 0.0 USD/時間(無料)」 という意味です。
Quantity には 「4,704.00」 とかかれていますので、つまり 「4,704.00 時間」 分は RI として料金を前払い済みであるということを表しています。
次に、濃い青緑の点線で囲まれた部分に注目します。
RI | Type | AZ | Description | Quantity | Cost |
---|---|---|---|---|---|
R | APN1-InstanceUsage:db.m5.large | ap-northeast-1 | SQL Server SE (LI), db.m5.large reserved instance applied | 2,688.00 | $0.00 |
R | APN1-MirrorUsage:db.m5.large | ap-northeast-1 | SQL Server SE (LI), db.m5.large reserved instance applied | 2,016.00 | $0.00 |
SQL Server の場合、マルチ AZ 構成は MirrorUsage という項目で表されます。
見てみると、トータルの Quantity(時間)の合計は 4,704.00 = 2,688.00 + 2,016.00 と合っているようですが、気になるところがあります。
APN1-HeavyUsage:db.m5.large で購入した RI が Single AZ 前提であるならば、マルチ AZ の使用は二倍になるはずですから、APN1-MirrorUsage:db.m5.large の 2,016 時間を相殺してしまうと APN1-InstanceUsage:db.m5.large が補えないのでは?と思いました。
ならば、購入時の APN1-HeavyUsage:db.m5.large がマルチ AZ 前提だったとしたらどうでしょう?
この前提だとしても、APN1-InstanceUsage:db.m5.large は シングル AZ 構成のはずですから、計算が合いません。
また、赤の点線の部分にも注目してください。
RI | Type | AZ | Description | Quantity | Cost |
---|---|---|---|---|---|
APN1-MirrorUsage:db.m5.large | ap-northeast-1 | USD 2.114 per db.m5.large Multi-AZ instance hour (or partial hour) running SQL Server SE (LI) | 672.00 | $1,420.60 | |
APN1-InstanceUsage:db.m5.large | ap-northeast-1 | USD 1.057 per db.m5.large Single-AZ instance hour (or partial hour) running SQL Server SE (LI) | 672.00 | $710.30 |
これらは RI で相殺できず、オンライン料金が発生してしまっている SQL Server SE (LI) インスタンスです。RI の列に R が入っていないので分かります。(月額料金明細では 「reserved_instance」 に 「N」 がついているものにあたります)
もし購入時の APN1-HeavyUsage:db.m5.large がマルチ AZ 前提だったとしたら、これらも RI の購入金額で相殺できるはずです。でも、実際はオンライン利用料がかかってしまっています。
明細からこれらの計算が合わないのはなぜか読み取れないかな…と思い、月額料明細を眺めてみたところ、以下のことに気づきました。
濃い青緑で網掛けした行に注目してください。
同じ SQL Server SE (LI) の db.m5.large instance に関する RI の購入(APN1-HeavyUsage:db.m5.large)で、以下 2 種類の行が存在します。
- usage_quantity:2,688.00 時間
- usage_quantity:2,016.00 時間
usage_quantity は月額料金明細の 「Quantity」 に当たる項目で、ここでは使用時間を表しています。クラスメソッドメンバーズの Web 上では上記の RI 購入が 1 行にまとめられて以下のように Quantity 4,704.00 となっていました。
RI | Type | AZ | Description | Quantity | Cost |
---|---|---|---|---|---|
R | APN1-HeavyUsage:db.m5.large | USD 0.0 hourly fee per SQL Server SE (LI), db.m5.large instance | 4,704.00 | $0.00 |
実態は 2 行に分かれていることから、以下の予想が導かれます。
- 2,688.00 時間の行は APN1-InstanceUsage:db.m5.large(Single AZ)利用のための RI 購入
- 2,016.00 時間の行は APN1-MirrorUsage:db.m5.large(Multi AZ)利用のための RI 購入
仮に上記の予想が正しければ、すべての計算が合います。
AWS アカウントへログインして購入した RI を確認すれば、購入した RI がマルチ AZ かどうか分かります。正しい情報はコンソールで確認してください。
おわりに
RDS の請求書と明細をじっくり確認し、どのように料金がかかってどのように相殺されているか読み解きました。
RDS に関しては以下の行にはオンデマンド料金が発生しているので、RI を購入する際は以下の行に注目いただければ良いです。
- クラスメソッドメンバーズの Web 明細上では 「RI」 の列に 「R」 がついていないインスタンス
- 月額料金明細では 「reserved_instance」 に 「N」 がついているインスタンス
既に RI が適用済みの行のつじつまが合っているかを確認するのは骨が折れるので、オンデマンド料金が発生しているものに対して RI の購入をご検討いただくと良いです。
今回は RDS に限って調査をしましたが、EC2 など Saving Plans(SP)があるものに関してはまた別途確認が必要です。
本記事への質問やご要望については画面下部のお問い合わせ「DevelopersIO について」からご連絡ください。記事に関してお問い合わせいただけます。
参考