Amazon の DynamoDB というのを使うことになった。タイミングよく DynamoDB をローカルで動かす Docker image が本家から出てたので試します。
準備
私は心配性なので、うっかり AWS の関係無い所に書き込んでしまわないようウソ情報を設定しておきます。
$ aws configure
AWS Access Key ID [None]: hoge
AWS Secret Access Key [None]: hoge
Default region name [None]: hoge
Default output format [None]:
これで accesskey=hoge という嘘ユーザと hoge という嘘リージョンを使う設定になります。続いて dynamodb の Docker image を起動します。
docker run -p 8000:8000 amazon/dynamodb-local
テーブル作成
aws cli でローカルの DynamoDB にアクセスするためには常に --endpoint-url http://localhost:8000
で接続先を指定します。
aws dynamodb create-table \
--table-name hoge \
--attribute-definitions AttributeName=HogeName,AttributeType=S \
--key-schema AttributeName=HogeName,KeyType=HASH \
--provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=5 \
--endpoint-url http://localhost:8000
使用に関する注意事項 の分かりづらい解説によると、DynamoDB local は内部的に access key ごと、リージョンごとにデータベースを作成します。なのでここで作成したテーブルを aws cli 以外の方法でアクセスする場合 API によっては accesskey が hoge で region が hoge である事を指定する必要があります。
引数の説明
- --attribute-definitions: AttributeDefinition プライマリキーの型
- AttributeName: プライマリキーの名前
- AttributeType: プライマリキーの型。S (文字列) または N (数値) または B (バイナリ)
- --key-schema: KeySchema プライマリキーの設定
- AttributeName: プライマリキーの名前
- AttributeType: プライマリキーの種類。HASH (Partition key) または RANGE (Sort key)
- --provisioned-throughput: スループット
- ReadCapacityUnits: 一秒ごとに何回 strongly consistent reads 出来るか。(eventually consistent read はその二倍)
- WriteCapacityUnits: 一秒ごと何回 書き込めるか。
- 属性名に予約語を使うと query に使えず面倒な事になる。予約語が沢山あるので注意。
(注意): aws dynamodb の開発者ガイドやマニュアルは肝心な内容がかなり省略されているので、引数の意味などは API Reference という別の文書を探す必要があります。
アイテム追加
aws dynamodb put-item \
--table-name hoge \
--item '{"HogeName" : {"S": "Hogeyama Hogeta"}, "Sex" : {"S": "Male"}}' \
--endpoint-url http://localhost:8000
aws dynamodb put-item \
--table-name hoge \
--item '{"HogeName" : {"S": "Higeoka Hanako"}, "Sex" : {"S": "Femele"}}' \
--endpoint-url http://localhost:8000
アイテム取得
aws dynamodb get-item \
--table-name hoge \
--key '{"HogeName" : {"S": "Higeoka Hanako"}}' \
--endpoint-url http://localhost:8000
アイテム検索
aws dynamodb query \
--table-name hoge \
--key-condition-expression 'HogeName = :a' \
--expression-attribute-values '{":a": {"S": "Hogeyama Hogeta"}}' \
--endpoint-url http://localhost:8000
削除
aws dynamodb delete-table --table-name hoge --endpoint-url http://localhost:8000