ども、cloudpackかっぱ (@inokara) です。

はじめに

DynamoDB local という Amazon DynamoDB をローカルホストで動かすことが出来るアプリケーションが AWS より配布されています。

これを Docker のコンテナで動かしてテーブルを作るところまでのメモです。

メモ

コンテナ

サクッと Ubuntu コンテナを利用します。

docker run -t -i -p 8080:8080 ubuntu /bin/bash

DynamoDB Local はデフォルトで 8000 番ポートで接続を待ち受けますが、今回は 8080 番ポートで待ち受けたいこともあり -p 8080:8080 でポートを晒します。

Java 環境の用意

DynamoDB Local は…

DynamoDB Local supports the Java Runtime Engine (JRE) version 6.x or newer; it will not run on older JRE versions.

とあるように JRE 6.x 以上が必要になりますので openjdk-7-jdk をインストールします。

apt-get install openjdk-7-jdk

DynamoDB Local のインストールと起動

こちらからバイナリを取得して展開します。

cd /usr/local/
mkdir ddlocal
cd ddlocal
wget http://dynamodb-local.s3-website-us-west-2.amazonaws.com/dynamodb_local_latest.tar.gz
tar zxvf dynamodb_local_latest.tar.gz

以下のように起動します。

# データベースディレクトリを作成
mkdir /usr/local/ddlocal/db
# 起動
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -port 8080 -dbPath /usr/local/ddlocal/db &

動作確認

動作確認として aws-cli を利用してテーブル一覧を取得してみたいと思いますので Credential な情報をダミーで登録しておきましょう。

mkdir /root/.aws
cat << EOT > config
[default]
aws_access_key_id =
aws_secret_access_key =
region=ap-northeast-1
EOT

上記のように実際にキーやシークレットキーを埋め込む必要はありません。

早速、list-tables を実行してみたいと思います。

aws dynamodb list-tables --endpoint-url http://localhost:8080

以下のように出力されました。

Jan 02, 2015 4:26:11 AM com.almworks.sqlite4java.Internal log
INFO: [sqlite] DB[3]: instantiated [/usr/local/ddlocal/db/_ap-northeast-1.db]
Jan 02, 2015 4:26:11 AM com.almworks.sqlite4java.Internal log
INFO: [sqlite] DB[3]: opened
{
    "TableNames": []
}

データベースとして SQLite が利用されているようですね。

テーブル作成

aws dynamodb create-table --endpoint-url http://localhost:8080 
--table-name temperature 
--attribute-definitions AttributeName=temperature,AttributeType=S AttributeName=time,AttributeType=S 
--key-schema AttributeName=temperature,KeyType=HASH AttributeName=time,KeyType=RANGE 
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1

以下のように出力されました。

{
    "TableDescription": {
        "AttributeDefinitions": [
            {
                "AttributeName": "temperature",
                "AttributeType": "S"
            },
            {
                "AttributeName": "time",
                "AttributeType": "S"
            }
        ],
        "ProvisionedThroughput": {
            "NumberOfDecreasesToday": 0,
            "WriteCapacityUnits": 1,
            "ReadCapacityUnits": 1
        },
        "TableSizeBytes": 0,
        "TableName": "temperature",
        "TableStatus": "ACTIVE",
        "KeySchema": [
            {
                "KeyType": "HASH",
                "AttributeName": "temperature"
            },
            {
                "KeyType": "RANGE",
                "AttributeName": "time"
            }
        ],
        "ItemCount": 0,
        "CreationDateTime": 1420174654.616
    }
}

KVS なのにスキーマの定義が必要になるのはちょっと違和感ありますが…(Hash キー Range キーに該当する Attribute 以外は定義不要とのことです)list-tables してみたいと思います。

# aws dynamodb list-tables --endpoint-url http://localhost:8080

以下のように出力されました。

{
    "TableNames": [
        "temperature"
    ]
}

ちゃんとテーブルも作成出来ました。

おまけ(Raspberry Pi で DynamoDB Local が動くのか…)

結論

動きませんでした。

試行錯誤

DynamoDB Local バックエンドのデータベースで sqlite を利用していますが… libsqlite4java-linux-arm.soをダウンロードして DynamoDBLocal_lib ディレクトリに置けば動くのではという考えは安易でした。

sudo wget https://sqlite4java.googlecode.com/files/libsqlite4java-linux-arm.so -O ./DynamoDBLocal_lib/libsqlite4java-linux-arm.so
sudo java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -port 8081 -dbpath /usr/local/ddlocal/db &

で実行すると一見は起動したように見えますが、list-table を実行すると以下のようにエラーが出力されてしました。

情報: [sqlite] DB[3]: instantiated [/usr/local/ddlocal/db/AKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_ap-northeast-1.db]
1 02, 2015 2:15:29 午後 com.almworks.sqlite4java.Internal log
警告: [sqlite] cannot open DB[3]: com.almworks.sqlite4java.SQLiteException: [-91] cannot load library: java.lang.UnsatisfiedLinkError: /usr/local/ddlocal/DynamoDBLocal_lib/libsqlite4java-linux-arm.so: /usr/local/ddlo
cal/DynamoDBLocal_lib/libsqlite4java-linux-arm.so: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません
1 02, 2015 2:15:29 午後 com.almworks.sqlite4java.Internal log
重大: [sqlite] SQLiteQueue[AKIAIG2FHN7FACG56HLA_ap-northeast-1.db]: error running job queue
com.almworks.sqlite4java.SQLiteException: [-91] cannot load library: java.lang.UnsatisfiedLinkError: /usr/local/ddlocal/DynamoDBLocal_lib/libsqlite4java-linux-arm.so: /usr/local/ddlocal/DynamoDBLocal_lib/libsqlite4java-linux-arm.so: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません
        at com.almworks.sqlite4java.SQLite.loadLibrary(SQLite.java:97)
        at com.almworks.sqlite4java.SQLiteConnection.open0(SQLiteConnection.java:1441)
        at com.almworks.sqlite4java.SQLiteConnection.open(SQLiteConnection.java:282)
        at com.almworks.sqlite4java.SQLiteConnection.open(SQLiteConnection.java:293)
        at com.almworks.sqlite4java.SQLiteQueue.openConnection(SQLiteQueue.java:464)
        at com.almworks.sqlite4java.SQLiteQueue.queueFunction(SQLiteQueue.java:641)
        at com.almworks.sqlite4java.SQLiteQueue.runQueue(SQLiteQueue.java:623)
        at com.almworks.sqlite4java.SQLiteQueue.access$000(SQLiteQueue.java:77)
        at com.almworks.sqlite4java.SQLiteQueue$1.run(SQLiteQueue.java:205)
        at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.UnsatisfiedLinkError: /usr/local/ddlocal/DynamoDBLocal_lib/libsqlite4java-linux-arm.so: /usr/local/ddlocal/DynamoDBLocal_lib/libsqlite4java-linux-arm.so: 共有オブジェクトファイルを開けません: そ
のようなファイルやディレクトリはありません
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1929)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1814)
        at java.lang.Runtime.load0(Runtime.java:809)
        at java.lang.System.load(System.java:1083)
        at com.almworks.sqlite4java.Internal.tryLoadFromPath(Internal.java:340)
        at com.almworks.sqlite4java.Internal.loadLibraryX(Internal.java:117)
        at com.almworks.sqlite4java.SQLite.loadLibrary(SQLite.java:95)
        ... 9 more

アチャー、DynamoDBLocal.jar に libsqlite4java-linux-arm.so がリンクされていないのか…残念。

ということで…

DynamoDB Local を Docker コンテナで動かしてみました。-v ボリュームオプションでローカルストレージをマウントしたりすればデータの永続化もいけるのかしら?

ちなみに DynamoDB との違いや DynamoDB Local 利用上の注意点は以下のとおりです。(こちらの記事「Amazon Web Services ブログ: 【AWS発表】 デスクトップ開発を可能にする DynamoDB Local」からの抜粋です)

  • DynamoDB Localはプロビジョンされたスループットの設定を無視する
  • AWS アクセスキーおよびリージョンとして渡した値はデータベースファイル名にのみ使用される
  • AWS シークレットキーは無視されますが、設定する必要がある
  • DynamoDB Local は耐久性、可用性、SLA を持たないので本番環境での使用はお薦めしない

とりあえず動かしてみたレベルですが、DynamoDB をサクッとローカルで弄りたい時等には課金を気にすることなく弄れそうです。

元記事はこちらです。
DynamoDB Local を Docker コンテナで動かすメモ