Amazon DynamoDBの料金体系はスループットとデータストレージが基準になっている。
読み込みキャパシティーユニットは、最大サイズ 4 KB の項目について、1 秒あたり 1 回の強力な整合性のある読み込み、あるいは 1 秒あたり 2 回の結果的に整合性のある読み込みを表します。
読み込み対象の項目が存在しない場合、データのサイズは当然0になる筈だ。
であれば、その場合は読み込みキャパシティーユニット(RCU)が消費されないのではないか?とアホなことを考えたので、検証してみた。
[存在しない項目でもRCUは消費される]
結論としては、存在しない項目に対する読み込みであってもキャパシティーユニットは消費されるということが分かった。
AWSの公式ドキュメントにも、次のように明示的に記載されている。
存在しない項目に対して読み込みオペレーションを実行しても、DynamoDB ではやはりプロビジョンド読み込みスループットが消費されます。強力な整合性のある読み込みオペレーションでは、1 つの読み込みキャパシティーユニットが消費されますが、結果整合性のある読み込みオペレーションでは、半分の読み込みキャパシティーユニットが消費されます。
ちなみに、膨大に存在するAWSの公式ドキュメントから、お目当の記述を一発で見つけることができた訳ではない。
「DynamoDB no data consumed capacity」などのキーワードでグーグル先生に問い合わせた結果、以下のStackOverflowの回答を発見し、そこからAWSのドキュメントにたどり着くことができた。
公式には記載がないのでは?という懸念もあったので、適当な英単語を組み合わせてググるという愚行を犯したが、最終的には公式ドキュメントに行き着くことになった。急がば回れと言うやつか。
[RCUが消費されるか検証してみた]
StackOverflowにサラッと書いてあるだけならともかく、公式ドキュメントにまでバッチリ書いてあるのだから、これ以上疑う余地はない。
ないのだが、念のため実際にテーブルを作って検証してみる。
検証の手順は以下の通り。
- テスト用のテーブルを作る(テーブル名:demo、パーティションキー:id、読み込むキャパシティーユニット:1、オートスケール:off)
- テーブルの作成完了を待つ
- aws cliで存在しないパーティションキーでget-itemリクエストを繰り返し投げる
作成しただけで、データを投入していないので、テーブルの項目数は0である。
手順3で利用したコマンドは以下。
aws dynamodb get-item --table-name demo --key '{"id":{"S":"1"}}'
AWS CLIに不慣れなので、最初は間違えて--key {"id":{"S":"1"}}
というコマンドにしてしまっていたため、
Error parsing parameter '--key': Invalid JSON: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) JSON received: {id:{S:1}}
というエラーが出てしまった。これはシングルクオートでキーのJSONを囲むことで対処できた。
コマンドをひたすら実行しているターミナルの画面はこんな感じ。
しばらく待ってから、AWS Management ConsoleでRCUの変化を確認する。
しっかりキャパシティーが消費されていた。
存在するかどうか確認するためにDBに負荷がかかるのだから、それはそうだよな、という感じ。
[まとめ]
DynamoDBのスループットは読み込み対象のデータが存在しなくても消費される、というお話。
そういえばグローバルテーブル機能が東京リージョンに来たから、これも触ってみなくては。
今日のブログ執筆BGMはこちら。