本日も乙

ただの自己満足な備忘録。

DynamoDBリザーブドキャパシティを正しく理解する

Amazon DynamoDB(以下、DynamoDB)のコストを下げる手段としてリザーブドキャパシティが有効です。リザーブドキャパシティはEC2 リザーブドインスタンスと同じように前払いによるコミットメントをすることによって割引で利用できる料金オプションです。

しかし、DynamoDB の料金表がわかりづらく、どのぐらいの量(ユニット)を購入し、どのぐらいの料金が発生するかが見えてきません。何故かリザーブドインスタンスのように情報が多く出回っていないため、実際に購入して落とし穴にハマることも少なくありません。私も最近リザーブドキャパシティを購入し、ようやく理解ができてきました。

本記事は意外と見落とされがちな DynamoDB のリザーブドキャパシティについて理解を深めるための記事です。

目次

リザーブドキャパシティとは

1年もしくは3年利用することをコミットする代わりとして、DynamoDB でプロビジョニングされたキャパシティに対して通常料金よりも安く利用できる料金オプションです。プロビジョニングキャパシティモードが対象となり、オンデマンドキャパシティモードは対象外となりますので注意してください。

どのぐらい安くなるのか

読み込みキャパシティ(100 RCU)において、定価利用とリザーブドキャパシティでどのぐらい金額に差があるのかをグラフにしました。縦軸は DynamoDB に対して支払った累積金額、横軸は期間(月)です。4ヶ月目でほぼ同じになり、1年になると約50%も安くなっていることがわかります。

dynamodb-comparison-1year

料金

2020/04時点、東京リージョン、1年払いにおける料金です。公式の料金表は100ユニット単位で分かりづらいため、1ユニット単位で表記しています。実際にリザーブドキャパシティを購入する場合は100ユニット単位なので注意してください。

前払い 時間単位
書き込みキャパシティ $ 1.714/年 $ 0.000147/時
読み込みキャパシティ $ 0.342/年 $ 0.000029/時

これだけだと実際にどのぐらいかかるのかが分かりづらいので次で実際に計算してみます。

利用料金の求め方

書き込みキャパシティ、読み込みキャパシティともに 1,000 ユニットのリザーブドキャパシティを購入したとします。

前払い料金

リザーブドキャパシティ購入時に支払う金額です。書き込み、読み込み合わせて $ 2,056 を購入時に支払います。

書き込み: $ 1.714 × 1,000ユニット = $ 1,714/年
読み込み: $ 0.342 × 1,000ユニット = $ 342/年

定期的な予約料金

見落とされやすいのが定期的に発生する予約料金です。これはリザーブドキャパシティの時間単価における金額です。購入日から期限が切れるまで毎月発生します。購入月は購入してから月末までの残時間分が発生します。つまりは EC2 リザーブドインスタンスの一部前払いと同じですね。

例えば、4月15日 0時にリザーブドキャパシティを購入した場合、時間単価による予約料金が以下のように発生します。

# 残時間の求め方
24時間×(30日-15日)=360時間

書き込み: 1,000ユニット × $ 0.000147 × 360時間 = $ 52.92
読み込み: 1,000ユニット × $ 0.000029 × 360時間 = $ 10.44

翌月以降は、毎月初に1ヶ月分の予約料金が発生します。5月であれば次のようになります。

書き込み: 1,000ユニット × $ 0.000147 × 24時間 × 31日 = $ 109.368
読み込み: 1,000ユニット × $ 0.000029 × 24時間 × 31日 = $ 21.576

キャパシティに対する支払い

実際に消費したキャパシティが購入したキャパシティの範囲内であれば追加料金はかかりません。消費キャパシティが購入キャパシティを超えた場合は超えた分が通常料金として発生します。

例えば、ある時間に 1,500 ユニットを消費した場合、差し引いた 500 ユニット分の料金が発生します。

dynamodb-reserved-capacity-line

購入キャパシティ数の目安

残念なことに EC2 や RDS のようなレコメンデーション機能がまだないため、どのぐらいのキャパシティ数を購入するかは自分で調べて判断しなければなりません。使用状況レポートで時間単位の消費キャパシティ数が確認できます。

1: 使用状況レポート画面に飛ぶ
https://console.aws.amazon.com/billing/home#/reports/usage

2: サービスに「Amazon DynamoDB」、使用タイプ、オペレーションはデフォルト、期間は任意(取得したい期間)、レポートの詳細度を「時間単位」を選択し、XML か CSV でダウンロードする

dynamodb-usage-report

3: 書き込みキャパシティを見る場合は以下の条件でフィルタする

  • Operation:CommittedThroughput
  • UsageType:APN1-WriteCapacityUnit-Hrs

読み込みなら UsageType を「APN1-ReadCapacityUnit-Hrs」にする。

4: 1時間あたりの「UsageValue」が消費キャパシティとなる

実績値から購入キャパシティ数をどう求めるかはユースケース次第です。常に安定的に消費しているのであれば簡単ですが、乱高下している場合だと、最小値を取るのか、平均値を取るのか、最頻値を取るのかは購入者次第です。安全にいくのであれば最小値 + α で購入すると損はしないと思います。

まとめ

DynamoDB のリザーブドキャパシティについてまとめてみました。リザーブドキャパシティを活用することでうまくいけば 50% のコスト削減ができますが、EC2 や RDS のように情報が出回っていないのとレコメンデーションがないので購入を躊躇う人もいるかと思います。本記事でリザーブドキャパシティに対する障壁が少しでも下がれば幸いです。

参考

宣伝

BOOTH で「Amazon Web Services コスト最適化入門」という技術同人誌を販売中です。EC2 リザーブドインスタンスによるコスト最適化やコスト可視化、ベストプラクティスについて知りたい人はチェックしてみてください。

ohsawa0515.booth.pm