こんにちは。松本です。
TECHSCORE Advent Calendar 2014 の 12 日目の投稿です。
本エントリーでは無料の Amazon DynamoDB Local を使って、AWS SDK for Java に用意されている AmazonDynamoDBv2 API を試してみたいと思います。
Amazon DynamoDB Local って?
DynamoDB Local は DynamoDB API と互換性を持つ小型のデータベースで、DynamoDB サービスを使ったアプリケーション開発向けに Amazon から無料で提供されています。その中身は SQLite や Jetty を使って実現されており、その名の通りローカル端末で動作させることができるのが特徴です。
DynamoDB Local is compatible with the DynamoDB API. When you are ready to deploy your application, you simply redirect it to DynamoDB, without having to modify your application code. In addition, you do not need to have an Internet connection to use DynamoDB Local. You can develop applications without having to be connected to the network.
DynamoDB Local は、AWS のサイトから JAR ファイルをダウンロードして実行するだけで利用できますが、今日は eclipse から利用する方法について書いていきたいと思います。
インストール
DynamoDB Local を eclipse からインストールするのは簡単で、AWS Toolkit をインストールしていくつか手順を踏むだけです。
尚、本記事は次の環境で動作確認しています。
- Eclipse Luna (4.4.1) Release for Windows 64 Bit
- JRE 1.8.0_20
- Java コンパイラー準拠レベル 1.8
※DynamoDB Local は JRE 6.x 以上が必要です。
Downloading and Running DynamoDB Local
Important
DynamoDB Local supports the Java Runtime Engine (JRE) version 6.x or newer; it will not run on older JRE versions.
1. AWS Toolkit for Eclipse のインストール
eclipse 上で Help > Eclipse Marketplace... をクリックして Eclipse Marketplace を開き、AWS Toolkit for Eclipse 2.0 をインストールします。「AWS Toolkit for Eclipse」をキーワードにして検索すればすぐに見つかります。
ウィザード中の Confirm Selected Features では、Amazon DynamoDB Management とAmazon EC2 Management を選択して下さい。Amazon EC2 Management は依存関係上、必要なのです。
インストール完了後、eclipse の再起動が求められるので実施して下さい。
2. AWS アカウント認証情報の入力
eclipse の再起動が完了すると AWS account credentials の入力が求められます。DynamoDB Local を使うだけなら実際の AWS アカウント認証情報を入力する必要はないので、適当な情報を設定してください。ここで設定したアクセスキーIDやシークレットアクセスキーは、SDK から DynamoDB Local を操作する場合にも利用します。
3. Amazon DynamoDB Local のインストール
Window > Preferences から AWS Toolkit の DynamoDB Local Test Tool 画面を開くと、Version リストの中にインストール可能な DynamoDB Loacal のバージョンが表示されるので適当なものを選択(特に制約が無いなら最新の日付のバージョンを選べば良いです)して Install ボタンをクリック。
これで DynamoDB Local のインストールは完了です。
そして起動!
DynamoDB Local の起動は AWS Explorer から行います。
1. AWS Explorer を開く
eclipse 上で AWS Explorer が開いていなければ、Window > Show View > Other... から Show View ウィンドウを開いて AWS Toolkit 内の AWS Explorer から開いて下さい。
2. リージョンを Local に
AWS Explorer 上でリージョンを Local (localhost) に設定。
3. グローバルコンフィギュレーション
AWS Explorer 上で Global Configuration がないと怒られた場合は、Window > Preferences の AWS Toolkit 上で Global Configuration に適当な値を設定して下さい。入力する AWS アカウント認証情報は適当なもので構いません。
これで AWS Explorer の警告が消え、DynamoDB Local が利用可能な状態となります。
4. DynamoDB Local の起動
AWS Explorer 上で Amazon DynamoDB を右クリックし Start DynamoDB Local をクリック。
起動する DynamoDB Local のバージョンを聞いてくるので、インストール済みのバージョンを選択します。
1 2 |
2014-12-09 11:38:01.615:INFO:oejs.Server:jetty-8.1.12.v20130726 2014-12-09 11:38:01.739:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8000 |
これで起動完了。コンソールへの出力から、DynamoDB Local が Jetty が動いていることがわかりますね(状況によって、SQLite のログも出力されます)。
さあ、続いて SDK 経由で DynamoDB Local にアクセスする準備をしましょう。
AWS SDK for Java のインストール
今回は maven で構築することにします。
1. maven プロジェクト作成
eclipse の File > New > Project... から Maven > Maven Project を選び、simple project を作成します。groupId と artifactId は適当に入力して下さい。
2. pom.xml を編集
dependencies
に AWS SDK for Java を追加するだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.techscore</groupId> <artifactId>dynamodb-local-sample</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk</artifactId> <version>1.9.9</version> </dependency> </dependencies> </project> |
しばらく待てば AWS SDK for Java がインストールされます。これで環境構築は完了です。
では実際に AWS SDK for Java 経由でアイテムを保存してみよう
主に com.amazonaws.services.dynamodbv2
以下のパッケージを利用します。古いバージョンの SDK では com.amazonaws.services.dynamodb
系のパッケージも存在するので間違えないよう注意して下さい。
1. 準備
まずは AmazonDynamoDBClient
オブジェクトの生成から。
1 2 3 |
AWSCredentials credentials = new BasicAWSCredentials("yourAccessKeyId", "yourSecretAccessKey"); AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials); client.setEndpoint("http://localhost:8000", "", "local"); |
DynamoDB Local を使う上でのポイントは AmazonDynamoDBClient
上でエンドポイントを変えることと、リージョンIDをセットする事です。setEndpoint()
の二つ目の引数である「サービス名」は無視されます。
AmazonDynamoDBClient#setEndpoint()
endpoint
- The endpoint (ex: "dynamodb.us-east-1.amazonaws.com/") or a full URL, including the protocol (ex: "http://dynamodb.us-east-1.amazonaws.com/") of the region specific AWS endpoint this client will communicate with.
serviceName
- This parameter is ignored.
regionId
- The ID of the region in which this service resides AND the overriding region for signing purposes.
BasicAWSCredentials
のコンストラクタには、AWS アカウント認証情報として eclipse 上で設定したアクセスキーIDとシークレットアクセスキーを引数として渡します。今回は AWSCredentials
の生成をサンプルとしてわかりやすい BasicAWSCredentials
(javadoc)で行いましたが、実際のアプリケーションでは次のように ClasspathPropertiesFileCredentialsProvider
(javadoc)を使うことになるでしょう。
1 |
AWSCredentials credentials = new ClasspathPropertiesFileCredentialsProvider().getCredentials(); |
こうすることで、クラスパス上の AwsCredentials.properties ファイルを参照してくれるようになります。
2. テーブルの作成
AWS Explorer を使ってテーブルを作成します。
AWS Explorer の Amazon DynamoDB アイコン上で右クリックし、Create Table を選んで下さい。Create New DynamoDB Table という画面が開くので、下記を参考にテーブル作成を行って下さい。サンプルではチャットアプリのチャンネルを表すテーブルを想定しています。
Table Name と Hash Key Name、Hash Key Type に必要な情報を入力しています。
サンプルではレンジキーを使用しないので、Enable Range Key はオフにします。
Table Throughput という項目は、DynamoDB Local では無視されるので今回は適当な値を設定しておいて下さい。
Differences Between DynamoDB Local and DynamoDB
DynamoDB Local ignores provisioned throughput settings, even though the API requires them. For CreateTable, you can specify any numbers you want for provisioned read and write throughput, even though these numbers will not be used. You can call UpdateTable as many times as you like per day; however, any changes to provisioned throughput values are ignored.
3. アイテムの保存
次に実際のコードです。
1 2 3 4 5 6 7 |
PutItemRequest request = new PutItemRequest() .withTableName("Channels") .addItemEntry("channelName", new AttributeValue("techscore")) .addItemEntry("maxMessageNumber", new AttributeValue().withN("0")) .addItemEntry("createdAt", new AttributeValue(OffsetDateTime.now().toString())) .addItemEntry("updatedAt", new AttributeValue(OffsetDateTime.now().toString())); client.putItem(request); |
ここでは PutItemRequest
を使って Channels テーブルにアイテムを保存しています。
テーブル名の指定を withTableName()
メソッドで、属性値のセットを addItemEntry()
で行っています。withXxx()
や addXxx()
系のメソッドは戻り値に PutItemRequest
オブジェクト自身を返してくれるので、属性値の設定等をメソッドチェーンでつなぐことができ、コードの可読性を上げることができます。
AttributeValue
は属性値を表すクラスで、データ型が Number なら withN()
や setN()
、文字列型なら withS()
や setS()
というように、データ型に応じたメソッドで値の格納(や取得)を行います。
全ソースコードを掲載します。
com/techscore/dynamodb_local_sample/ChannelCreationLowLevelAPI.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com.techscore.dynamodb_local_sample; import java.time.OffsetDateTime; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient; import com.amazonaws.services.dynamodbv2.model.AttributeValue; import com.amazonaws.services.dynamodbv2.model.ExpectedAttributeValue; import com.amazonaws.services.dynamodbv2.model.PutItemRequest; public class ChannelCreationLowLevelAPI { public static void main(String[] args) { AWSCredentials credentials = new BasicAWSCredentials("yourAccessKeyId", "yourSecretAccessKey"); AmazonDynamoDBClient client = new AmazonDynamoDBClient(credentials); client.setEndpoint("http://localhost:8000", "", "local"); PutItemRequest request = new PutItemRequest() .withTableName("Channels") .addItemEntry("channelName", new AttributeValue("techscore")) .addItemEntry("maxMessageNumber", new AttributeValue().withN("0")) .addItemEntry("createdAt", new AttributeValue(OffsetDateTime.now().toString())) .addItemEntry("updatedAt", new AttributeValue(OffsetDateTime.now().toString())); client.putItem(request); } } |
このコードを実行することで Channels テーブルに "techscore"
という channelName 属性値を持つアイテムが新規作成されます。結果は AWS Explorer 上で Channels テーブルの Query Editor を開くことで確認できます。
次回は
「前編」と題した今回は主に Amazon DynamoDB Local の利用方法について紹介しました。もう少し書きたいこともありましたが、長くなってきたので今回はここでいったん終了します。
次回「後編」では AWS SDK for Java による低レベル API および高レベル API に触れつつ、DynamoDB の Atomic Counters と Conditional Writes を試す予定です。