ちょっと話題の記事

JavaScript shell console で DynamoDB Local を手軽に試す!

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

よく訓練されたアップル信者、都元です。DynamoDBはAWSが提供する、高可用性を持ちスケーラブルなフルマネージドNoSQLデータベースサービスです。色々特徴を並べましたが一つ一つをあらためてさらっと。

  • 高可用性:DynamoDBは24/365でサービスを提供し続けられることが前提となっているサービスです。想定の範囲内では止まることがない、というサービスレベル設計が行われています。
  • スケーラブル:読み書きの性能は(ある程度の費用の増加を認識しつつ)パラメータ変更のリクエストを送るだけで完了 *1します。
  • フルマネージド:メンテナンスフリーです。ハードウェアの故障やディスクの空き容量を気にする必要はありません。これらの問題は、仮に発生したとしても、我々が気づかないところで、もちろんサービスを止めずに解決されます。

DynamoDB Local

DynamoDBは、どこかのサーバにインストールするようなデータベースエンジンではなく、あくまでもサービスです。しかし、仮にネットワークに繋がっていない時でも、開発用途でDynamoDBを利用したい、という意図から「DynamoDB Local」という、ローカルマシン内で稼働するDynamoDBのミミックが公開されています。

詳しくはAmazon DynamoDB LocalをOSX(Mountain Lion)で実行するを御覧ください。

一応、最新版のDynamoDB Localをダウンロードして動かす方法を以下にまとめておきます。

$ mkdir -p ~/temp/ddblocal
$ cd ~/temp/ddblocal
$ wget http://dynamodb-local.s3-website-us-west-2.amazonaws.com/dynamodb_local_latest.zip
$ unzip dynamodb_local_latest.zip
$ java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar
2014-10-22 11:30:23.017:INFO:oejs.Server:jetty-8.1.12.v20130726
2014-10-22 11:30:23.082:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:8000

DynamoDB JavaScript console

さて、この状態でaws-cliからDynamoDB Localを触る方法は、先ほどご紹介したエントリに詳しく書いてあります。しかし、DynamoDB Localの最新版では「JavaScript console」というものが用意されているので、今回はそのご紹介。

$ open http://localhost:8000/shell/

2014-10-22_1144

左半分がコードのエディタ、右側がコンソール入出力になっているようです。大きな編集はせず、単にREPLのように使いたいのであれば右側だけで使うことも出来そうです。ただ、私は正直あまりJavaScriptのSDKに慣れていないので、左側のエディタでスニペットを表示してもらうことによって、楽しむことができました。

具体的には、エディタ部分で CTRL+SPACE を入力することで、色々補完メニューが出てきます。

2014-10-22_1154

その他右上の</>ボタンから、各APIコールについてコードテンプレートを参照することもでき、さらにSDKのドキュメントへのリンク等も充実。DynamoDBを触り始めたばかりでも、色々触りやすい環境が整っています。

2014-10-22_1156

さて、まずはテーブルがなければ話にならないと思うので作ってみましょう。createTableのスニペットを表示してみると、だいたいの文法は見て取れると思います。好きに編集してみましょう。私はシンプルにこんな感じにしてみました。

var params = {
    TableName: 'Sample',
    KeySchema: [
        { AttributeName: 'Id', KeyType: 'HASH' }
    ],
    AttributeDefinitions: [
        { "AttributeName": "Id", "AttributeType": "S" }
    ],
    ProvisionedThroughput: {
        ReadCapacityUnits: 1, 
        WriteCapacityUnits: 1, 
    }
};
dynamodb.createTable(params, function(err, data) {
    if (err) print(err); // an error occurred
    else print(data); // successful response
});

編集が済んだら、実行ボタン(下記)を押してみましょう。

2014-10-22_1202

コンソール側でこんなレスポンスが得られました。

2014-10-22_1203

ここで各自listTablesdescribeTable(s)のスニペットを出して、いろいろやってみることをオススメします。

次はデータのPutですね。ちょっと関数を定義して…

//APIの戻り値を表示するためのヘルパー関数
var printDynamoDBResult = function(err, data) {
    if (err) print(err); // 例外発生
    else print(data); // 成功したので出力
};

var putItem = function(id, value) {
    var params = {
        TableName: 'Sample',
        Item: {
            'Id': id,
            'Value': value
        }
    };
    dynamodb.putItem(params, printDynamoDBResult);
};

実行。

putItem("foo", "hoge");
putItem("bar", "fuga");

scanのスニペットを使って内容確認。

var params = {
    TableName: 'Sample',
};
dynamodb.scan(params, function(err, data) {
    if (err) print(err); // an error occurred
    else print(data); // successful response
});

そろそろ感覚は掴めたと思うので、あとはGetなりDeleteなり、色々やってみると、いつの間にかJSからDynamoDBを使えるようになっていることでしょう!

まとめ

上記の手順を実施するにあたっては、AWSアカウントさえも必要ありません。さらっと試してDynamoDBの感覚を掴んでいただければ幸いです。

脚注

  1. もちろんその際にダウンタイムは発生しません。