テーブル(暗黙的なインデックス)

PrimaryKey

DynamoDBのプライマリキーはパーティションキーのみのものとソートキーを組み合わせた複合キーがある。

PartitionKey (HashKey)

Amazon DynamoDB はデータをパーティションに保存します。パーティションは、ソリッドステートドライブ (SSD) によってバックアップされ、AWS リージョン内の複数のアベイラビリティーゾーン間で自動的にレプリケートされる、テーブル用のストレージの割り当てです。
一般的に言えば、テーブルとそのセカンダリインデックスの論理的なすべてのパーティションキー全体でアクティビティが均一になるようにアプリケーションを設計する必要があります。

パーティションキーのみのプライマリキーの場合、プライマリキーで一意にレコードを特定する。

SortKey (RangeKey)

Amazon DynamoDB テーブルで、テーブルの各項目を一意に識別する主キーは、パーティションキーだけでなくソートキーから構成されている場合があります。

設計が優れたソートキーには、2 つの主な利点があります。

関連情報を 1 つの場所にまとめて、効率的にクエリを実行することができます。ソートキーを慎重に設計することで、begins_with、between、>、< などの演算子による範囲のクエリを使用して、一般的に必要な関連項目のグループを検索することができます。

複合ソートキーを作成すれば、データの階層的 (1 対多) な関係を定義して、任意の階層レベルでクエリを実行することができます。

パーティションキー+ソートキーのプライマリキーの場合、この組合せで一意にレコードを特定する。
また、ソートキーにより範囲検索が可能になる。

インデックス

LocalSecondaryIndexes (LSI)

local secondary index は特定のパーティションキー値の代替ソートキーを維持します。また local secondary index には、ベーステーブルの一部またはすべての属性のコピーが含まれます。テーブルを作成する際に、local secondary index に射影する属性を指定します。local secondary indexのデータは、ベーステーブルと同じパーティションキーと、異なるソートキーで構成されます。これにより、この異なるディメンションにわたってデータ項目に効率的にアクセスできます。クエリまたはスキャンの柔軟性を向上するために、テーブルごとに最大 5 つのlocal secondary indexを作成できます。

テーブルとは異なるソートキーを持つインデックス。最大5個まで作成できる。

local secondary index は、すべて次の条件を満たす必要があります。
パーティションキーはそのベーステーブルのパーティションキーと同じである。
ソートキーは完全に 1 つのスカラー属性で構成されている。
ベーステーブルのソートキーがインデックスに射影され、非キー属性として機能する。

パーティションキーは同じで、テーブルのソートキーは非キー属性として機能する。

ローカルセカンダリインデックスがあるテーブルには、パーティションキーの値ごとに 10 GB のサイズ制限があります。ローカルセカンダリインデックスがあるテーブルには、1 つのパーティションキー値の合計サイズが 10 GB を超えない限り、任意の数の項目を格納できます。

GlobalSecondaryIndexes (GSI)

非キー属性に対するクエリの速度を上げるために、グローバルセカンダリインデックス を作成できます。グローバルセカンダリインデックスには、ベーステーブルからの属性の一部が格納されますが、テーブルのプライマリキーとは異なるプライマリキーによって構成されます。インデックスキーは、テーブルからのキー属性を持つ必要がありません。また、テーブルと同じキースキーマを使用する必要もありません。

テーブルとは異なるパーティションキーを持つインデックス。

すべてのグローバルセカンダリインデックスには、パーティションキーが必要で、オプションのソートキーを指定できます。インデックスキースキーマは、テーブルスキーマとは異なるものにすることができます。

テーブルスキーマと異なるパーティションキーとソートキーを利用することができる。

DynamoDB テーブルでは、各キー値は一意である必要があります。ただし、グローバルセカンダリインデックス のキー値は一意である必要はありません。

グローバルセカンダリーインデックスのキーは一意でなくていい。

簡単なテーブルを作成する

dynamodb.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
AWSTemplateFormatVersion: "2010-09-09"
Description: DynamoDB

Metadata:
# ------------------------------------------------------------ #
# Input Parameters
# ------------------------------------------------------------ #
"AWS::CloudFormation::Interface":
ParameterGroups:
- Label:
default: "Dynamo DB"
Parameters:
- TableName

ParameterLabels:
TableName:
default: "myTable"

Parameters:
TableName:
Type: String

Resources:
# ------------------------------------------------------------ #
# DynamoDB
# ------------------------------------------------------------ #
Resources:
DDBTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: !Ref TableName
AttributeDefinitions:
-
AttributeName: "ArtistId"
AttributeType: "S"
-
AttributeName: "Concert"
AttributeType: "S"
-
AttributeName: "TicketSales"
AttributeType: "S"
KeySchema:
-
AttributeName: "ArtistId"
KeyType: "HASH"
-
AttributeName: "Concert"
KeyType: "RANGE"
GlobalSecondaryIndexes:
-
IndexName: "GSI"
KeySchema:
-
AttributeName: "TicketSales"
KeyType: "HASH"
Projection:
ProjectionType: "KEYS_ONLY"
ProvisionedThroughput:
ReadCapacityUnits: 5
WriteCapacityUnits: 5
ProvisionedThroughput:
ReadCapacityUnits: 5
WriteCapacityUnits: 5

# ------------------------------------------------------------ #
# Output Parameters
# ------------------------------------------------------------ #
Outputs:
DynamoDBTable:
Value: !Ref DDBTable

parameters.json

ホストするドメイン名

1
2
3
4
5
6
[
{
"ParameterKey": "TableName",
"ParameterValue": "mytesttable"
}
]

CloudFormationでテーブルを作成する

1
2
3
4
$ aws cloudformation create-stack --stack-name tutorial-dynamodb --template-body "file://./dynamodb.yml" --parameters "file://./parameters.json"
{
"StackId": "arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXX:stack/tutorial-dynamodb/XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}

作成されたテーブル

AWS Consoleのダッシュボードでキャパシティを確認できる。
今回の例ではテーブルとインデックスで、読み込み書き込みそれぞれ5ユニット指定しているため、10になっている。

DynamoDB Table width=640

テーブルには作成されたテーブルが表示されている。

DynamoDB Table width=640

項目でテーブルの内容を確認できる。今回の例ではインデックス以外の属性が見えている。

DynamoDB Table width=640

キャパシティータブでは設定したキャパシティの内訳を見ることができる。

DynamoDB Table width=640

作成したインデックス。

DynamoDB Table width=640

Table

AttributeDefinitions

AttributeType
属性のデータ型。
S - 属性は文字列型
N - 属性は数値型
B - 属性はバイナリ型

KeySchema

KeyType
キー属性が担うロール:
HASH - パーティションキー
RANGE - ソートキー

LocalSecondaryIndex / GlobalSecondaryIndex