プロビジョニングされたキャパシティの読み込み容量ユニットに1(テーブル)を設定しました。
(書き込みにも1を設定してみました。これでなんと 一か月 0.67$ )
説明書によると、1秒間あたりの読み込み回数が 読み込み容量ユニットであるとの説明があるのですが
Lambdaから getItemをfor文で60回呼び出してみたのですが どう考えても1秒間に1回以上 呼び出せてしまっています。どういうことでしょう (?_?)
AWS DynamoDB では、strongly consistent read というのと、eventually consistent read というのがあるみたいです。
GetItem などでは、パラメータで指定することで strongly consistent read な要求ができる、と。
Strongly Consistent Reads
When you issue a strongly consistent read request, DynamoDB returns a response with the most up-to-date data that reflects updates by all prior related write operations to which DynamoDB returned a successful response. A strongly consistent read might be less available in the case of a network delay or outage. For the GetItem, Query or Scan operations, you can request a strongly consistent read result by specifying optional parameters in your request.
Supported Operations in DynamoDB - Amazon DynamoDB
Capacity Unit による制限も、それぞれで違います。
Capacity Unit Sizes
One read capacity unit = one strongly consistent read per second, or two eventually consistent reads per second, for items up 4 KB in size.
Limits in DynamoDB - Amazon DynamoDB
特に意識してないなら、試してみたコードでは eventually consistent read な要求になっていたのだと思います。
「どう考えても1秒間に1回以上 呼び出せてしまっています」というのは、1秒間に 2回くらい呼び出せているということじゃないか、と想像します。
DynamoDBのキャパシティーはバースト出来ます。
なので散発的な場合は、秒単位で見たキャパ以上のアクセスが可能です。
ただしそれが継続するとクエリがDENYされて実行できなくなるはずです。
例えば、1分間に60req/secを1回だけ行うのなら大丈夫ですが、2req/secの利用ペースを10分間ずっと継続とかは出来なかったはずです。
恐らくは CloudWatch の数分単位のメトリクスを使った平均read/writeがキャパを超えたかどうかで判定してるんだと思います。
スパイクアクセス時にバーストしてくれるのは助かるので利用者にとっては無駄なキャパシティを確保する必要が無いので良い仕様だと思います。
ただしキャパオーバーを放っておくと突然使えなくなるのでCloudWatchのメトリクス値には注意するようにしましょう。
DynamoDBコンソールのメトリクスの情報アイコンのポップアップ内にもそう書いてありますね。
なるほどですね! とてもしっくり来ました!
な、なるほど!!!
2016/02/20 16:20:13おまけとかな感じで、アクセスできてるのかと思いました。ありがとうございました!
2016/02/20 16:21:43