【初心者向け】Amazon DynamoDBのテーブル基礎を理解できるハンズオンを作ってみた

記事タイトルとURLをコピーする

こんにちは!
エンタープライズクラウド部技術2課の日高です。

本日は、過去に社内向けに作成したAmazon DynamoDB(今後はDynamoDBと表記)ハンズオンをブログ化しようと思います。
目的としては、「初心者の方がDynamoDBのテーブルの基礎知識をハンズオンを通して理解してもらうこと」です。

Amazon DynamoDBの概要

Amazon DynamoDB は完全マネージド型の NoSQL データベース・サービスで、高い拡張性を持っています。

※詳しくは以下をご覧ください

docs.aws.amazon.com

テーブル設計の基礎知識

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のテーブルを作成します。

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

※「テーブルの詳細」パラメーター

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

itemsの作成

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

GUIで行う方法(フォーム)

ここでは、以下の3つのitemを作成したいと思います。

まず「date」(パーティションキー)が「20230101」のitemを作成していきます。

  1. DynamoDBの左ペインから「項目を探索」を選択します
  2. 作成したテーブル(handon-(名前))を選択します
  3. 「返された項目」の「項目を作成」を選択します
  4. そうすると以下のような画面が表示されます。
    このようにパーティションキーに指定したattributes(属性)は入力が求められます
  5. dateのattributesの「値」に「20230101」と入力します
  6. 「新しい属性の追加」を選択し、「文字列」をクリックします
  7. 新しく作成されたattributesの「属性名」を「weather」とします
  8. weatherのattributesの「値」に「sunny」と入力します
    ここまで完了すると以下のような画面になります
  9. 「新しい属性の追加」を選択し、「数値」をクリックします
  10. 新しく作成されたattributesの「属性名」を「temperature」、「値」を「11」とします
  11. 「新しい属性の追加」を選択し、「数値」をクリックします
  12. 新しく作成されたattributesの「属性名」を「humidity 」、「値」を「20」とします
    ここまで完了すると以下のような画面になります
  13. 「項目を作成」を選択します。これでitemがテーブルに追加されました

次に「date」(パーティションキー)が「20230102」のitemを作成していきます。

  1. 「返された項目」の「項目を作成」を選択します
  2. dateのattributesの「値」に「20230102」と入力します
  3. 「新しい属性の追加」を選択し、「文字列」をクリックします
  4. 新しく作成されたattributesの「属性名」を「weathe」、「値」に「sunny」と入力します
  5. 「新しい属性の追加」を選択し、「数値」をクリックします
  6. 新しく作成されたattributesの「属性名」を「temperature」、「値」に「5」と入力します
  7. 今回humidityは記入する必要がないので、「項目を作成」を選択します

最後にご自身で「date」(パーティションキー)が「20230103」のitemsを作成してみてください。
以上で、テーブルに以下の3つのitemを作成することができました。

JSONで記述する方法(JSONビュー)

ここでは、以下の2つのitemを作成したいと思います。

まず「date」(パーティションキー)が「20230104」のitemを作成していきます。

  1. 「返された項目」の「項目を作成」を選択します
  2. 「JSONビュー」を選択します
  3. この画面の1~5行目を削除します
  4. 以下のJSONをコピーして貼り付けます。
  5. 「項目の作成」を選択します
 {
   "date": {
     "N": "20230104"
   },
   "weather": {
     "S": "cloudy"
   }
 }

そうすると返された項目にitemsが追加されているのが確認できると思います。

少しこのJSONを詳しく見ていきましょう。
1つのattributesにつき、以下のような構成になっています

 {
  "属性名": {
     "属性のタイプを示す文字列": "値"
   },
  "属性名": {
     "属性のタイプを示す文字列": "値"
   }
 }

属性のタイプを示す文字列の一覧は以下のようになります。

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

こちらにJSONの答えを貼っておきます。

{
  "date": {
    "N": "20230105"
  },
  "temperature": {
    "N": "12"
  }
}

以上の操作でこのようなテーブルを作成することができました。

プライマリーキーがパーティションキー+ソートキーで表現されるテーブル

目標

本ハンズオンでマネジメントコンソール上で、以下のようなテーブルを作成できるようになります。

テーブルの作成

DynamoDBのテーブルを作成します。

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

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

itemsの作成

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

GUIで行う方法(フォーム)

ここでは以下の2つのitemを作成したいと思います。

まず「AnimalType」(パーティションキー)が「Dog」、「Name」(ソートキー)が「mame」のitemを作成していきます。

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

次に「AnimalType」(パーティションキー)が「Cat」、「Name」(ソートキー)が「Fiuffy」のitemを作成してみてください。

すべての値を入力した画面はこちらになります。

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

JSONで記述する方法(JSONビュー)

ここでは、以下の2つのitemを作成したいと思います。

まず「AnimalType」(パーティションキー)が「Fish」、「Name」(ソートキー)が「Blud」のitemを作成していきます。

  1. 「返された項目」の「項目を作成」を選択します
  2. 「JSONビュー」を選択します
  3. この画面の1~8行目を削除します
  4. 以下のJSONをコピーして貼り付けます。
  5. 「項目の作成」を選択します
    そうすると返された項目に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のテーブルについて焦点を当てて解説をしてみました。
今後、インデックスやキャパシティモードについてもブログを書いてみようかなと考えています。

本記事が誰かの助けになれば幸いです。

日高 僚太(執筆記事の一覧)

EC部ソリューションアーキテクト2課 / AWS認定資格 12冠

2022年IT未経験で新卒入社しました。
最近はダーツとサウナが気になっています!
記事に関するお問い合わせや修正依頼⇒ hidaka@serverworks.co.jp