Help us understand the problem. What is going on with this article?

モチベーションが低いダイナモ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

設定し直しました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした