DynamoDBを使ってみる

Amazon DynamoDB を使ってみました。
使ってみた一番最初の印象は、今までのDBとは次元が異なるものだなと。
DBのメンテナンスをユーザーがする必要はなくて、フルマネージドであると。
DBのRead および Write のスループットをManagement Consoleで自由に変更できて、そのスループットの設定が高いと、それだけコストが高くなる。

Youtubeにアップされている DynamoDB の動画を見ると、胸が躍らされるというか、ワクワクしますね!

今回は、DynamoDB 上に SampleTable という名前のテーブルを作成して、AWS SDK for Javaを使って参照Queryを投げてみました。

その手順が以下の通りです。

まずは、Management Console上でDynamoDB を選択して、以下のような画面に遷移します。既に以下の画面ではテーブルがいくつか作成されていますが、お気になさらずに。

Create Tableボタンをクリックします。
f:id:kenjifunasaki:20121129183230p:plain

Table Nameに SampleTable と入力、以下のように Primary Key を設定します。
f:id:kenjifunasaki:20121129183328p:plain

とりあえず Read Capacity Units を 10 に、Write Capacity Units を 5 にしました。
f:id:kenjifunasaki:20121129183449p:plain

Send notification to のところには、自分のメールアドレスを入れます。
f:id:kenjifunasaki:20121129183740p:plain

テーブルを作成すると、SampleTableがCreating状態であることが確認できます。
作成が完了後、SampleTalbeを選択して、Explore Table をクリックします。
f:id:kenjifunasaki:20121129183822p:plain

テーブル作成当初は、当然データがないので、データを追加してみます。
New Itemをクリックします。
f:id:kenjifunasaki:20121129184019p:plain

Primary Key で Id の Value に 1 を入れます。
あと、追加で Name という名前の Attribute を追加して、その Value を Test にします。
Put Itemをクリックします。
f:id:kenjifunasaki:20121129184112p:plain

画面をリフレッシュすると、データが追加されたのがわかります。
f:id:kenjifunasaki:20121129184211p:plain


以上で、テーブルの作成とデータの追加が完了です。
Managment Console 上で確認できましたが、これを今度は Java のプログラムを使って参照してみます。

まず事前に AWS API を利用するための Credential 用のアクセスキーを AwsCredentials.properties ファイルに以下のように入力して保存します。

secretKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXX
accessKey=XXXXXXXXXXXXXXXXX

こちらは、AWS Managment Console 画面右上の自分のアカウント名をクリックすると出てくる「Security Credentials」リンクをクリックして、ページ遷移、AWS アカウントで再ログインすると、accessKey と secretAccessKey 情報を見ることができます。
これらをコピペして上記ファイルに保存してください。

そして、以下のJavaプログラムを実行します。上記propertiesファイルをプログラムから参照できるようにする必要があります。

import java.io.IOException;
import java.util.Arrays;
import java.util.Map;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.PropertiesCredentials;
import com.amazonaws.services.dynamodb.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodb.model.AttributeValue;
import com.amazonaws.services.dynamodb.model.GetItemRequest;
import com.amazonaws.services.dynamodb.model.GetItemResult;
import com.amazonaws.services.dynamodb.model.Key;

public class DynamoDBSample {

	static AmazonDynamoDBClient dynamoDB;
	
	public static void main(String[] args) throws IOException {
		//Credentialsの設定
		AWSCredentials credentials = new PropertiesCredentials(
                         DynamoDBSample.class.getResourceAsStream(
                        "AwsCredentials.properties"));

		//リクエストのパラメータの設定
                dynamoDB = new AmazonDynamoDBClient(credentials);
                dynamoDB.setEndpoint("http://dynamodb.ap-northeast-1.amazonaws.com");
                String tableName = "SampleTable";
                String id = "1";
        
                GetItemRequest getItemRequest = new GetItemRequest()
        		.withTableName(tableName)
        		.withKey(new Key()
        		.withHashKeyElement(new AttributeValue().withN(id)))
        		.withAttributesToGet(Arrays.asList("Id", "Name"));
    
                //リクエストを送信して、結果を取得
                GetItemResult result = dynamoDB.getItem(getItemRequest);

                //結果の出力
                Map<String, AttributeValue> attributeList = result.getItem();
                for (Map.Entry<String, AttributeValue> item : attributeList.entrySet()) {
                        String attributeName = item.getKey();
                        AttributeValue value = item.getValue();
                        System.out.println(attributeName + " "
                                  + (value.getS() == null ? "" : "S=[" + value.getS() + "]")
                                  + (value.getN() == null ? "" : "N=[" + value.getN() + "]\n"));
                }     
        }
}

上記を実行した結果が以下になります。

Name S=[Test]
Id N=[1]

ちゃんと取得できました!

以上ですー。