はじめに
色々と訳あり、ダイナモ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を選択し、ユーザを追加します
プログラムからのアクセスにチェックを入れます。
タグを作らず進めます
下記のように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
設定し直しました。