#author("2019-02-13T12:35:48+00:00","","") [[AWSメモ]] > * DynamoDBのキャパシティユニットについて [#h11472d3] #setlinebreak(on); #html(<style>.lh15,.lh15 *{ line-height: 1.5;}</style>) #contents -- 関連 --- [[DynamoDBで取得する列を指定した場合のキャパシティユニット]] ** DynamoDBにかかる料金 [#j1b271ce] #html(<div style="padding-left:10px;">) だいたいここらへんに書いてある。 - [[Amazon DynamoDB 料金>https://aws.amazon.com/jp/dynamodb/pricing/]] - [[Amazon DynamoDB: 仕組み - 読み取りと書き込みのスループットキャパシティー>https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.ProvisionedThroughput.html]] - [[DynamoDB での制限 - キャパシティーユニットとプロビジョニングされるスループット>https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Limits.html#default-limits-capacity-units-provisioned-throughput]] - [[DynamoDB項目のサイズ>https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/CapacityUnitCalculations.html]] - [[読み込みでのキャパシティーユニットの消費>https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ProvisionedThroughput.html#ItemSizeCalculations.Reads]] - [[書き込みでのキャパシティーユニットの消費>https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ProvisionedThroughput.html#ItemSizeCalculations.Writes]] - [[リクエストのスロットリングとバーストキャパシティー>https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ProvisionedThroughput.html#ProvisionedThroughput.Throttling]] - [[バーストキャパシティーを効率的に使用する>https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/bp-partition-key-design.html#bp-partition-key-throughput-bursting]] - [[グローバルセカンダリインデックス におけるプロビジョニングされたスループットに関する考慮事項>https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/GSI.html#GSI.ThroughputConsiderations]] - [[ローカルセカンダリインデックス におけるプロビジョニングされたスループットに関する考慮事項>https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/LSI.html#LSI.ThroughputConsiderations]] - [[DynamoDB Auto Scaling によるスループットキャパシティの自動管理>https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/AutoScaling.html]] - [[DynamoDB および AWS SDK を使用したプログラミング » エラー処理>https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Programming.Errors.html]] #html(</div>) ** キャパシティユニット/保管料の概要 [#o86f584e] #html(<div style="padding-left:10px;">) 上記のリンク先の内容を簡単に纏めると、以下の通り。 *** 項目サイズ [#ad3c8ab1] #html(<div style="padding-left:10px;">) - 読み書き 及び 保管料にかかる項目(レコード)のサイズは、属性名と属性値の長さの合計となる(属性名の長さもサイズ計算に含まれる) #html(</div>) *** データ保管にかかる料金 [#t4030332] #html(<div style="padding-left:10px;">) - 毎月最初の 25 GB の保管は無料 ※それ以降は月額 0.285USD/GB(東京リージョン) #html(</div>) *** 読み書きにかかる料金 [#d35cbde5] #html(<div style="padding-left:10px;" class="lh15">) - 読み書きの度に料金がかかる - 読み込み/書き込みキャパシティーモードとして「プロビジョニング」と「オンデマンド」から選択できる - プロビジョニングモードの場合 -- 読み込み/書き込み &color(red){''キャパシティユニット単位''}; で料金がかかる -- テーブルや索引(GSI/LSI)に事前にキャパシティユニットを割り当てる必要がある -- 事前に割り当てたキャパシティユニットを超えるスループットは出せない&br; ※ProvisionedThroughputExceededException が発生する -- 1 読込キャパシティーユニットで、最大サイズ 4KB の項目について、1秒あたり1回の強力な整合性のある読み込み 又は 1秒あたり2回の結果整合性のある読み込みが可能&br; ※4KB未満のレコードはレコード毎に4KBに切り上げられて計算される -- 1書込キャパシティーユニットで、最大でサイズ 1KB までの項目について、1秒あたり 1回の書き込みが可能。&br; ※1KB未満のレコードはレコード毎に1KBに切り上げられて計算される -- 割り当てたキャパシティユニットは使用しなくても消費するが、未使用のキャパシティーは最大 5 分 (300 秒) 保持できる。(バーストキャパシティ) -- Auto Scaling は可能。&br; ※%%ただし使用率がゼロになった場合にはスケールダウンしない。等の制限がある為、個別にポリシー設定が必要。%% (ドキュメントから記載が無くなっていた為、訂正) -- GSI/LSI に対しての読み書きはテーブルへの読み書きとは別にキャパシティユニットを消費する -- queryで複数レコードを一括で取得する場合は、合計サイズが 4KB単位で切り上げて計算される(レコード毎には切り上げられない) -- 0.0001484USD/RCU、0.000742USD/WCU(東京リージョン) -- 前払いのリザーブドキャパシティーを利用すると通常よりも割安(WCU/RCU 100 個単位で購入) - オンデマンドモードの場合 -- 読み込み/書き込み &color(red){''リクエスト単位''}; で料金がかかる -- 読み込みは 4KB単位で 1リクエスト(強力な整合性のある読み込みの場合) または 0.5リクエスト(結果整合性のある読み込みの場合) として計算される -- 書き込みは 1KB単位で 1リクエストとして計算される -- 0.2854USD/100万読み込みリクエスト、1.4269USD/100万書き込みリクエスト (東京リージョン) #html(</div>) #html(</div>) ** 補足 [#n828ed4d] #html(<div style="padding-left:10px;">) *** オンデマンドモードについて [#r72bacd3] #html(<div style="padding-left:10px;">) デフォルトでは、テーブルやGSI/LSI に事前に設定したキャパシティユニット分のパフォーマンスを確保する事ができるが、 [[AWS re:Invent 2018>https://aws.amazon.com/jp/new/reinvent/]] で発表された [[DynamoDB On-demand>https://aws.amazon.com/jp/about-aws/whats-new/2018/11/announcing-amazon-dynamodb-on-demand/]] を使用すると、事前設定なしに使用した分だけ料金を支払う事もできる。 #html(<span style="color:red; font-weight: bold;">※ただし無料利用枠の範囲外になる為、要注意!</span>) #html(</div>) *** 消費したキャパシティユニットの調べ方 [#x8e5d4be] #html(<div style="padding-left:10px;">) - メトリクスを確認する ([[Amazon DynamoDB メトリクスとディメンション>https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/metrics-dimensions.html]]) - プログラムから確認したい場合&br; 各APIのデータ操作時に ReturnConsumedCapacity を指定する事により、消費したキャパシティユニットを調べる事ができる。&br;https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html (boto3の場合) #html(</div>) #html(</div>) ** プロビジョニングモード と オンデマンドモードの料金試算 [#t57fefb8] #html(<div style="padding-left:10px;" class="lh15">) 以下の条件で DynamoDB にアクセスした場合に、プロビジョニングモード と オンデマンドモード の料金を試算してみる。 - 1レコードのサイズは 4KB とする - データを1秒間に2回の読み込みを1時間続ける - 読み込み整合性は「結果整合性のある読み込み」とする - リージョンは東京リージョンする - 単価は [[Amazon DynamoDB 料金>https://aws.amazon.com/jp/dynamodb/pricing/]] を参考にする *** プロビジョニングモードの場合 [#ye598451] #html(<div style="margin-left:10px; border: 0px solid #333">) - 読み込み回数: 2回 * 60秒 * 60分 = 7200 - 必要なキャパシティユニット : 1 RCU (結果整合性読み込みは、2回の読み込みで1RCUを消費) #html(<div style="display: inline-block; text-decoration: underline; margin: 20px;">料金は 0.0001484(USD) * 1(RCU) = 0.0001484 USD</div>) #html(</div>) *** オンデマンドモードの場合 [#ad14af97] #html(<div style="margin-left:10px; border: 0px solid #333">) - 読み込み回数: 2回 * 60秒 * 60分 = 7200 - 必要なリクエストユニット: 3600 (結果整合性読み込みは、2回の読み込みで1リクエストユニットを消費) #html(<div style="display: inline-block; text-decoration: underline; margin: 20px;">料金は 0.2854(USD) / 1000000(回) * 3600 = 0.00102744 USD</div>) ※0.2854 USD / 100万回 なので、1リクエストユニット辺りの料金を算出してから必要なリクエストユニットを掛けた。 #html(</div>) *** 比較結果 及び 所感 [#a745484e] #html(<div style="margin-left:10px; border: 0px solid #333" class="lh15">) 結果からみると &color(red){''プロビジョニングモードの方がかなり安い''}; 。 いつどれだけのリクエストを捌く必要があるのか分からない。というケースで料金が高くなるのは理解できる。 ・・が、プロビジョニングモードの場合キャパシティユニットが 1秒あたりの設定なので試算が難しい。 例えば、上記の例では1秒間に 2回のリクエストを 60分間続けて 合計 7200回の読み込みを行う場合の例を記載したが、 実運用ではピークの時間帯があるケースが多く、7200回のリクエストが 1分間に集中する事なども普通にありえる為、上記の例の様に 1RCU では捌けないケースが出てくる。 直近の5分で全くアクセスがなかった場合は、バーストキャパシティ分の 600回(60秒*5分*2回) は捌けるが、全然足りない・・(※1) せめて、もう少しバーストキャパシティの保持期間を広げて欲しい。(10分くらいにならんかな) たぶん AutoScaling をうまく使ってやりなさいって事だと思う。([[DynamoDB Auto Scaling によるスループットキャパシティの自動管理>https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/AutoScaling.html]]) ※1 ... 仮に、7200回のリクエストが 1分間に集中するケースがある場合、バーストキャパシティで賄うとしても 12RCU ぐらいは必要?(7200 / 5 / 60 / 2) #html(</div>) #html(</div>)