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

はじめに

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

事前知識

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

手順

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

(1)AWS CLIインストール

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

pip3 install awscli --upgrade --user  

(2)テーブルを作成する

AWSにログインし、DynamoDBを選択。
デカデカと出ているテーブル作成をクリックします。
image.png

テーブル名を[moti]、プレマリキーを[downs]にします。
ついでにソートキーは[num]にします。
image.png
よくわからないので「デフォルト」のまま作成します。

image.png

できたようです。

(3)awsでアカウントを作ります

IAMというのを作らないとAWS CLIで使えないので作ります。
IAMを選択し、ユーザを追加します

image.png

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

image.png

ダイナモDB系の権限を許容します
image.png

タグを作らず進めます

アクセスキーとシークレットキーをコピーしておきます
image.png

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

$ 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で操作します

こんな感じのコマンドでデータを追加するようです。

  
$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"}}みたいな感じですね

追加されています
image.png

table一覧

$ aws dynamodb list-tables  
TABLENAMES    moti  

データ取得

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

(5)色々と試す。

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

$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"} }'  
  

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

image.png

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

$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"} }'  

上書きされます。
image.png

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

雑にデータを追加します

$ 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"} }'  
  
$ 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コマンドが存在しませんでした。

$ aws help  
-bash: aws: command not found  

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

$ 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

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

$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で設定したリージョンが異なっていたようです。

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

設定し直しました。