モチベーションが低いダイナモDB入門

# はじめに
色々と訳あり、ダイナモDBを練習してみます。

# 事前知識
MySQLなどの知識は少しあります。
FirebaseでNoSQLには触ったことあります。

# 手順
AWSにアカウント作成済みとします。
pip3もインストール済みとします。

## (1)AWS CLIインストール
pip3 にてAWS CLIをインストールします。

```shell
pip3 install awscli --upgrade --user
```

## (2)テーブルを作成する
AWSにログインし、DynamoDBを選択。
デカデカと出ているテーブル作成をクリックします。
<img width="350" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/a6ec7e37-945b-1c29-869f-fca9266105f1.png">

テーブル名を[moti]、プレマリキーを[downs]にします。
ついでにソートキーは[num]にします。
<img width="350" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/256c492b-a9f4-6330-2491-64c5a43fb9c3.png">
よくわからないので「デフォルト」のまま作成します。

<img width="350" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/494af2c5-fa3a-9251-03fd-49433bb0536f.png">

できたようです。

## (3)awsでアカウントを作ります
IAMというのを作らないとAWS CLIで使えないので作ります。
IAMを選択し、ユーザを追加します

<img width="350" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/a2cd0a91-aa2a-3066-ebc2-879c37a76de0.png">

プログラムからのアクセスにチェックを入れます。

<img width="350" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/3d565acf-3b38-14d1-27d6-0dd85b95e7bb.png">

ダイナモDB系の権限を許容します
<img width="350" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/26469aa4-ed0b-ae2e-81e1-4a60550f36a5.png">

タグを作らず進めます

アクセスキーとシークレットキーをコピーしておきます
<img width="350" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/17bdb00b-91ec-cf08-522b-7695e570599b.png">

下記のようにawscliにログインします。

```shell
$ aws configure --profile hashito
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxx
Default region name [None]: hashito
Default output format [None]: 
```
※一番下にもありますが…これ間違えています…
　Region→ap-northeast-1、output formatはtextなどがいいです。


## (4)awscliで操作します
こんな感じのコマンドでデータを追加するようです。

```shell

$aws dynamodb put-item --table-name moti --item '{ "downs": { "S": "1" }, "num": { "S": "2"}, "created_at": { "S": "1544741492" }, "message": { "S": "aaaaaaaaaaaaaa" } }'
```
よく読むとわかりますが基本的に`JSON`形式の入れ子になっています。
最も上の層が属性のキー名で次の層が属性（SはString、NはNumber的な感じ）になっています。

`{"key name":{"type char":"var"}}`みたいな感じですね

追加されています
<img width="350" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/0f6c5062-b34c-3387-5a37-d1421c910265.png">

**table一覧**

```shell
$ aws dynamodb list-tables
TABLENAMES	moti
```

**データ取得**

```shell
$aws dynamodb get-item --table-name moti --key '{ "downs": { "S": "1" }, "num": { "S": "2"}}'
CREATED_AT	1544741492
DOWNS	1
MESSAGE	aaaaaaaaaaaaaa
NUM	2
```

## (5)色々と試す。
### プレマリキーが同一の場合はどうなるか

```shell
$aws dynamodb put-item --table-name moti --item '{ "downs": { "S": "1" }, "num": { "S": "2"}, "created_at": { "S": "1544741492" }, "message": { "S": "aaaaaaaaaaaaaa" } }'
$aws dynamodb put-item --table-name moti --item '{ "downs": { "S": "1" }, "num": { "S": "3"} }'

```
上書きされず、別データとして扱われます。

<img width="350" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/5fb6667c-d5af-943f-7397-786fe3d44252.png">

### プレマリキーとソートが同一の場合はどうなるか

```shell
$aws dynamodb put-item --table-name moti --item '{ "downs": { "S": "1" }, "num": { "S": "2"}, "created_at": { "S": "1544741492" }, "message": { "S": "aaaaaaaaaaaaaa" } }'
$aws dynamodb put-item --table-name moti --item '{ "downs": { "S": "1" }, "num": { "S": "2"} }'
```

上書きされます。
<img width="350" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/d68f236d-3165-d6c9-4d0f-365bd9444043.png">

### いくつかまとめて持ってくるには？

雑にデータを追加します

```shell
$ aws dynamodb put-item --table-name moti --item '{ "downs": { "S": "1" }, "num": { "S": "3"} }'
$ aws dynamodb put-item --table-name moti --item '{ "downs": { "S": "1" }, "num": { "S": "2"} }'
$ aws dynamodb put-item --table-name moti --item '{ "downs": { "S": "2" }, "num": { "S": "2"} }'
$ aws dynamodb put-item --table-name moti --item '{ "downs": { "S": "3" }, "num": { "S": "2"} }'

```

```shell
$ aws dynamodb query --table-name moti --key-condition-expression 'downs =:_downs' --expression-attribute-values '{ ":_downs": { "S": "1" }}'
None	2	2
DOWNS	1
NUM	2
DOWNS	1
NUM	3
```

`--expression-attribute-values`というので変数を定義して、`--key-condition-expression `でwhereみたいにするようですね。


# 感想
NoSqlを初めて触ってみましたが楽しいですね。
ただ、SQL的なのがややこしい…
そもそも、あまりこれで条件区切って持ってこないのかもしれないです。


#(詰まった)
## (詰まった)'aws'コマンドがない
インストールしたはずのawsコマンドが存在しませんでした。

```shell
$ aws help
-bash: aws: command not found
```

どうやらPython3-pipのインストールフォルダにパスが通っていないことが原因でした。
まず、Python3-pipでインストールしたフォルダを確認します。

```shell
$ pip3 show awscli
Name: awscli
Version: 1.18.0
Summary: Universal Command Line Environment for AWS.
Home-page: http://aws.amazon.com/cli/
Author: Amazon Web Services
Author-email: UNKNOWN
License: Apache License 2.0
Location: /Users/{user}/Library/Python/3.8/lib/python/site-packages
Requires: botocore, PyYAML, docutils, s3transfer, rsa, colorama
Required-by: 
```
ここにはないようです…
こちらの記事を参考に…

AWS CLI の パス を通す
https://qiita.com/plum_shiga/items/5214510f9786898c987f

私のはここにありました。

```shell
$export PATH=/Users/{user}/Library/Python/3.7/bin:$PATH
$aws -help
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
aws: error: the following arguments are required: command

```





## (詰まった)`Could not connect to the endpoint URL: "https://dynamodb.hashito.amazonaws.com/"`って出る。
雑に設定しすぎて`aws configure`で設定したリージョンが異なっていたようです。

```shell

AWS Access Key ID [****************]: 
AWS Secret Access Key [****************]: 
Default region name [hashito]: ap-northeast-1
Default output format [hashito]: text
```

設定し直しました。