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フェーズで初期化スクリプトを実行すると良いと思います。

<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>exec-maven-plugin</artifactId>
	<version>1.2.1</version>
	<configuration>
		<executable>${basedir}/src/test/resources/clean_dynamodb.sh</executable>
	</configuration>
	<executions>
		<execution>
			<id>clean-dynamodb</id>
			<phase>clean</phase>
			<goals>
				<goal>exec</goal>
			</goals>
		</execution>
	</executions>
</plugin>

これで、テスト前にデータが初期化できます。

終わりに

これで、DynamoDBのテストがローカル環境でできるようになりました。

また、テーブルを開発メンバーで共有せずに済むので、誰かがテストのためにデータベースを初期化しても、他の人に影響を与えずに済みます。

About katty0324

Scroll To Top