こんにちは!
エンタープライズクラウド部技術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
EC部クラウドコンサルティング課所属。2022年IT未経験でSWXへ新卒入社。
記事に関するお問い合わせや修正依頼⇒ hidaka@serverworks.co.jp