ども、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 コンテナで動かすメモ」