2012年6月28日木曜日

GAE/JからSimpleDBを利用する方法

GAEはDatastoreの有料化に伴いとても使いにくくなりました。かといって、他のクラウドサービスはJavaを動かすだけでちょっとお高く、、、という感じで、帯に短しタスキに長しという感じで、個人的にはGAEのプラットフォームはとても好きだけど使えない。。。と悶々としておりました。
 一方、データベースについてはDynamoDBとかSimpleDBなどAWSが魅力的なサービスを提供してますので、GAEとAWSをうまく組み合わせることができたら最高じゃないか?っていうのは誰もが気づくことです。しかし、GAEの制約により、AWSのSDKは使えないということになっています。困ったもんです。。。
ですが、SimpleDBやDynamoDBなどのサービスはRESTインタフェースを持っているわけで、SDKなんか使わなくても単純なRESTアクセスをすれば、GAEからアクセス可能なはずです。だれかそういうことをやっている猛者はいないのかといろいろ探していたのですが、ようやくいいソリューションを発見しました。

Alanwilliamson's Library
RESTを利用してSimpleDBにアクセスする試みってのは探せばあるもんでして、
に、そのライブラリがありました。これを使います。マニュアル等はありませんが、これをつかうことでAWSのSDKなしで純粋なHTTPクラスのみでアクセスできます。ただし、これのみではGAEでは使えません。試したらみたらわかりますが、FileOutputStreamなどを使っているのでこれらがGAEで使えないというエラーが出ます。困りましたね。

Koherent-App-Engine-Library-for-Java
探せばあるもんで、
このライブラリは、
FileOutputStream、FileInputStreamをDatastoreOutputStream、DatastoreInputStreamに置き換える
ということができます。上記のAlanのコードを書き換えましょう。

Content-typeを修正する
上記2つを組み合わせることで、無事動く、、、と言いたいのですが、putAttributeを実行するとなぜか認証エラーがでます。DomainListsの入手では問題ないのに。。。。これは、SimpleDBのRESTの仕様のバグか何か?で
//urlc.setRequestProperty("Content-type", "application/x-www-form-urlencoded" );
urlc.setRequestProperty("Content-type", "application/x-www-form-urlencoded; charset=utf-8" );
のようにヘッダの記述部分を書き換えることで解決します。

おそらく、AWS+GAEの組み合わせを希望しつつ、断念していた人も多いのではないかと思います。しかし、この方法なら大丈夫なはずです。細かいコマンドの動作はまだ試してませんが、後日、ノウハウをまとめたいと思います。


0 件のコメント:

コメントを投稿