DynamoDB Localとaws-cliとExec Maven Pluginで、DynamoDBのローカル開発環境を構築!

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と同一のインタフェースをもつ簡易なデータベースが公開されています。
スクリーンショット 2014-07-05 20.29.55
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のテストがローカル環境でできるようになりました。
また、テーブルを開発メンバーで共有せずに済むので、誰かがテストのためにデータベースを初期化しても、他の人に影響を与えずに済みます。

コメント

  1. […] DynamoDB Localとaws-cliとExec Maven Pluginで、DynamoDBのローカル開発環境を構築! […]

タイトルとURLをコピーしました