DynamoDBを触ってみた

そろそろRDB以外のDB製品、サービスも少し勉強しておかないとなということでNoSQLデータベースと言われるAWSのDynamoDBをガチャガチャ弄ってみたのでメモ。通常のRDBとの違いや利用に向いているユースケース、具体的な利用手順などをまとめてみた。


## 1.DynamoDBの概要
NoSQL型のSaaSサービス型のデータベース製品でNoSQL名称から勘違いしがちだがSQL自体は利用可能。（NotOnlySQLだそうです）個人的な理解ではRDBで使うような複雑な結合や副問い合わせの機能は備えておらず、シンプルな問い合わせや拡張性に強みを持つDBと言った感じだ。

おなじみのRDBと差別化するならば
・単一テーブルでデータが大量にある
・非構造化データ（テーブルカラムの事前定義が困難、利用しながらスケールしたい）
・複雑なテーブルの結合や問い合わせが発生しない
上記の様なユースケースのシステムに向いているDB製品と言えるのでしょう。


## 2.テーブルを作成してみる
実際にAWSからサービスを利用してみる

AWSマネジメントコンソールにログイン後
「DynamoDB」→「テーブル」→「テーブルの作成」クリック

<b>テーブル名：user</b>
<b>パーティションキー：userid</b>
テーブルのプライマリーキーです、セカンドプライマリーキーが必要な場合はソートキーも定義します。今回はしません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/6c52793a-aa86-9e85-78a1-714ba847a08f.png)
カラムの定義はこれだけです、あとのカラムの情報はアプリ側からの登録データに応じて自動的にオートスケール（カラム追加）されていくようです。
<br>
あとは細かいテーブルのオプション設定を行います。
<b>テーブル設定：設定をカスタマイズ</b>
デフォルト設定でもいいですが各オプションの設定値の確認も込めてカスタマイズを選択します。テーブルクラスは読み書きメインなのでDynamoDB標準を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/759533e0-53ed-5e2e-9e10-be159e7aeb44.png)
<br>
続いてキャパシティの設定です。
<b>キャパシティモード：オンデマンド</b>
プロビジョンドはDBのキャパシティをあらかじめ計算し事前に割り当てておく管理方法です、オンデマンドは実績に応じてキャパシティを割り当てる方法です、料金支払いに効いてくるオプションです。私はPoC用で大して使わないのでオンデマンドにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/0d1e6338-617d-06f0-f9d6-4a6f80ac8525.png)
<br>
セカンダリインデックスは特に使用しません。セカンダリインデックスを指定するとプライマリキーでない属性に対してクエリの実行ができます。今回は想定してないユースケースなので未設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/1fa73a0d-0d80-bb73-e198-a23cb6a57c89.png)

<b>暗号化キーの管理：Amazon DynamoDBが所有</b>
暗号化キーをどこで管理するか指定します専用のキー管理サービスKMSで管理もできますが今回はDynamoDB内で管理します。（鍵の運用負荷やセキュリティはそこまで気にしないため）
<b>削除保護:オフ</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/4e67f04e-d0a6-3141-ee99-236c1275b28e.png)
<br>
リソースベースのポリシーは設定しません。（テーブル単位でアクセスするユーザーの制限などを行いたい場合に設定します。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/a0971edd-9543-6c0e-af08-2f857bc6f659.png)
<br>
これでテーブルの作成を行うとテーブルが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/1766828e-5051-be78-ac16-81be0a0d7af3.png)




## 3.使ってみる
まずはDynamoDBの管理画面からデータを追加してみる。
「DynamoDB」→「テーブル」→「user」（さっき作ったテーブル）→「テーブルアイテムの探索」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/44aa6281-5b16-8e07-a454-d90320bb5bd5.png)

現状useridだけしかカラムが無いのでユーザー名のカラム追加して１レコードデータを登録してみる。
「項目を作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/e5105a09-3720-56b7-9657-ad6f3e52b1b2.png)

「新しい属性の追加」→「文字列」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/24d54ab3-5192-a229-ca45-93df53f8a748.png)

新しく「name」の属性をセットし値を入力→「項目を作成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/000fa641-1182-2e1a-ebb6-a5bbdaaa003c.png)

データが１レコード作成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/e3a2249b-e56a-887c-9236-03472d58c9e6.png)

## 4.オートスケーリングの動きを見てみる
DynamoDBでのオートスケーリングの確認として以下のデータを追加で登録する。
テーブル上すでに文字列型で作成されているnameに数値型のデータを登録、またテーブルに定義されてない新しくphoneというカラムを追加する。
userid:003
name:1000
phone:999-9999-9999
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/d8f1ded1-2d1e-551b-c3ba-e2d2cfa9a9a3.png)



name属性で違う型（数値型）でレコードが作成され、新しいテーブル属性にphoneが追加されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/96293013-b738-6934-7a88-adc686962961.png)

なるほど、カラムの属性は同じ名前でも型が違う場合はエラーにならず項目に応じた型が定義されていくのね。。。
<br>
ちなみにBinary（Base64でエンコード）データの登録も可能。
このデータをセレクトしてアプリ側でデーコードしてあげれば写真データも閲覧できる。
アプリ側でユーザーの外見（appearance）の入力画面を作成して、文章や写真データなどで自由に登録させたいようなユースケースでうまく活用できそうですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/111e8d29-7f7f-076b-997a-51a311d6697f.png)




<br>
参考（少し古い動画なので概念を抑える程度で） 

https://www.youtube.com/watch?v=7br6H1SscUg