こんにちは!
エンタープライズクラウド部技術2課の日高です。
本日は、過去に社内向けに作成したAmazon DynamoDB(今後はDynamoDBと表記)ハンズオンをブログ化しようと思います。
目的としては、「初心者の方がDynamoDBのテーブルの基礎知識をハンズオンを通して理解してもらうこと」です。
Amazon DynamoDBの概要
Amazon DynamoDB は完全マネージド型の NoSQL データベース・サービスで、高い拡張性を持っています。
※詳しくは以下をご覧ください
テーブル設計の基礎知識
Key-Valueストアについて

DynamoDBは「値(Value)」とそれを取得するための「キー(Key)」だけを格納するというシンプルな機能を持った「Key-Valueストア」です。
シンプルな構造のため、単純なデータモデルと高速な読み取り/書き込みアクセスが求められるシナリオに特に適しています。
ユースケースの一例は下記になります。
セッション管理、キャッシュ、非同期アプリ etc...
テーブルの3つの概念について
DynamoDBには主に「table」「items(項目)」「attribute(属性)」という3つの概念が現れます。
それに従属する概念として「キー」「インデックス」が出てきます。
この章では「table」「item(項目)」「attribute(属性)」について記載していきます。

Table
tableというのはみなさん分かりやすいと思います。
概ねRDBで言うところのテーブルに相当し、itemの集合体です。
DynamoDBのtableには「パーティションキーのみを使用したテーブル」と「パーティションキー+ソートキーを使用したテーブル」の2種類があります。
後ほど詳しく後述するので、DynamoDBのテーブルの種類は2種類あるという事を抑えておいてください。
items
概ねRDBで言うところのrow(行)に相当します。
ただ、DynamoDBにおけるitemsは、正規化を行う必要はありません。
下記にitemsの一例を示します。これはProductCatalog(商品情報)というtableに入っている2つのitemのイメージです。
このように1つのJSONオブジェクトで表現できるデータがitemsに相当します。
items①
{
"Id": 101,
"Title": "Book Title",
"ISBN": "111-1111111111",
"Authors": [ "Author 1", "Author 2" ],
"Price": "20.99",
}
items②
{
"Id": 203,
"Title": "Book Title2",
"ISBN": "111-1111111111",
"Price": "20.99",
}
attributes
概ねRDBで言うところのcolumn(列)に相当します。
データとしては文字列でも配列でも構いません。
特徴としては、RDBと違いアイテム間で不揃いでも問題ないところです。

データの保存について

DynamoDBではデータを保存する際に3つのAZに自動でデータをコピーします。
この機能により、予期しないサーバー障害やアベイラビリティーゾーンの停止からデータを保護します。
20170809_AWS-BlackBelt-DynamoDB_rev.pdf抜粋
また、DynamoDBではデータ保存の際に複数のノードを用意し、データごとに受け持つノードを分けて対応します。
このノードのことを、DynamoDBにおいては「パーティション」と呼びます。
パーティションでは、プロビジョンしたスループットは各パーティションに均等に付与され、全体で合計値の性能が出るように設計されています。
この保存したデータを使用・検索する際に後述するプライマリーキーが必要になります。
プライマリーキーについて
DynamoDBで は 2 種類の異なるプライマリキーをサポートしています。
プライマリーキーがあることにより、1つのitemを特定することができ、DynamoDBではプライマリーキーを「パーティションキー」のみで表現する場合、「パーティションキー+ソートキー」で表現する場合があります。
またプライマリーキーにはnot null 制約があり、必ず値をいれないといけません。
プライマリーキーをパーティションキーのみで表現する場合
パーティションキーとは、DynamoDBを作成する際に、必須の項目になっています。

上記のテーブルは日付というパーティションキーが分かりさえすれば、1つのitemを特定することができます。 このようにプライマリーキーをパーティションキーのみで表現することができます。
プライマリーキーをパーティションキーとソートキーで表現する場合

上記の図では鳥(パーティションキー)のみではitemを一意に特定することができません。
ですが、鳥(パーティションキー)+マメ(ソートキー)の2つのキーの組み合わせによりitemを特定することができます。
このようにパーティションキーのみでは、1つのitemを特定することができない場合パーティションキーとソートキーを使用します。
DynamoDBのテーブル作成のハンズオン
この章では実際にハンズオンを通して、簡単なDynamoDBのテーブル作成手順について学んでいただきます。
プライマリーキーがパーティションキーで表現されるテーブル
目標
本ハンズオンでマネジメントコンソール上で、以下のようなテーブルを作成できるようになります。

テーブルの作成
DynamoDBのテーブルを作成します。
- マネジメントコンソールからDynamoDBの画面に遷移します
- DynamoDBの左ペインから「テーブル」を選択します
- 「テーブルの作成」を選択します
- 「テーブルの詳細」にて以下のパラメーターを記入してください
- 「テーブル設定」「タグ」はデフォルトのままで「テーブルの作成」を選択します。
※「テーブルの詳細」パラメーター

以上でテーブル名とパーティションキーを指定することができ以下の段階まで作成することができました。

itemsの作成
作成したテーブルにitemを作成していきます。
マネジメントコンソールではGUIで行う方法(フォーム)と、JSONで記述する方法(JSONビュー)があるので両方行ってみましょう。
GUIで行う方法(フォーム)
ここでは、以下の3つのitemを作成したいと思います。

まず「date」(パーティションキー)が「20230101」のitemを作成していきます。
- DynamoDBの左ペインから「項目を探索」を選択します
- 作成したテーブル(handon-(名前))を選択します
- 「返された項目」の「項目を作成」を選択します
- そうすると以下のような画面が表示されます。
このようにパーティションキーに指定したattributes(属性)は入力が求められます
- dateのattributesの「値」に「20230101」と入力します
- 「新しい属性の追加」を選択し、「文字列」をクリックします
- 新しく作成されたattributesの「属性名」を「weather」とします
- weatherのattributesの「値」に「sunny」と入力します
ここまで完了すると以下のような画面になります
- 「新しい属性の追加」を選択し、「数値」をクリックします
- 新しく作成されたattributesの「属性名」を「temperature」、「値」を「11」とします
- 「新しい属性の追加」を選択し、「数値」をクリックします
- 新しく作成されたattributesの「属性名」を「humidity 」、「値」を「20」とします
ここまで完了すると以下のような画面になります
- 「項目を作成」を選択します。これでitemがテーブルに追加されました
次に「date」(パーティションキー)が「20230102」のitemを作成していきます。
- 「返された項目」の「項目を作成」を選択します
- dateのattributesの「値」に「20230102」と入力します
- 「新しい属性の追加」を選択し、「文字列」をクリックします
- 新しく作成されたattributesの「属性名」を「weathe」、「値」に「sunny」と入力します
- 「新しい属性の追加」を選択し、「数値」をクリックします
- 新しく作成されたattributesの「属性名」を「temperature」、「値」に「5」と入力します
- 今回humidityは記入する必要がないので、「項目を作成」を選択します
最後にご自身で「date」(パーティションキー)が「20230103」のitemsを作成してみてください。
以上で、テーブルに以下の3つのitemを作成することができました。

JSONで記述する方法(JSONビュー)
ここでは、以下の2つのitemを作成したいと思います。

まず「date」(パーティションキー)が「20230104」のitemを作成していきます。
- 「返された項目」の「項目を作成」を選択します
- 「JSONビュー」を選択します
- この画面の1~5行目を削除します

- 以下のJSONをコピーして貼り付けます。
- 「項目の作成」を選択します
{
"date": {
"N": "20230104"
},
"weather": {
"S": "cloudy"
}
}
そうすると返された項目にitemsが追加されているのが確認できると思います。
少しこのJSONを詳しく見ていきましょう。
1つのattributesにつき、以下のような構成になっています
{
"属性名": {
"属性のタイプを示す文字列": "値"
},
"属性名": {
"属性のタイプを示す文字列": "値"
}
}
属性のタイプを示す文字列の一覧は以下のようになります。

それでは「date」(パーティションキー)が「20230105」のitemをJSONで作成してみてください。

こちらにJSONの答えを貼っておきます。
{
"date": {
"N": "20230105"
},
"temperature": {
"N": "12"
}
}
以上の操作でこのようなテーブルを作成することができました。

プライマリーキーがパーティションキー+ソートキーで表現されるテーブル
目標
本ハンズオンでマネジメントコンソール上で、以下のようなテーブルを作成できるようになります。

テーブルの作成
DynamoDBのテーブルを作成します。
- マネジメントコンソールからDynamoDBの画面に遷移します
- DynamoDBの左ペインから「テーブル」を選択します
- 「テーブルの作成」を選択します
- 「テーブルの詳細」にて以下のパラメーターを記入してください
- 「テーブル設定」「タグ」はデフォルトのままで「テーブルの作成」を選択します。

以上でテーブル名とパーティションキーを指定することができ以下の段階まで作成することができました。

itemsの作成
テーブルにitemsを作成していきます。
作成方法は「プライマリーキーがパーティションキーで表現されるテーブル」とほぼ変わりません。
今回もマネジメントコンソールではGUIで行う方法(フォーム)と、JSONで記述する方法(JSONビュー)があるので両方行ってみましょう。
GUIで行う方法(フォーム)
ここでは以下の2つのitemを作成したいと思います。

まず「AnimalType」(パーティションキー)が「Dog」、「Name」(ソートキー)が「mame」のitemを作成していきます。
- DynamoDBの左ペインから「項目を探索」を選択します
- 作成したテーブル(handon-(名前)-2)を選択します
- 「返された項目」の「項目を作成」を選択します
- そうすると以下のような画面が表示されます。
このようにパーティションキー、ソートキーに指定したattributes(属性)は入力が求められます
- AnimalTypeのattributesの「値」に「Dog」、Nameのattributesの「値」に「mame」と入力します
- 「新しい属性の追加」を選択し、「文字列」をクリックします
- 新しく作成されたattributesの「属性名」を「sex」とします
- sexのattributesの「値」に「female」と入力します
- 「項目を作成」を選択します。これでitemがテーブルに追加されました
次に「AnimalType」(パーティションキー)が「Cat」、「Name」(ソートキー)が「Fiuffy」のitemを作成してみてください。
すべての値を入力した画面はこちらになります。

以上で、テーブルに以下の2つのitemを作成することができました。

JSONで記述する方法(JSONビュー)
ここでは、以下の2つのitemを作成したいと思います。

まず「AnimalType」(パーティションキー)が「Fish」、「Name」(ソートキー)が「Blud」のitemを作成していきます。
- 「返された項目」の「項目を作成」を選択します
- 「JSONビュー」を選択します
- この画面の1~8行目を削除します
- 以下のJSONをコピーして貼り付けます。
- 「項目の作成」を選択します
そうすると返された項目にitemが追加されているのが確認できると思います。
{
"AnimalType": {
"S": "Fish"
},
"Name": {
"S": "Blud"
},
"body weight": {
"N": "1"
}
}
それでは、JSONビューで「AnimalType」(パーティションキー)が「Dog」、「Name」(ソートキー)が「Bowser」のitemを作成してみてください。

こちらにJSONの答えを貼っておきます。
{
"AnimalType": {
"S": "Dog"
},
"Name": {
"S": "Bowser"
},
"sex": {
"S": "male"
}
}
以上の操作でこのようなパーティションキーとソートキーを使用したテーブルを作成することができました。

まとめ
今回はDynamoDBのテーブルについて焦点を当てて解説をしてみました。
今後、インデックスやキャパシティモードについてもブログを書いてみようかなと考えています。
本記事が誰かの助けになれば幸いです。
日高 僚太(執筆記事の一覧)
2024 Japan AWS Jr. Champions / 2024 Japan AWS All Certifications Engineers / Japan AWS Jr. Champions of the Year 2024
EC部クラウドコンサルティング1課所属。2022年IT未経験でSWXへ新卒入社。
記事に関するお問い合わせや修正依頼⇒ hidaka@serverworks.co.jp