💽

DynamoDBの400KB制約は何を対象としているか?

2023/03/21に公開

概要

DynamoDBには項目のサイズが400KBという制約があり、ドキュメントにも記載されています。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ServiceQuotas.html#limits-items

ただ詳細に関しての記載がなく、細かい部分の仕様が読み取りづらいです。今回は実際に制限値の境界のデータを用意して、検証してみました。

疑問

1: 400KBとは何文字?

文字コードにはUTF-8が用いられます。
その場合、原則的に、英字が1バイト、日本語は3バイトです。
(厳密には異なります。詳しくは以下の記事が参考になりそうです。)
https://tech.sanwasystem.com/entry/2017/11/13/102531

400KBをバイト換算すると、400 * 1024 = 409,600となるため、英字換算だと409,600文字を格納できることとなります。

2: JSONの記法につかわれる記号("":{},)はカウントされるか?

カウントされません。KeyとValueの純粋な値がカウントされます。
こちらはドキュメント上でも例示されています。

たとえば、2 つの属性を持つ項目があり、1 つの属性は名前が "shirt-color" で値が "R"、別の属性は名前が "shirt-size" で値が "M" であるとします。この項目の合計サイズは 23 バイトです。

こちらの項目をJSON形式で表現すると、以下のようになります。

{"shirt-color":"R","shirt-size":"M"}

こちらを記号部分含めて、カウントすると36文字(36バイト)になり、ドキュメントの内容と一致しません。

shirt-colorRshirt-sizeM

記号部分を含めず数えると、23文字(23バイト)となり、ドキュメントの内容と一致します。

実際の検証でも、記号を含めた値が409,600文字を超えていても、データ登録ができることを確認しました。

3: フォーマットされたJSONを登録した時、空白スペースや改行コードはカウントされる?

カウントされません。フォーマットの有無を意識をする必要はありません。

4: JSON形式でのカウントと、DynamoDB JSON形式でのカウントのどちらになるか?

JSON形式でのカウントになります。
Dynamo DBのデータは、内部的には、以下の様にデータ型記述子が追加された形式にて管理されます。

// JSON
{"id": "0"}

// DynamoDB JSON
{"id": {"S": "0"}}

この場合"S"という文字列を表す値が追加されていますが、こちらはサイズ計算には影響しません。
id0の3バイトでカウントされます。

Discussion