【AWS】DynamoDBをコンソール上から使ってみる

![Arch_Amazon-DynamoDB_64@5x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/6896b7ae-f919-6aa3-9603-4596e97322eb.png)


# はじめに
どーも、のぶこふです。


[re:Invent](https://aws.amazon.com/jp/about-aws/events/2021/reinvent/)も終わり、年の瀬が一層近く感じますね。
まだまだアップデートは把握しきれてませんが、毎年こうして大規模アップデートや新サービスの発表などはワクワクします。

あ、この記事は[GFAMアドベントカレンダー2021](https://qiita.com/advent-calendar/2021/gfam)の5日目の記事です。

今回は、DBサービスの一つである「DynamoDB」に焦点を当てていきます。
ソースコードは触らずに、DynamoDBコンソールからの動作確認のみを行います。

# 今回のサービス一覧

|Service名とか|概要|
|--|--|
|DynamoDB [^dynamodb][^dynamodb-blackbelt]|マネージドなNoSQLDB|

# DynamoDB
まずは、簡単に概要を抑えておきます。

* 完全マネージド型のNoSQLデータベースサービス
* ハイスケーラブル、低レイテンシー

### 管理不要、高い信頼性
* SPOFが存在しない
* データは3箇所のAZに保存
* ストレージは必要に応じて、自動的にパーティショニングされる

### プロビジョンドスループット
* デーブルごとにReadとWriteのスループットキャパシティを割り当てることができる。
* 例えば・・・
    * 初期設定：Read：1,000、Write：100
    * 書き込みワークロードが上がった：Read：500、Write：1,000
* この値は、DB運用中にオンラインで変更可能

### ストレージ容量制限無し
* 使った分だけの従量課金
    * ディスクやノードの増設作業は不要

### 整合性モデル
* Write
    * 少なくとも2つのAZで書き込み完了確認がとれた時点
* Read
    * デフォルト
        * 「結果整合性」のある読み込み
            * 最新の書き込み結果が、即時読み取り処理に反映されない可能性がある
    * Consistent Read Option
        * GetItem、Query、Scanでは「強力な整合性」のある読み込みオプションが指定可能
            * Readリクエストを受け取る前までのWriteが全て反映されたレスポンスを保証
            * Capacity Unitを2倍消費

### Capacity Unit？
* ユニットと呼ばれる単位
* それぞれ25ユニットまで無料
* Write
    * 最大1KBのデータを1秒に1回書き込み可能
* Read
    * 最大4KBのデータを1秒に1回読み取り可能
        * 強い一貫性を持たないのであれば、1秒に2回読み取り可能

### ユースケース
* KVS
    * ユーザ情報の格納
* 広告やゲーム等のユーザ行動履歴DB
    * ユーザIDごとに複数の行動履歴を監理
* モバイルアプリのバックエンド
    * モバイルアプリから直接参照
* その他
    * バッチ処理のロック監理
    * フラッシュマーケティング
    * ストレージのインデックス

### DynamoDBの構成
* HTTPベースのAPIが提供されている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/4f9184a7-8c1e-796a-5ce0-7f381762d7f9.png)

https://www.slideshare.net/AmazonWebServicesJapan/20170809-black-belt-dynamodb/15

### テーブル設計
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/cdf7cf64-dc92-0cfd-e1f4-c897168b34be.png)

https://www.slideshare.net/AmazonWebServicesJapan/20170809-black-belt-dynamodb/21

### テーブル操作（一部

|名称|操作|
|--|--|
|GetItem|Partation Keyを条件として指定し、1件のアイテムを取得|
|PutItem|1件のアイテムを書き込む|
|Update|1件のアイテムを更新|
|Delete|1件のアイテムを削除|
|Query|Partation KeyとSort Keyの複合条件にマッチするアイテム群を取得※|
|BatchGet|複数のPRIMARY KEYを指定してマッチするアイテム群を取得|
|Scan|テーブルを総なめ※|

※最大1MBのデータを取得可能

# 使い方
### テーブルの作成
1. DynamoDBコンソールを開く
1. リージョンを確認しておく
1. テーブルの作成を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/3a2109c6-f0e5-cfc1-ad00-6dc77f49e411.png)

1. 「テーブルの作成」を選択する
1. 作成まで、しばし待つ（1分くらい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/b1a9d15d-bfe2-12d0-8188-401904b3cfa2.png)


|項目名|設定値|
|--|--|
|テーブル名|User|
|パーティションキー|UserId：文字列|
|ソートキー|無し|
|設定|デフォルト設定|
|デフォルト設定|特になし|
|タグ|Key：Name、Value：Test|

### アイテムの作成
※SDKを介して作成したり、追加したりのほうが汎用的だと思いますが、まずはマネコンから・・・

1. 作成したテーブル詳細を開く
1. アクション ＞ Create Item を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/eded24ff-6000-2914-b6c7-6c030e8b5fbd.png)

1. フォーム、またはJSONで情報を入力して、「項目の作成」を選択する

```json
// JSONの例
{
 "UserId": "0001",
 "Name": "Nobkovskii"
}
```

### アイテムの検索
1. 「項目」から、対象のテーブルを選択する
1. 検索条件を入力して、「実行する」を選択する
    1. 対象が存在する例
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/1a67c2cb-16f8-b229-cd2f-88a2de95836e.png)

    1. 対象が存在しない例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/2a662bb0-ca6d-60c6-c085-e4ff6dd09662.png)

    
### テーブルの削除
1. 対象のテーブルを選択して、「削除」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/069a1407-9e7b-1c85-f3ba-f3231de2f2a4.png)

1. 「削除」と入力して、「テーブルの削除」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306608/62553030-47db-ea36-0d66-e81ee01f7810.png)

# DynamoDB Accelerator（DAX）
リアルタイム処理や一時的なアクセス集中への対応など、読み取りが多い場合に爆速になってくれるやつ。
逆に、書き込みが多い・読み取りが少ない場合は、効果は今ひとつ。

* フルマネージド型高可用性インメモリキャッシュ[^dax]
    * DynamoDBに特化
        * DynamoDB APIと互換性があり、アプリケーションのロジックを変更する必要は無し。
    * ミリセカンド→マイクロセカンドへの、最大10倍のパフォーマンス向上を実現する！
    * キャッシュがあれば使う、なければオリジンから取得してキャッシュする
* マネジメントコンソールやSDKから簡単に使える
* VPC環境で動作

# おわりに
今回は、DynamoDBの概要調査と、コンソール上から簡単に触ってみました。
本来はSDKを介して、アイテムのCRUD（追加・検索・更新・削除）をしていくのが筋だと思いますが、概要を掴むということで、コンソール上からの操作までとしました。
テーブルの作成や項目追加も、サクッとできて、良い感じでした。

今回の内容だけでは「DynamoDBの良さ」は、全然理解に至らないので、アプリなどに組み込ませて使ってみたいです。

今回はここまでです。
ありがとうございました。

[^dynamodb]: [DynamoDB概要](https://aws.amazon.com/jp/dynamodb/)

[^dynamodb-blackbelt]: [DynamoDB-BlackBelt](https://d1.awsstatic.com/webinars/jp/pdf/services/20170809_AWS-BlackBelt-DynamoDB.pdf)

[^dax]: [DAX概要](https://aws.amazon.com/jp/dynamodb/dax/)