Amazon DynamoDBは簡単で便利ですが、ローカルの開発環境を立ち上げるのが、ちょっと大変?
ということで、DynamoDB Localとaws-cliと、あとExec Maven Pluginを使って、環境を整備したので、メモです。
ローカル環境で使えるDynamoDB Local
DynamoDBはローカルマシンで動作させることができません。
AWSのRDSやElastiCacheは、対応するオープンソースとしてMySQLやMemcachedがあるので問題ないのですが、DynamoDBにはそういったものがありません。
そこで、今まではAWS上にDevTestみたいなテーブルを作って、それを使っていました。
しかしながら、AWS上のDynamoDBを使うと、開発メンバーが同じテーブルを共有することになるので、「あれ、今このデータ消した?」みたいな事件が起きてしまいます。
そこで、DynamoDB LocalというDynamoDBと同一のインタフェースをもつ簡易なデータベースが公開されています。
DynamoDB Local – Amazon DynamoDB
DynamoDB Localの中の実体はSQLiteですので、性能の検証などはできませんが、アプリケーションのテストに使ったりはできます。
HomeBrewでDynamoDB Localをインストール
DynamoDB Localは、HomeBrewからもインストールできるようになっているようです。
とりあえずインストールします。
$ brew install dynamodb-local
==> Downloading http://dynamodb-local.s3-website-us-west-2.amazonaws.com/dynamodb_local_2014-04-24.tar.gz
# ...(略)...
To have launchd start dynamodb-local at login:
ln -sfv /usr/local/opt/dynamodb-local/*.plist ~/Library/LaunchAgents
Then to load dynamodb-local now:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.dynamodb-local.plist
Or, if you don't want/need launchctl, you can just run:
/usr/local/bin/dynamodb-local
==> Summary
インストールが完了したら、起動設定に追加して、起動します。
ln -sfv /usr/local/opt/dynamodb-local/*.plist ~/Library/LaunchAgents
load ~/Library/LaunchAgents/homebrew.mxcl.dynamodb-local.plist
これでローカルマシンに、DynamoDBもどきが入った状態になります。
データベースの初期化スクリプトの記述
DynamoDBのデータベース定義や、テスト用のデータセットは、開発メンバーで共有したいので、データベースの初期化処理をスクリプト化しておきます。
#!/bin/bash
export AWS_ACCESS_KEY_ID=myproject
export AWS_SECRET_ACCESS_KEY=myproject
export AWS_DEFAULT_REGION='us-east-1'
# Delete table
aws dynamodb delete-table --endpoint-url http://localhost:8000 --table-name DevTest
# Create table
aws dynamodb create-table --endpoint-url http://localhost:8000 --table-name DevTest \
--attribute-definitions AttributeName=id,AttributeType=N AttributeName=timestamp,AttributeType=N \
--key-schema AttributeName=id,KeyType=HASH AttributeName=timestamp,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
# Insert data
aws dynamodb put-item --endpoint-url http://localhost:8000 --table-name DevTest \
--item '{"id":{"N":"1"},"timestamp":{"N":"1373196929172"}}'
テーブルの定義などは、アプリケーションに合わせて書き換えてください。
DynamoDB Localは、アクセスキー、アクセスシークレットの認証が不要です。しかし、アクセスキーを元にデータベースファイルを作成しているので、プロジェクトごとにアクセスキー名を分けておくと便利です。
ちなみに、データベースの書き換えに、aws-cliを用いていますが、これもHomeBrewからインストールできます。
brew install awscli
Mavenのcleanフェーズでデータベースを初期化
あとは開発環境に依存する話になるんですが、テストの実行前に、このスクリプトでデータセットを初期化できると便利です。
今携わっているプロジェクトは、Javaで開発をしていて、Mavenでプロジェクト管理をしているので、この初期化処理もMavenにやらせます。
Exec Maven Pluginを使って、clenaフェーズで初期化スクリプトを実行すると良いと思います。
org.codehaus.mojo
exec-maven-plugin
1.2.1
${basedir}/src/test/resources/clean_dynamodb.sh
clean-dynamodb
clean
exec
これで、テスト前にデータが初期化できます。
終わりに
これで、DynamoDBのテストがローカル環境でできるようになりました。
また、テーブルを開発メンバーで共有せずに済むので、誰かがテストのためにデータベースを初期化しても、他の人に影響を与えずに済みます。
コメント
[…] DynamoDB Localとaws-cliとExec Maven Pluginで、DynamoDBのローカル開発環境を構築! […]