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


はじめに

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

事前知識

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

手順

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

(1)AWS CLIインストール

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

pip3 install awscli --upgrade --user

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

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

テーブル名を[moti]、プレマリキーを[downs]にします。
ついでにソートキーは[num]にします。

よくわからないので「デフォルト」のまま作成します。

できたようです。

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

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

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

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

タグを作らず進めます

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

下記のように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"}}みたいな感じですね

追加されています

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

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

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

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

上書きされます。

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

雑にデータを追加します

$ 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

設定し直しました。