DynamoDB Local & Boto3ではじめてのDynamoDB
はじめに
僕はこれまで200本の記事をDevelopers.IOに書いてきましたが、実はDynamoDBの記事は1本も書いていませんでした。そこで、はじめてDynamoDBを使ってみたいと思います!とはいえ、過去に書かれた記事と同じことをやってもつまらないので、今回はDynamoDB LocalをMac Bookに導入し、Boto3から使ってみます。
やってみた
DynamoDB Localの導入
DynamoDB Localは以下からダウンロードします。
- .tar.gz 形式: dynamodb_local_latest.tar.gz
- .zip 形式: dynamodb_local_latest.zip
今回はtar.gz形式のファイルをダウンロードしました。以下のように任意のディレクトリに展開します。
$ mkdir dynamodb $ cd dynamodb $ mv ~/Downloads/dynamodb_local_latest.tar.gz ./ $ tar xvzf dynamodb_local_latest.tar.gz
DynamoDB Localを起動します。
$ java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar & $ ps aux | grep DynamoDB smokeymonkey 3076 0.0 0.5 2962576 91224 s000 S 1:49PM 0:01.17 /usr/bin/java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar
ではAWS CLIを使って、DynamoDB Localにアクセスしてみます。--endpoint-urlでlocalhostを指定しているのがミソです。
$ aws dynamodb --endpoint-url http://localhost:8000 list-tables { "TableNames": [] }
ちゃんとアクセスできてますね!
DynamoDB Localにデータをセットする
今回は以下のように、writerというテーブルを作りました。項目は名前とURLです。
$ aws dynamodb --endpoint-url http://localhost:8000 create-table --table-name writer --attribute-definitions AttributeName=name,AttributeType=S --key-schema AttributeName=name,KeyType=HASH --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 { "TableDescription": { "AttributeDefinitions": [ { "AttributeName": "name", "AttributeType": "S" } ], "ProvisionedThroughput": { "NumberOfDecreasesToday": 0, "WriteCapacityUnits": 1, "LastIncreaseDateTime": 0.0, "ReadCapacityUnits": 1, "LastDecreaseDateTime": 0.0 }, "TableSizeBytes": 0, "TableName": "writer", "TableStatus": "ACTIVE", "KeySchema": [ { "KeyType": "HASH", "AttributeName": "name" } ], "ItemCount": 0, "CreationDateTime": 1436246083.562 } }
テーブルにデータをセットします。名前(name)とURL(url)をセットにしたデータです。
$ aws dynamodb --endpoint-url http://localhost:8000 put-item --table-name writer --item '{"name":{"S":"sasaki-daisuke"},"url":{"S":"https://dev.classmethod.jp/author/sasaki-daisuke/"}}' $ aws dynamodb --endpoint-url http://localhost:8000 put-item --table-name writer --item '{"name":{"S":"shinyaa31"},"url":{"S":"https://dev.classmethod.jp/author/shinyaa31/"}}' $ aws dynamodb --endpoint-url http://localhost:8000 put-item --table-name writer --item '{"name":{"S":"akari7"},"url":{"S":"https://dev.classmethod.jp/author/akari7/"}}' $ aws dynamodb --endpoint-url http://localhost:8000 put-item --table-name writer --item '{"name":{"S":"oguri-hajime"},"url":{"S":"https://dev.classmethod.jp/author/oguri-hajime/"}}' $ aws dynamodb --endpoint-url http://localhost:8000 put-item --table-name writer --item '{"name":{"S":"miyamoto-daisuke"},"url":{"S":"https://dev.classmethod.jp/author/miyamoto-daisuke/"}}' $ aws dynamodb --endpoint-url http://localhost:8000 put-item --table-name writer --item '{"name":{"S":"otaki-ryuta"},"url":{"S":"https://dev.classmethod.jp/author/otaki-ryuta/"}}'
ではscanで全件引っ張ってみます。
$ aws dynamodb --endpoint-url http://localhost:8000 scan --table-name writer { "Count": 6, "Items": [ { "url": { "S": "https://dev.classmethod.jp/author/shinyaa31/" }, "name": { "S": "shinyaa31" } }, (...snip...)
問題なくscanできました。
Boto3からアクセスする
以下のようなスクリプトをquery.pyという名前で作りました。ポイントは、Resouce定義でendpoint_urlを指定しているところです。
import boto3 from boto3.dynamodb.conditions import Key, Attr import sys param = sys.argv dynamodb = boto3.resource('dynamodb',endpoint_url='http://localhost:8000') table = dynamodb.Table('writer') res = table.query( KeyConditionExpression=Key('name').eq(param[1]) ) items = res['Items'] print (items)
引数に名前を付与して実行してみます。
$ python ./query.py sasaki-daisuke [{u'url': u'https://dev.classmethod.jp/author/sasaki-daisuke/', u'name': u'sasaki-daisuke'}]
こんな感じで、名前を検索し、結果を出力してくれます!
さいごに
DynamoDB Localは手元で簡単にDynamoDBが使えてとても便利です。ちょっとした自分用ツールを作っても面白そうですね。とはいえ、DynamoDBの良さはフルマネージド・スケーラブル・ストレージの無限キャパシティだと思うので、DynamoDBの動作確認に限定してLocalを使うのが良さそうです。
これでちょっとDynamoDBと仲良くなれました。もっとたくさん触ってみようと思います!