この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
僕はこれまで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と仲良くなれました。もっとたくさん触ってみようと思います!