

# Amazon DynamoDB での制約
<a name="Constraints"></a>

このセクションでは、Amazon DynamoDB 内の現在の制約 (以前は制限と呼ばれていました) について説明します。

**注記**  
DynamoDB のすべてのサイズ測定値は、バイナリベースの単位を使用します。DynamoDB は、1 KB = 1024 バイト、1 MB = 1024 KB、1 GB = 1024 MB、1 TB = 1024 GB を示します。

**Topics**
+ [読み取り/書き込みキャパシティモード](#default-limits-capacity-modes)
+ [セカンダリインデックス](#limits-secondary-indexes)
+ [パーティションキーおよびソートキー](#limits-partition-sort-keys)
+ [名前付けルール](#limits-naming-rules)
+ [データ型](#limits-data-types)
+ [項目](#limits-items)
+ [属性](#limits-attributes)
+ [式パラメータ](#limits-expression-parameters)
+ [DynamoDB のトランザクション](#limits-dynamodb-transactions)
+ [DynamoDB Streams](#constraints-dynamodb-streams)
+ [DynamoDB Accelerator (DAX)](#limits-dax)
+ [API 固有の制約](#limits-api)
+ [保管時の DynamoDB 暗号化](#limits-dynamodb-encryption)

## 読み取り/書き込みキャパシティモード
<a name="default-limits-capacity-modes"></a>

24 時間のローリングウィンドウで、テーブルをプロビジョンドキャパシティモードからオンデマンドモードに最大 4 回切り替えることができます。テーブルは、オンデマンドモードからプロビジョンドキャパシティモードにいつでも切り替えることができます。

読み込みおよび書き込みキャパシティモード間の切り替えの詳細については、「[DynamoDB でキャパシティモードを切り替える際の考慮事項](bp-switching-capacity-modes.md)」を参照してください。

### キャパシティユニットサイズ (プロビジョニングされるテーブルの場合)
<a name="limits-capacity-units"></a>

最大サイズが 4 KB の項目について、1 つの読み込みキャパシティーユニット = 1 秒あたり 1 回の強力な整合性のある読み込み、あるいは 1 秒あたり 2 回の結果整合性のある読み込み。

最大サイズが 1 KB の項目について、1 つの書き込みキャパシティーユニット = 1 秒あたり 1 回の書き込み

トランザクション読み込みリクエストでは、最大 4 KB の項目を 1 秒あたりに 1 回読み込むために読み込みキャパシティーユニットが 2 個必要です。

トランザクション書き込みリクエストでは、最大 1 KB の項目を 1 秒あたり 1 回書き込むのに書き込みキャパシティーユニットが 2 個必要です。

### リクエストユニットサイズ (オンデマンドテーブルの場合)
<a name="limits-request-units"></a>

最大サイズが 4 KB の項目について、1 つの読み込みリクエストユニット = 1 秒あたり 1 回の強力な整合性のある読み込み、あるいは 1 秒あたり 2 回の結果整合性のある読み込み。

最大サイズが 1 KB の項目について、1 つの書き込みリクエストユニット = 1 秒単位の書き込み。

トランザクション読み込みリクエストでは、最大 4 KB の項目を 1 秒に 1 回読み込むのに読み込みリクエストユニットが 2 個必要です。

トランザクション書き込みリクエストでは、1 KB の項目を 1 秒に 1 回書き込むのに書き込みリクエストユニットが 2 個必要です。

## セカンダリインデックス
<a name="limits-secondary-indexes"></a>

### テーブルごとの射影されたセカンダリインデックスの属性
<a name="limits-tables-projected-secondary-index-attributes"></a>

合計最大 100 の属性を、1 つのテーブルのすべてのグローバルセカンダリインデックスに射影することができます。これは、ユーザー指定の射影された属性だけに適用されます。

`CreateTable` オペレーションでは、`INCLUDE` として `ProjectionType` を指定した場合には、`NonKeyAttributes` で指定した、すべてのローカルセカンダリインデックスを含む属性の合計数が 100 を超えてはいけません。同じ属性名を 2 つの異なるインデックスに射影した場合には、合計を計算する際に 2 つの異なる属性として計算されます。

この制限は、`ProjectionType` が `KEYS_ONLY` または `ALL` であるセカンダリインデックスには適用されません。

## パーティションキーおよびソートキー
<a name="limits-partition-sort-keys"></a>

### パーティションキーの長さ
<a name="limits-partition-key-length"></a>

パーティションキーと値の最小長は 1 バイトです。最大長は 2048 バイトです

### パーティションキーの値
<a name="limits-partition-key-values"></a>

テーブルまたはセカンダリインデックスについて、パーティションキー値の明確な数に関する実質的な制限はありません。

### ソートキーの長さ
<a name="limits-sort-key-length"></a>

ソートキーと値の最小長は 1 バイトです。最大長は 1024 バイトです

### ソートキー値
<a name="limits-sort-key-values"></a>

一般的に、パーティションキーの値ごとのソートキーの値の数について、実質的に制限はありません。

セカンダリインデックスを持つテーブルは例外です。項目コレクションは、パーティションキー属性の値が同じ項目のセットです。グローバルセカンダリインデックスでは、項目コレクションはベーステーブルから独立しています (そのため、異なるパーティションキー属性を持つこともできます)。ただし、ローカルセカンダリインデックスでは、インデックス付きビューはテーブル内の項目と同じパーティションに配置され、同じパーティションキー属性を共有します。このローカリティのため、テーブルに 1 つ以上の LSI がある場合、項目コレクションを複数のパーティションに分散することはできません。

1 つ以上の LSI を含むテーブルの場合、項目コレクションのサイズは 10 GB を超えることはできません。これには、パーティションキー属性の値が同じであるすべてのベーステーブル項目およびすべての射影された LSI ビューが含まれます。パーティションの最大サイズは 10 GB です。詳細については、「[項目コレクションのサイズ制限](LSI.md#LSI.ItemCollections.SizeLimit)」を参照してください。

## 名前付けルール
<a name="limits-naming-rules"></a>

### テーブル名とセカンダリインデックス名
<a name="limits-naming-rules-tables-secondary-indexes"></a>

テーブルとセカンダリインデックスの名前は、3 文字以上、255 文字以下である必要があります。使用可能な文字は次のとおりです。
+ `A-Z`
+ `a-z`
+ `0-9`
+ `_` (下線)
+ `-` (ハイフン)
+ `.`（ドット）

### 属性名
<a name="limits-naming-rules-attributes"></a>

一般的に、属性名は 1 文字以上、64 KB 以下である必要があります。

以下の例外があります。これらの属性名は 255 文字以下である必要があります。
+ セカンダリインデックスのパーティションキー名。
+ セカンダリインデックスのソートキー名。
+ ユーザー指定の射影された属性の名前 (ローカルセカンダリインデックスのみに適用)。`CreateTable` オペレーションでは、`ProjectionType` を `INCLUDE` に指定した場合には、`NonKeyAttributes` パラメータの属性名の長さが制限されます。射影タイプ `KEYS_ONLY` および `ALL` には影響しません。

これらの属性名は UTF-8 を使用してエンコードする必要があり、それぞれの名前の合計サイズが (エンコード後に) 255 バイトを超えることはできません。

## データ型
<a name="limits-data-types"></a>

### String
<a name="limits-data-types-strings"></a>

文字列の長さは、項目の最大サイズである 400 KB に制約されます。

文字列は、UTF-8 バイナリエンコードの Unicode です。UTF-8 は可変幅のエンコードであるため、DynamoDB により、UTF-8 バイトを使用して文字列の長さが決定されます。

### Number
<a name="limits-data-types-numbers"></a>

数値は、最大 38 桁の精度であり、正、負、または 0 のいずれかです。
+ 正の範囲: `1E-130`～`9.9999999999999999999999999999999999999E+125`
+ 負の範囲: `-9.9999999999999999999999999999999999999E+125`～`-1E-130`

DynamoDB では、リクエストと返信の数値データが JSON 文字列で表示されます。詳細については、「[DynamoDB 低レベル API](Programming.LowLevelAPI.md)」を参照してください。

数値の精度が重要な場合は、数値型から変換する文字列を使用して、DynamoDB に数値を渡します。

### バイナリ
<a name="limits-data-types-binary"></a>

バイナリの長さは、項目の最大サイズである 400 KB に制約されます。

バイナリ属性を操作するアプリケーションは、データを DynamoDB に送信する前に、base64 形式でエンコードする必要があります。その後 DynamoDB は、受信したデータを署名なしバイト配列にデコードし、それを属性の長さとして使用します。

## 項目
<a name="limits-items"></a>

### 項目のサイズ
<a name="limits-items-size"></a>

DynamoDB の項目の最大サイズは 400 KB で、属性名のバイナリの長さ (UTF-8 の長さ) と属性値の長さ (こちらもバイナリの長さ) を含みます。属性名はサイズ制限に反映されます。

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

### ローカルセカンダリインデックスを持つテーブルの項目のサイズ
<a name="limits-items-size-secondary-indexes"></a>

テーブルのローカルセカンダリインデックスごとに、次を合計したサイズに関して 400 KB の制限があります。
+ テーブルの項目データのサイズ。
+ すべてのローカルセカンダリインデックスエントリ (キーの値と射影された属性を含む) の対応するエントリサイズ。

## 属性
<a name="limits-attributes"></a>

### 項目あたりの属性名と値のペア
<a name="limits-attributes-name-value-pairs"></a>

項目あたりの属性の累積サイズは、DynamoDB の項目の最大サイズ (400 KB) 以内である必要があります。

### リスト、マップ、またはセットの値の数
<a name="limits-attributes-number"></a>

値を含む項目が 400 KB の制限内である限り、リスト、マップ、またはセットにおける値の最大数の制限はありません。

### 属性値
<a name="limits-attributes-values"></a>

属性がテーブルまたはインデックスのキー属性として使用されていない場合は、空の文字列属性とバイナリ属性値を使用できます。空の文字列とバイナリ値は、セット、リスト、およびマップ型内で許可されます。属性値は空のセット (文字列セット、数値セット、またはバイナリセット) にすることはできません。ただし、空のリストおよびマップは許可されます。

### 入れ子の属性の深さ
<a name="limits-attributes-nested-depth"></a>

DynamoDB では、深さが最大 32 のレベルの入れ子の属性をサポートします。

## 式パラメータ
<a name="limits-expression-parameters"></a>

式パラメータには、`ProjectionExpression`、`ConditionExpression`、`UpdateExpression`、および `FilterExpression` があります。

### 長さ
<a name="limits-expression-parameters-lengths"></a>

任意の式の最大長は 4 KB です。たとえば、`ConditionExpression` `a=b` のサイズは 3 バイトです。

1 つの式属性名または式属性値の最大長は 255 バイトです。たとえば、`#name` は 5 バイト、`:val` は 4 バイトです。

式のすべての置換変数の最大長は 2 MB です。これはすべての `ExpressionAttributeNames` および `ExpressionAttributeValues` の長さの合計です。

### 演算子およびオペランド
<a name="limits-expression-parameters-operators"></a>

`UpdateExpression` で許容される演算子または関数の最大数は 300 です。たとえば、*UpdateExpression* `SET a = :val1 + :val2 + :val3` は 2 つの「`+`」演算子を含みます。

`IN` コンパレータのオペランドの最大数は 100 です。

### 予約語
<a name="limits-expression-parameters-reserved-words"></a>

DynamoDB では、予約語と競合する名前の使用を防ぐことはできません。(詳細な一覧については、「[DynamoDB の予約語](ReservedWords.md)」を参照してください)。

ただし、式パラメータで予約語を使用する場合は、`ExpressionAttributeNames` も指定する必要があります。詳細については、「[DynamoDB の式の属性名 (エイリアス)](Expressions.ExpressionAttributeNames.md)」を参照してください。

## DynamoDB のトランザクション
<a name="limits-dynamodb-transactions"></a>

DynamoDB トランザクションの API オペレーションには次の制約があります。
+ トランザクションには、100 個を超える一意のアクションを含めることはできません。
+ トランザクションには、4 MB を超えるデータを含めることはできません。
+ トランザクション内の 2 つのアクションを、同じテーブルの同じ項目に対して実行することはできません。たとえば、`ConditionCheck` と `Update` の両方を 1 つのトランザクションで同じ項目に対して実行することはできません。
+ トランザクションは、複数の AWS アカウントまたはリージョンのテーブルで動作できません。
+ トランザクションオペレーションは、書き込みが最初に行われた AWS リージョン内でのみ、不可分性、一貫性、分離性、および耐久性 (ACID) を保証します。グローバルテーブルのリージョン間では、トランザクションはサポートされていません。たとえば、米国東部 (オハイオ) リージョンと米国西部 (オレゴン) リージョンにレプリカを含むグローバルテーブルがあり、米国東部 (バージニア北部) リージョンで `TransactWriteItems` オペレーションを実行するとします。この場合、変更がレプリケートされると、米国西部 (オレゴン) リージョンで部分的に完了したトランザクションを確認できます。変更は、ソースリージョンでコミットされると、他のリージョンにのみレプリケートされます。

## DynamoDB Streams
<a name="constraints-dynamodb-streams"></a>

### DynamoDB Streams でのシャードの同時読み込み
<a name="limits-dynamodb-streams-simultaneous-shard-readers"></a>

単一リージョンのテーブルがグローバルテーブルでない場合、同じ DynamoDB Streams のシャードから、同時に 2 つまでのプロセスを読み込むように設計できます。この制限を超えると、リクエストのスロットリングが発生する場合があります。グローバルテーブルでは、リクエストのスロットリングを回避するために、同時リーダーの数を 1 に制限することをお勧めします。

## DynamoDB Accelerator (DAX)
<a name="limits-dax"></a>

### AWS が利用可能なリージョン
<a name="limits-dax-regions"></a>

DAX を使用できる AWS リージョンのリストについては、「*AWS 全般のリファレンス*」の「[DynamoDB アクセラレーター (DAX)](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_dax_region)」を参照してください。

### ノード
<a name="limits-dax-nodes"></a>

DAX クラスターは、1 つのみのプライマリノードと、0～10 個のリードレプリカノードで構成されます。

ノードの総数 (AWS アカウントごと) は、1 つの AWS リージョン内で 50 を超えることはできません。

### パラメータグループ
<a name="limits-dax-parameter-groups"></a>

リージョンごとに最大 20 の DAX パラメータグループを作成できます。

### サブネットグループ
<a name="limits-dax-subnet-groups"></a>

リージョンごとに最大 50 の DAX サブネットグループを作成できます。

サブネットグループ内では、最大 20 のサブネットを定義できます。

**重要**  
DAX クラスターは、最大 500 の DynamoDB テーブルをサポートします。DynamoDB テーブルが 500 を超えると、クラスターの可用性とパフォーマンスが低下する可能性があります。

## API 固有の制約
<a name="limits-api"></a>

**`CreateTable`/`UpdateTable`/`DeleteTable`/`PutResourcePolicy`/`DeleteResourcePolicy`**  
一般に、[CreateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_CreateTable.html)、[UpdateTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html)、[DeleteTable](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteTable.html)、[PutResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutResourcePolicy.html)、[DeleteResourcePolicy](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteResourcePolicy.html) のリクエストは、どのような組み合わせでも最大 500 件まで同時に実行できます。その結果、`CREATING`、`UPDATING`、または `DELETING` の状態のテーブルの合計数が 500 を超えることはできません。  
テーブルグループ全体で任意の組み合わせで、ミュータブル (`CreateTable`、`DeleteTable`、`UpdateTable`、`PutResourcePolicy`、`DeleteResourcePolicy`) コントロールプレーン API リクエストを 1 秒あたり最大 2,500 回送信できます。ただし、`PutResourcePolicy` リクエストおよび `DeleteResourcePolicy` リクエストにはそれぞれ下限があります。詳細については、`PutResourcePolicy` と `DeleteResourcePolicy` のクォータに関する以下の詳細を参照してください。  
また、リソースベースのポリシーを含む `CreateTable` リクエストおよび `PutResourcePolicy` リクエストは、ポリシーの KB ごとに 2 つの追加リクエストとしてカウントされます。例えば、サイズが 5 KB のポリシーの `CreateTable` リクエストまたは `PutResourcePolicy` リクエストは 11 リクエストとしてカウントされます。1 つは `CreateTable` リクエスト、10 はリソースベースのポリシー (2 x 5 KB) です。同様に、サイズが 20 KB のポリシーは 41 件のリクエストとしてカウントされます。1 つはリクエストで、40 はリソースベースのポリシー (2 x 20 KB) です。    
`PutResourcePolicy`  
1 つのテーブルで 1 秒あたり最大 25 個の `PutResourcePolicy` API リクエストを送信できます。個々のテーブルのリクエストが成功すると、その後の 15 秒間、新しい `PutResourcePolicy` リクエストはサポートされません。  
リソースベースのポリシードキュメントでサポートされる最大サイズは 20 KB です。DynamoDB では、この上限に照らしてポリシーのサイズを計算する際に空白はカウントされません。  
`DeleteResourcePolicy`  
1 つのテーブルで 1 秒あたり最大 50 個の `DeleteResourcePolicy` API リクエストを送信できます。個々のテーブルの `PutResourcePolicy` リクエストが成功すると、その後の 15 秒間、`DeleteResourcePolicy` リクエストはサポートされません。

**`BatchGetItem`**  
1 回の `BatchGetItem` オペレーションで、最大 100 項目を取得できます。取得するすべての項目の合計サイズが 16 MB を超えてはいけません。

**`BatchWriteItem`**  
1 回の `BatchWriteItem` オペレーションでは、最大 25 の `PutItem`、または `DeleteItem` リクエストを含むことができます。書き込むすべての項目の合計サイズが 16 MB を超えてはいけません。

**`DescribeStream`**  
`DescribeStream` は最大で毎秒 10 回呼び出すことができます。

**`DescribeTableReplicaAutoScaling`**  
`DescribeTableReplicaAutoScaling` メソッドでは、1 秒あたり 10 リクエストのみサポートされます。

**`DescribeLimits`**  
`DescribeLimits` は定期的に呼び出すのみにします。1 分以内に複数回呼び出すと、スロットリングエラーが発生する可能性があります。

**`DescribeContributorInsights`/`ListContributorInsights`/`UpdateContributorInsights`**  
`DescribeContributorInsights`、`ListContributorInsights`、および`UpdateContributorInsights` は定期的に呼び出すのみにします。DynamoDB では、これらの API のそれぞれで 1 秒あたり最大 5 つのリクエストがサポートされます。

**`DescribeTable`/`ListTables`/`GetResourcePolicy`**  
読み取り専用 (`DescribeTable`、`ListTables`、`GetResourcePolicy`) コントロールプレーン API リクエストを組み合わせて、1 秒あたり最大 2,500 回送信できます。`GetResourcePolicy` API には、1 秒あたり 100 リクエストという個別の下限があります。

**`DescribeTimeToLive`**  
`DescribeTimeToLive` オペレーションは、1 秒あたり 10 個の読み取りリクエストユニットでスロットリングされます。この制限を超えると、DynamoDB は `ThrottlingException` エラーを返します。

**`Query`**  
`Query` の結果セットは、1 回の呼び出しあたり 1 MB に制限されます。クエリ応答から `LastEvaluatedKey` を使用して、結果をさらに取り出すこともできます。

**`Scan`**  
`Scan` の結果セットは、1 回の呼び出しあたり 1 MB に制限されます。スキャン応答から `LastEvaluatedKey` を使用して、結果をさらに取り出すこともできます。

**`UpdateKinesisStreamingDestination`**  
`UpdateKinesisStreamingDestination` オペレーションを実行する場合、24 時間に最大 3 回、`ApproximateCreationDateTimePrecision` を新しい値に設定できます。

**`UpdateTableReplicaAutoScaling`**  
`UpdateTableReplicaAutoScaling` メソッドでは、1 秒あたり 10 リクエストのみサポートされます。

**`UpdateTableTimeToLive`**  
`UpdateTableTimeToLive` メソッドでは、指定されたテーブルごとに、`Time to Live (TTL)` の有効化または無効化のリクエストが 1 時間あたり 1 つだけサポートされます。この変更が完全に処理されるまでに最大で 1 時間かかる場合があります。この 1 時間の間に同じテーブルに対して追加の `UpdateTimeToLive` 呼び出しが行われると、ValidationException が発生します。

## 保管時の DynamoDB 暗号化
<a name="limits-dynamodb-encryption"></a>

AWS 所有のキー、AWS マネージドキー、カスタマーマネージドキーは 24 時間いつでも切り替えることができます。テーブルの作成時から、テーブル単位で最大 4 回まで切り替え可能です。また、過去 6 時間以内に変更がなかった場合は、追加で変更することができます。これにより、1 日で変更できる最大の回数は 8 回になります (1 日の中で最初の 6 時間は 4 回、その後は 6 時間ごとに 1 回)。

AWS 所有のキー を使用する暗号化キーの切り替えは、上述のクォータを使い尽くしても、必要な回数だけ行うことができます。

クォータの拡大をリクエストしない限り、以下のクォータが適用されます。サービスクォータの増加をリクエストするには、[https://aws.amazon.com/support](https://aws.amazon.com/support) を参照してください。