DynamoDB Local & Boto3ではじめてのDynamoDB

はじめに

僕はこれまで200本の記事をDevelopers.IOに書いてきましたが、実はDynamoDBの記事は1本も書いていませんでした。そこで、はじめてDynamoDBを使ってみたいと思います!とはいえ、過去に書かれた記事と同じことをやってもつまらないので、今回はDynamoDB LocalをMac Bookに導入し、Boto3から使ってみます。

やってみた

DynamoDB Localの導入

DynamoDB Localは以下からダウンロードします。

今回は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と仲良くなれました。もっとたくさん触ってみようと思います!