DynamoDBのRCU/WCUの計算方法メモ

こんにちは。

現在[AWS Certified Developer - Associate](https://aws.amazon.com/jp/certification/certified-developer-associate/)を受験しようと勉強していますが、日本語に対応した講座は中々ありませんよね。

そこでUdemyで[Ultimate AWS Certified Developer Associate 2023 NEW DVA-C02](https://www.udemy.com/share/101WES3@kXljGqr7bOmeQ-hW23PgfQNSOA3iWrpoq_2NA503Ku6RtF8TYRNv0esTzOYoEu6FOw==/)を購入して勉強しているのですが、想像以上におススメです。

講師は英語で喋りますが、発音が綺麗なのかかなり高精度な字幕が表示されますので英語が聞き取れない人でも大きな問題はありません。
ただ __一部の字幕が表示されなかったり、用語が誤って変換されたりする__ ことがあるので、補完できるくらいの知識は持っていると良いでしょう。

一例としてはこんな感じ。
・DynamoDB → IMDB（Dynamo → IM？）
・DynamoDB → DynamicDB
・AmazonS3 → Amazonの履歴（S3 → history？）
・Dockerイメージ → Docker画像
・ACID → 酸

:::note info
__想定している対象読者__
・[AWS Developer - Associate（DVA-C02）](https://aws.amazon.com/jp/certification/certified-developer-associate/)
　を受験しようとしている方、またはそれに準ずる知識を有する方
 
・DynamoDBの導入を検討している方
:::

:::note info
試験に必要な勉強時間について
・Cloud Practitionerは20時間程度
・Associate各種は40～60時間程度（CP合格程度の知識があることが前提）
が目安です。

上で紹介している動画は約35時間なので、これ&模擬試験を繰り返せば合格できるのではないでしょうか。
:::

----

# DynamoDBとは
フルマネージドNoSQLのデータベースサービスです。RedisやMongoDBもNoSQLですね。
この記事を見る方はご存じと思いますので、最低限。

# 容量モード
プロビジョンドキャパシティー、オンデマンドキャパシティーの2つのモードがあり、モードの切り替えも可能です。
ただしモードを一度切り替えた後、元に戻すためには24時間空ける必要があります。

## プロビジョンドキャパシティー
1秒当たりのR/Wを明示的に指定する設定です。
目標容量を指定したオートスケーリングも可能で、料金は指定した分だけ支払うことになります。
指定した以上のR/Wがあった場合はバースト容量を利用しますが、それすら超えるとProvisionedThroughputExceededExceptionが発生します。
正しく見積もった場合は後述のオンデマンドキャパシティーよりも安価に利用できます。

## オンデマンドキャパシティー
全てAWS側でオートスケーリングを行う設定で、キャパシティーの予測が困難な場合に選択します。
コストはプロビジョンドキャパシティーよりも高くつきます。

# 整合性
DynamoDBの読み込みモードには __強力な整合性__ と __結果整合性__ があります。
複数サーバがありアプリがサーバAに書き込んだとき、サーバAは残りのサーバに書き込みに行きますよね。
ただ、それまでに別のアプリがサーバBから読み込みを行ったとき、サーバAの書き込み内容が古いままになる可能性があります。
これを防ぐのが __強力な整合性__ ですが、RCU（後述）が2倍消費されることになりコストが上がります。

## WCU（Write Capacity Units）
書き込み容量ユニット。
最大1KB/WCUに対して、1回/秒の書き込みを行います。
2KBの場合は2WCU、3.5KBの場合は4WCUを消費します。

### WCUの計算方法
1. 1秒当たりの書き込み件数は60件で、1件当たりの容量は3KBあります
　→　WCUの単位は1KBのため1件当たり3WCU、それが60件/秒あるため180WCU
　
2. 1秒当たりの書き込み件数は60件で、1件当たりの容量は3.5KBあります
　→　WCUの単位は1KBのため1件当たり4WCU、それが60件/秒あるため240WCU
　
3.  __1分__ 当たりの書き込み件数は60件で、1件当たりの容量は3.5KBあります
　→　WCUの単位は1KBのため1件当たり4WCU、それが __1件/秒__ あるため4WCU

## RCU（Read Capacity Units）
読み込み容量ユニット。
最大4KB/RCUに対して __強力な整合性の場合は1回/秒、結果整合性の場合は2回/秒__ の読み込みを行います。

WCUと同じで8KBの場合は2RCU、9.5KBの場合は3RCUを消費します。

### RCUの計算方法
1. 強力な整合性で1秒当たりの読み込み件数は10件、1件当たりの容量は3KBあります
　→　RCUの単位は4KBのため1件当たり1RCU、強力な整合性（1件/秒）なので10RCU
　
2. 強力な整合性で1秒当たりの読み込み件数は10件、1件当たりの容量は5.5KBあります
　→　RCUの単位は4KBのため1件当たり2RCU、強力な整合性（1件/秒）なので20RCU
　
3. 結果整合性で1秒当たりの読み込み件数は10件、1件当たりの容量は3KBあります
　→　RCUの単位は4KBのため1件当たり1RCU、結果整合性（2件/秒）なので5RCU
　
4. 結果整合性で1秒当たりの読み込み件数は10件、1件当たりの容量は5.5KBあります
　→　RCUの単位は4KBのため1件当たり2RCU、結果整合性（2件/秒）なので10RCU

 # プロビジョンド vs オンデマンド
例えば無料利用枠の外で以下の条件を仮定して試算しましょう。

:::note info
・場所は東京リージョン
・DynamoDB Standardテーブルクラス
・30日間（720時間、2,592,000秒）
・1リクエスト当たり4KB
・読み書きそれぞれ10億リクエスト処理
・読み取り形式は結果整合性
:::
まず東京リージョンのStandardテーブルクラスということで
プロビジョニングキャパシティーの場合は 1時間当たり0.000742USD/WCU、0.0001484USD/RCU
オンデマンドキャパシティーの場合は 1.4269USD/100万WCU、0.285USD/100万RCU

処理件数に関しては
WCUが4KBで10億リクエスト　→　__40億WCU/月__
RCUが4KBで10億リクエスト、結果整合性　→　__5億RCU/月__

プロビジョニングキャパシティーの場合、
0.000742USD * 40億WCU / 720時間 ≒ 4,122USD
0.0001484 * 5億RCU / 720時間 ≒ 103USD
合計で4,225USD * 150円/USD ≒ __63万円__

オンデマンドキャパシティーの場合、
1.4269USD / 100万リクエスト * 40億WCU ≒ 5,707USD
0.285 / 100万リクエスト * 5億RCU ≒ 142.5USD
合計で5,850USD * 150円/USD ≒ __88万円__

計算ツールの使い方が微妙に理解しづらくって、 __プロビジョニングの方の計算が心配__ になってきました。
もし間違いを発見した場合、教えていただけると非常に助かります。

# 参考資料
* [公式ページ](https://aws.amazon.com/jp/dynamodb/)
* [デベロッパーガイド](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Introduction.html)
* [Ultimate AWS Certified Developer Associate 2023 NEW DVA-C02](https://www.udemy.com/share/101WES3@kXljGqr7bOmeQ-hW23PgfQNSOA3iWrpoq_2NA503Ku6RtF8TYRNv0esTzOYoEu6FOw==/)
* [オンデマンドキャパシティーの料金表](https://aws.amazon.com/jp/dynamodb/pricing/on-demand/)
* [プロビジョニングキャパシティーの料金表](https://aws.amazon.com/jp/dynamodb/pricing/provisioned/)