【AWS DynamoDB】基本構築

##目標
AWSのDynamoDBを構築し、簡単なテーブル操作をAWSコンソール及びAWS CLI上で実行

##DynamoDBとは
AWSが提供するキーバリュー型のマネージドデータストアサービスです。
データが3つのAZに分散して格納されるため耐久性が高く、格納容量に上限がありません。
また、キーバリュー形式でレイテンシーが低いため、キャッシュやWEBセッションの格納先としても利用されます。

より詳しくは以下記事が参考になります。
[【AWS】今更ながらDynamoDB入門](https://qiita.com/maaaato/items/4a0f5c1dcc78677973c9)

##参考AWSドキュメント
[NoSQL テーブルを作成してクエリを実行する](https://aws.amazon.com/jp/getting-started/hands-on/create-nosql-table/)

##作業の流れ
| 項番 | タイトル |
|:----:|:-------------|
| 1 | [DynamoDBを構築する](#1dynamodbを構築する) |
| 2 | [DynamoDBテーブルをAWSコンソール上から操作](#2dynamodbテーブルをawsコンソール上から操作)|
| 3 | [DynamoDBテーブルをAWS CLIで操作](#3dynamodbテーブルをawscliで操作)|

##手順
###1.DynamoDBを構築する
**①[Amazon DynamoDBコンソール](https://ap-northeast-1.console.aws.amazon.com/dynamodb/home?region=ap-northeast-1#gettingStarted:)へアクセス**

**②`テーブルの作成`をクリック**

**③DynamoDB テーブルのテーブル名とプライマリキーの設定**
まず、DynamoDBのテーブル名とプライマリキー（※）の設定を行います。
サンプルとして以下のように設定

テーブル名：　`Music`
パーティションキー：　`Artist`
ソートキー（任意設定）：　`SongTitle`

![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/5a9ac70b-1312-8e7b-6aac-71d62be1eb96.png)



※DynamoDBのプライマリキーに関して
プライマリキー
「パーティションキー」または「パーティションキーとソートキーの複合キー」のこと。
プライマリキーによってデータは一意に識別される。

パーティションキー（設定必須）
このキーへの格納値に従ってどのパーティションにデータが保存されるかが決まるため、
広範囲の値を持ちうるキーを設定することが推奨のようです（各パーティションへのアクセスが均等に分散され、性能向上につながる）。

ソートキー（設定任意）
設定することで、各パーティション内のデータをソートすることが可能となり、
かつAPIではソートキーを指定して取り出すデータの範囲をフィルタできるようです。

より詳しくは以下記事参考
[DynamoDBのキー・インデックスについてまとめてみた](https://qiita.com/shibataka000/items/e3f3792201d6fcc397fd)

**④スループットキャパシティのAutoScaling用ロール作成（任意設定）**
設定は任意です。
DynamoDBではRCU（読み込みスループットキャパシティ）とWCU（書き込みスループットキャパシティ）という指標を利用して、
単位時間あたりの読み込み・書き込み量を決定しています。
そのRCUとWCUのAutoScaling機能（自動拡張・縮小）を利用するためのIAMロールがデフォルトでは存在しないため新規作成します。

まずは`デフォルト設定の使用`のチェックを外します。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/4c6fa019-f298-295e-0440-05bd4fb1e69b.png)

`DynamoDB Auto Scaling サービスにリンクされたロール`にチェックされていること確認
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/e533de9d-9148-b26e-523b-ba031846590b.png)

他項目は今回は設定変更無しとします。
最後に`作成`をクリック

**⑤テーブル作成確認**
テーブル一覧に追加されたらOKです
<img width="951" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647616/5d8e670e-abb0-9b77-0a39-50381be214a7.png">

###2.DynamoDBテーブルをAWSコンソール上から操作
本記事では手順省略致します。
以下AWSドキュメントの「ステップ 2: NoSQL テーブルにデータを追加する」以降を参考に簡単なテーブル操作を試すことができます。
[NoSQL テーブルを作成してクエリを実行する](https://aws.amazon.com/jp/getting-started/hands-on/create-nosql-table/)

###3.DynamoDBテーブルをAWS CLIで操作
いくつかサンプルとして実行してみます。
より詳しいコマンドは以下記事参照
[aws cli で DynamoDB を使う](https://qiita.com/ekzemplaro/items/93c0aef433a2b633ab4a)
[AWS CLIでDynamoDB操作(挿入, 取得, 更新, 削除)](https://www.wakuwakubank.com/posts/675-aws-cli-dynamodb/)

put-item（データ格納）

```bash

$ aws dynamodb put-item --table-name Music --item '{ "Artist": { "S": "Ryosuke" }, "SongTitle": { "S": "FirstSong" }}'
$ aws dynamodb put-item --table-name Music --item '{ "Artist": { "S": "Ryosuke" }, "SongTitle": { "S": "SecondSong" }}'
$ aws dynamodb put-item --table-name Music --item '{ "Artist": { "S": "Michael" }, "SongTitle": { "S": "FirstSong" }}'
```

scan（データ一覧）

```bash

$ aws dynamodb scan --table-name Music
{
    "Count": 3,
    "Items": [
        {
            "SongTitle": {
                "S": "FirstSong"
            },
            "Artist": {
                "S": "Ryosuke"
            }
        },
        {
            "SongTitle": {
                "S": "SecondSong"
            },
            "Artist": {
                "S": "Ryosuke"
            }
        },
        {
            "SongTitle": {
                "S": "FirstSong"
            },
            "Artist": {
                "S": "Michael"
            }
        }
    ],
    "ScannedCount": 3,
    "ConsumedCapacity": null
}
```

get-item( 単一データ取得 )

```bash

$ aws dynamodb get-item --table-name Music  --key '{ "Artist": { "S": "Ryosuke" }, "SongTitle": { "S": "SecondSong" }}'
{
    "Item": {
        "SongTitle": {
            "S": "SecondSong"
        },
        "Artist": {
            "S": "Ryosuke"
        }
    }
}
```

query( 条件に一致するItem取得 )

```bash

[ec2-user@ip-172-31-34-150 ~]$ aws dynamodb query --table-name Music --key-condition-expression 'Artist = :Artist' --expression-attribute-values '{ ":Artist"
: { "S": "Ryosuke" }}'
{
    "Count": 2,
    "Items": [
        {
            "SongTitle": {
                "S": "FirstSong"
            },
            "Artist": {
                "S": "Ryosuke"
            }
        },
        {
            "SongTitle": {
                "S": "SecondSong"
            },
            "Artist": {
                "S": "Ryosuke"
            }
        }
    ],
    "ScannedCount": 2,
    "ConsumedCapacity": null
}

```