AWSメモ >

DynamoDBのキャパシティユニットについて

DynamoDBにかかる料金

だいたいここらへんに書いてある。

キャパシティユニット/保管料の概要

上記のリンク先の内容を簡単に纏めると、以下の通り。

項目サイズ

  • 読み書き 及び 保管料にかかる項目(レコード)のサイズは、属性名と属性値の長さの合計となる(属性名の長さもサイズ計算に含まれる)

データ保管にかかる料金

  • 毎月最初の 25 GB の保管は無料 ※それ以降は月額 0.285USD/GB(東京リージョン)

読み書きにかかる料金

  • 読み書きの度に料金がかかる
  • 読み込み/書き込みキャパシティーモードとして「プロビジョニング」と「オンデマンド」から選択できる
  • プロビジョニングモードの場合
    • 読み込み/書き込み キャパシティユニット単位 で料金がかかる
    • テーブルや索引(GSI/LSI)に事前にキャパシティユニットを割り当てる必要がある
    • 事前に割り当てたキャパシティユニットを超えるスループットは出せない
       ※ProvisionedThroughputExceededException が発生する
    • 1 読込キャパシティーユニットで、最大サイズ 4KB の項目について、1秒あたり1回の強力な整合性のある読み込み 又は 1秒あたり2回の結果整合性のある読み込みが可能
       ※4KB未満のレコードはレコード毎に4KBに切り上げられて計算される
    • 1書込キャパシティーユニットで、最大でサイズ 1KB までの項目について、1秒あたり 1回の書き込みが可能。
       ※1KB未満のレコードはレコード毎に1KBに切り上げられて計算される
    • 割り当てたキャパシティユニットは使用しなくても消費するが、未使用のキャパシティーは最大 5 分 (300 秒) 保持できる。(バーストキャパシティ)
    • キャパシティユニットの Auto Scaling は可能。
       ※ただし使用率がゼロになった場合にはスケールダウンしない。等の制限がある為、個別にポリシー設定が必要。 (ドキュメントから記載が無くなっていた為、訂正)
    • GSI/LSI に対しての読み書きはテーブルへの読み書きとは別にキャパシティユニットを消費する
    • queryで複数レコードを一括で取得する場合は、合計サイズが 4KB単位で切り上げて計算される(レコード毎には切り上げられない)
    • 0.0001484USD/RCU、0.000742USD/WCU(東京リージョン)
    • 前払いのリザーブドキャパシティーを利用すると通常よりも割安(WCU/RCU 100 個単位で購入)
  • オンデマンドモードの場合
    • 読み込み/書き込み リクエスト単位 で料金がかかる
    • 読み込みは 4KB単位で 1リクエスト(強力な整合性のある読み込みの場合) または 0.5リクエスト(結果整合性のある読み込みの場合) として計算される
    • 書き込みは 1KB単位で 1リクエストとして計算される
    • 0.2854USD/100万読み込みリクエスト、1.4269USD/100万書き込みリクエスト (東京リージョン)

補足

オンデマンドモードについて

デフォルトでは、テーブルやGSI/LSI に事前に設定したキャパシティユニット分のパフォーマンスを確保する事ができるが、
AWS re:Invent 2018 で発表された DynamoDB On-demand を使用すると、事前設定なしに使用した分だけ料金を支払う事もできる。

※ただし無料利用枠の範囲外になる為、要注意!

消費したキャパシティユニットの調べ方

プロビジョニングモード と オンデマンドモードの料金試算

以下の条件で DynamoDB にアクセスした場合に、プロビジョニングモード と オンデマンドモード の料金を試算してみる。

  • 1レコードのサイズは 4KB とする
  • データを1秒間に2回の読み込みを1時間続ける
  • 読み込み整合性は「結果整合性のある読み込み」とする
  • リージョンは東京リージョンする
  • 単価は Amazon DynamoDB 料金 を参考にする

プロビジョニングモードの場合

  • 読み込み回数: 2回 * 60秒 * 60分 = 7200
  • 必要なキャパシティユニット : 1 RCU (結果整合性読み込みは、2回の読み込みで1RCUを消費)
料金は 0.0001484(USD) * 1(RCU) = 0.0001484 USD

オンデマンドモードの場合

  • 読み込み回数: 2回 * 60秒 * 60分 = 7200
  • 必要なリクエストユニット: 3600 (結果整合性読み込みは、2回の読み込みで1リクエストユニットを消費)
料金は 0.2854(USD) / 1000000(回) * 3600 = 0.00102744 USD

※0.2854 USD / 100万回 なので、1リクエストユニット辺りの料金を算出してから必要なリクエストユニットを掛けた。

比較結果 及び 所感

結果からみると プロビジョニングモードの方がかなり安い

いつどれだけのリクエストを捌く必要があるのか分からない。というケースの方が料金が高くなるのは理解できる。

・・が、プロビジョニングモードの場合キャパシティユニットが 1秒あたりの設定なので試算が難しい。
例えば、上記の例では1秒間に 2回のリクエストを 60分間続けて 合計 7200回の読み込みを行う場合の例を記載したが、
実運用ではピークの時間帯があるケースが多く、7200回のリクエストが 1分間に集中する事なども普通にありえる為、上記の例の様に 1RCU では捌けないケースが出てくる。
直近の5分で全くアクセスがなかった場合は、バーストキャパシティ分の 600回(60秒*5分*2回) は捌けるが、1RCUでは全然足りない・・(※1)
せめて、もう少しバーストキャパシティの保持期間を広げて欲しい。(10分くらいにならんかな)

恐らく AutoScaling をうまく使ってやりなさいって事だと思う。
以前は、ドキュメントに「使用率がゼロになった場合にはスケールダウンしない」という記載があったが(※2) 今はその記載は無くなってるので、
マネジメントコンソールからデフォルト設定でテーブル作った場合は、放ったらかしでもそれほど異常に料金が高くなる事はないと思う。たぶん。恐らく。

※1 仮に7200回のリクエストが 1分間に集中するケースがある場合、バーストキャパシティで賄うとしても 12RCU ぐらいは必要?(7200 / 5 / 60 / 2)
※2 DynamoDB Auto Scaling によるスループットキャパシティの自動管理


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-02-13 (水) 20:32:16 (69d)