Amazon SimpleDB

2010年12月14日 (火)

AWS SDK for JavaでAmazon SimpleDBを使う


前回、Amazon SimpleDBの記事で、コマンドラインから操作する方法を紹介しましたが、
今日はJavaから使う方法を紹介したいと思います。

■ AWS SDK for Java

JavaからAmazon Web Servicesを操作するには、Amazon純正のSDKである
「AWS SDK for Java」を使います。以下からダウンロードできます。

http://aws.amazon.com/sdkforjava/


■ 使うための準備

AWS SDK for Javaの現在のバージョンは1.0.14なので、aws-java-sdk-1.0.14.jarというファイルがダウンロードできると思います。これをクラスパスに通しましょう。
また、CommonsのHTTPクライアントライブラリやCODECライブラリが必要になるので
それぞれ以下からダウンロードしてクラスパスに通しましょう。

http://hc.apache.org/httpclient-3.x/
http://commons.apache.org/codec/


■ 最初にアクセスキー、秘密キーのセットアップ

最初にアクセスキーと秘密キーを指定して、AWSCredentialという認証情報を持つインタフェースを実装しているBasicAWSCredentialsクラスのインスタンスを作成します。
そして、認証情報を引数にしてAmazonSimpleDBClientというのクライアントクラスの
インスタンスを作成します。AmazonSimpleDBClientは同期アクセス版のクライアントです。
非同期版は別にあるのですが、今回は同期版で進めます。

// アクセスキーと秘密キーは任意のものを指定してください。
String accessKey = "xxxxxxxxxxxxxxx";
String secretKey = "xxxxxxxxxxxxxxx";

AmazonSimpleDB sdb = new AmazonSimpleDBClient(new BasicAWSCredentials(accessKey, secretKey));


■ エンドポイントURLでRegionの指定

アメリカ東海岸、西海岸、シンガポールなど、どこのSimpleDBサーバを使うか指定します。

sdb.setEndpoint("sdb.us-west-1.amazonaws.com");

今回はアメリカ西海岸を使うことにします。各Regionのエンドポイントは以下にあります。

http://docs.amazonwebservices.com/AmazonSimpleDB/latest/DeveloperGuide/index.html?Endpoints.html


■ ドメインを作成(CreateDomain)

ここまでで準備ができたのでドメイン作成から始めてみます。
"book"というドメインを作ってみます。以下の通りです。簡単ですね。

sdb.createDomain(new CreateDomainRequest("book"));


■ アイテムを作ってみます(PutAttributes)

"book"というドメインに、キーをISBN(4873110963)として、属性には"name"と"author"を入れて
アイテムを作ってみます。

sdb.putAttributes(new PutAttributesRequest()
.withDomainName("book")
.withItemName("4873110963")
.withAttributes(
new ReplaceableAttribute("name","Programming Perl", true),
new ReplaceableAttribute("author","Larry Wall", true)
)
);

けっこう簡単ですね。


■ アイテムを1件取得します(GetAttributes)

先ほど作成したアイテムを取得します。GetAttributesというAPIを使います。
ドメインとアイテムのキー(ItemName)を指定して取得します。取得できた値は
GetAttributesResultというクラスのインスタンスに格納されるので、以下のように
ループをまわすと属性情報が取得できます。

GetAttributesResult getAttrResult = 
sdb.getAttributes(
new GetAttributesRequest()
.withDomainName("book")
.withItemName("4873110963")
);

// 属性情報を表示します
for (Attribute attr : getAttrResult.getAttributes()) {
System.out.println("name = " + attr.getName() + ", value =  " + attr.getValue());
}


■ Select文でアイテムを取得します。

以下のようにSelect文を指定して、値を取得することができます。
取得できる値はItemクラスのインスタンスに格納されて返って来ます。
これも簡単にいきますね。

String query = "select name, author from book where author like \"Larry%\" ";
for (Item item : sdb.select(new SelectRequest(query)).getItems()) {
    System.out.println("------------");
    System.out.println("Item Name = " + item.getName());
    for (Attribute attribute : item.getAttributes()) {
        System.out.println("\tAttribute");
        System.out.println("\t\tName = " + attribute.getName());
        System.out.println("\t\tValue = " + attribute.getValue());
    }
}


■ アイテムの削除(DeleteAttributes)

あるアイテムの、ある属性でけ削除したい場合はDeleteAttributesというAPIを使います。
bookドメインのあるアイテムの"author"という属性を削除したい場合、以下のように
書きます。

sdb.deleteAttributes(new DeleteAttributesRequest("book", "4873110963")
.withAttributes(new Attribute().withName("author")));

また、あるアイテムをひとつまるごと消したい場合は、以下のように
属性を指定しないで、DeleteAttributesを呼び出します。

sdb.deleteAttributes(new DeleteAttributesRequest("book", "4873110963"));


■ Consistent Readの指定

Amazon SimpleDBでは一貫性読み込みのオプションをつけて、アイテムを読み込むことが
できます。これも非常に簡単でGetAttributesのAPIでwithConsistentReadをtrueに設定するだけです。

sdb.getAttributes(new GetAttributesRequest().withDomainName("book").withItemName("4873110963").withConsistentRead(true));


■ ドメイン削除

最後にドメイン削除です。以下のような感じであっさりです。

sdb.deleteDomain(new DeleteDomainRequest("book"));


■ まとめ

今回はAWS SDK for Javaを使ってAmazon SimpleDBを操作する方法の主要な箇所をだいたい書きました。この記事自体は技術的には内容は薄いですが、簡単なお勉強には役に立つかもしれません。

次回からはAmazon Web Servicesからはちょっと離れたクラウドネタを書いてみようかと
思います。

2010年11月18日 (木)

Amazon SimpleDBをコマンドラインから使う方法

こんにちは、大橋です。

前回、Amazon SimpleDBに関して記事を書きましたが、
今回は実際にSimpleDBに触ってみる方法を書きます。

■ まずはツールの選択

GUIベースのツールでは以下のようなツールがあります。

・AWS Toolkit for Eclipse
     http://aws.amazon.com/eclipse/
・SDB Explorer(有料、試用期間あり)
     http://www.sdbexplorer.com/

最初のものはAmazon純製ですね。
また、CUIでは以下のようなものがあります。

・Amazon SimpleDB command line interface(amazon-simpledb-cli)
 http://code.google.com/p/amazon-simpledb-cli/

他にもツールはいろいろあると思いますが、サーバ管理者としては
CUIベースでできるものがほしいので、まずはamazon-simpledb-cli
を使ってAmazon SimpleDBを操作できるようになりたいと思います。

■ amazon-simpledb-cliのインストール

【モジュールのインストール】

amazon-simpledb-cliはPerlでできています。
最初に必要な以下のモジュールをインストールします。

  • Getopt::Long
  • Pod::Usage
  • Digest::SHA1
  • Digest::HMAC
  • XML::Simple

cpanmでインストールすると簡単です。以下のようにcpanmコマンドを実行すると
インストールできます。簡単ですね。

 > cpanm XML::Simple

cpanmの使い方インストール方法は以下が分かりやすいので参考にしてみてください。
http://www.omakase.org/perl/cpanm.html

 【Amazon SimpleDB用のPerlモジュールのインストール】

次にAmazon SimpleDB用のモジュールのインストールをします。
モジュールをダウンロードして、以下のようにコマンドを打ってインストールします。

> curl -Lo amazon-simpledb-perl-library.zip http://amazon-simpledb-perl-library.notlong.com
> unzip amazon-simpledb-perl-library.zip
> sitelib=$(perl -MConfig -le 'print $Config{sitelib}')
> sudo cp -r AmazonSimpleDB-*-perl-library/src/Amazon $sitelib/

これでモジュールセットアップは完了です。

 【simpledbコマンドのインストール】

> sudo curl -Lo /usr/local/bin/simpledb http://simpledb-cli.notlong.com
> sudo chmod +x /usr/local/bin/simpledb

なお、simpledbコマンドの1行目は 「#!/usr/bin/perl」 となっています。
必要に応じて「#!/usr/bin/env perl」などと書き換えてください。

【環境変数のセットアップ】

コマンドとして実行したり、.bashrcに記載するなどして以下のようにAmazon SimpleDBのアクセスキーと秘密キーをセットアップしておいてください。

export AWS_ACCESS_KEY_ID='xxxxxxxxxxxxxxxxx'
export AWS_SECRET_ACCESS_KEY='xxxxxxxxxxxxxxxxxxxx'

【インストールできているか確認する】

PATHが/usr/local/binに通っている場合は以下のようにコマンドを打つと
ちゃんと実行され、ヘルプがでます。/usr/local/bin/simpledb とコマンドを
打ってもOKです。

> simpledb
Usage:
     simpledb [opts] create-domain DOMAIN
     simpledb [opts] delete-domain DOMAIN
     simpledb [opts] list-domains

     simpledb [opts] put         DOMAIN ITEM [NAME=VALUE]...
     simpledb [opts] put-replace DOMAIN ITEM [NAME=VALUE]...
     simpledb [opts] get         DOMAIN ITEM [NAME]...
     simpledb [opts] delete      DOMAIN ITEM [NAME[=VALUE]]...

     simpledb [opts] select SELECTEXPRESSION

Options:
     --help         Print help and exit.

     --aws-access-key-id KEY
                    AWS access key id
                    [Defaults to $AWS_ACCESS_KEY_ID environment variable]

     --aws-secret-access-key SECRETKEY
                    AWS secret access key
                    [Defaults to $AWS_SECRET_ACCESS_KEY environment variable]

     --max COUNT
                    Maximum number of domains/items to retrieve and list.
                    [Defaults to all]

     --separator STRING
                    Separator between attribute name and value.
                    [Defaults to equals (=)]

Arguments:
     DOMAIN            Domain name
     ITEM              Item name
     NAME              Attribute name
     VALUE             Attribute value
     SELECTEXPRESSION  SimpleDB select expression

■ amazon-simpledb-cliを使ってみる】

【コマンド書式】

基本的な書式は以下です。

> simpledb コマンド名 ドメイン名 値

【ドメイン作成】

書籍(book)ドメインを作ってみましょう。以下のようにすればドメインが作成できます。

> simpledb create-domain book

【値を何かputしてみる】

putコマンドで書籍(book)ドメインに書籍アイテムを一つ入れてみましょう。Itemの主キーとなる部分にはITEM名には
ISBN(4873110963の部分)を登録します。その他は書籍名(name)、値段(price)、著者名(author)をいれます。

> simpledb put book 4873110963 name='Programming Perl' price=5565 author='Larry Wall'

【アイテムの属性(Attribute)に2個目の値を入れてみる】

SimpleDBで1つの属性に複数の値を入れることができます。以下のようにすれば、2つ目の値が入ります。
主キーとなる部分にはISBNを指定し、追加する属性のところだけ値をいれます。

> simpledb put book 4873110963 author='Tom Christiansen'

【アイテムを更新する】

アイテムの属性に値を追加するのではなくて、アイテムそのものを入れ替える場合は以下のようにput-replacekコマンドを使います。

> simpledb put-replace book 4873110963 name='Programming Perl' price=5565 author='Larry Wall'

【Select文でアイテムを取得する】

以下のようにSelect文でアイテムの情報が取得でき、出力が得られます。
アイテムごとの最初の行がITEMのキー(この場合はISBN)です。

> simpledb select 'select name, price, author from book'
4873110963   # ISBN(主キーの部分)
author=Larry Wall
author=Tom Christiansen
price=5565
name=Programming Perl

以下のようにLike文などSQLっぽいクエリを投げることができます。

> simpledb select 'select name, price, author from book where author like "Larry%" '

likeや=, >, <, OR, ANDなどいろいろな演算子が使えます。詳しくは以下あたりから
情報をたどるといろいろなクエリが分かります。

http://docs.amazonwebservices.com/AmazonSimpleDB/latest/DeveloperGuide/index.html?UsingSelect.html

機会があれば、もう少し丁寧にクエリを解説したいですが、今回はスキップします。

【アイテムをgetする】

以下のようにITEMのキーを指定して、アイテムを1つ取得することができます。

> simpledb get book 4873110963 
author=Larry Wall
author=Tom Christiansen
price=5565
name=Programming Perl

【アイテムを削除する】

以下のようにITEMのキーを指定して、アイテムを1つ削除できます。

> simpledb delete book 4873110963

【ドメインを削除する】

最後にドメインの削除です。以下のようにdelete-domainコマンドで削除できます。

> simpledb delete-domain book

【まとめ】
以上がAmazon SimpleDBをコマンドラインから使う方法の紹介です。

一通りこれだけのコマンドが分かっていれば、デバッグするなど簡単な
オペレーションはだいぶ便利になると思います。

次回はJavaでAmazon SimpleDBを操作してみたいと思います。また、Consistent ReadやConditional Put/Deleteについても近いうちに書いてみるつもりです。

2010年11月16日 (火)

Amazon SimpleDBについて調べたことをまとめました

こんにちは。大橋です。

最近、セールスフォース関連の仕事でAmazon SimpleDBの話題がでることがあったのですが、
EC2やS3に比べると情報が少ないなぁ、というのを実感しました。

そこで、SimpleDBについていろいろ勉強してみました。ただ、量が多いので分割して
記事にしたいと思います。今回の記事ではSimpleDBとは何かということ、RDBと比較しながら
データモデルの説明、そしてどのような操作(API)があるのか、制約、メリットなど、
調べたことをまとめたいと思います。

【SimpleDBとは?】

SimpleDBはHTTPベースのAPI(REST/SOAP)で操作できる構造化されたデータストアです。
Amazonのページによると以下のように説明があります。

Amazon SimpleDB は可用性、拡張性、柔軟性の高い、非リレーショナル型データストアで、
データベース管理の負荷を軽減します。開発者は簡単なwebインターフェイスを使ってデータの保存や参照を行うだけで、
後はAmazon SimpleDB が残りの部分を担当します。

RDBではないのですが、ある程度構造化されたデータをHTTPベースのAPIで
簡単に扱うことができるデータベースというところです。

では、中身を追っていきます。

【データモデル】

Amazon SimpleDBのデータモデルをRDBと比較しながら説明します。

例として以下のような書籍データベースを考えてみます。
RDB的には以下の表そのものがテーブルに該当します。フィールドは書籍名(Name)、価格(Price)、商品のURL(URL)、著者名(Author)で、主キーにあたるところがISBN(Item Name)にあたると考えてください。

Simpledb_2


SimpleDBでは、上記の表のようなデータについて以下のように考えます。

(やや乱暴な言い方ですが、)RDBのテーブルに該当するのが「ドメイン」です。上記の表の1レコード1レコードは1つのアイテムです。
アイテムにはアイテムを一意に決めるユニークなキーがあります。それがItemのNameです。
ここはユニークでないといけません。この書籍のデータではISBNを入れています。

アイテムは複数の属性(Attribute)を持ちます。これが書籍名(Name)、価格(Price)、商品のURL(URL)などのフィールド(カラム)に該当します。各属性には名前と値があり、Price(名前)=3780(値)というように指定します。また、値はすべて文字列で、インデクシングされます。RDBならば各属性には1つの値しか入れることはできませんが、SimpleDBでは1つの属性に複数の値を入れることができます。上記の表では著者名(Author)が該当します。

なんとなく分かりましたでしょうか。乱暴な言い方をすれば、以下のように考えればよいかと。

  • テーブルがドメイン
  • RDBのレコードにあたるものがアイテム(Item)
  • 主キーにあたるところがItem Nameでドメイン内ではユニークでないといけない
  • 各フィールド(カラム)のことは属性(Attribute)という。
  • 1つのアイテムのある属性の値は複数持つことができる
  • 属性の値は文字列だけ。すべての値はインデクシングされる。


【SimpleDBの機能】

次に、SimpleDBがアプリ開発者に提供している機能を紹介します。ドメイン操作に関することと、アイテムなどデータを操作に関することの大きく2つの機能群があるのでそれぞれ説明します。

ドメイン操作

ドメイン操作には以下の4種類の機能がAPIとして提供されています。

  • CreateDomain

        ドメインを作成します

  • DeleteDomain

        ドメインを削除します

  • ListDomains

        アクセスキー、秘密キーでアクセスできるドメインのリストをできます。

  • DomainMetaData

        ドメイン名、ドメイン内のアイテム数や属性値の数など、ドメインに関するメタ情報を取得できます。

データ(Item)操作

データ操作には以下の操作がAPIとして提供されています。

  • PutAttributes

        アイテムと属性を登録するか、アイテム名を指定して属性を登録/更新します。

  • GetAttributes

        アイテムのNameを指定して、アイテム情報を1件取得できます。

  • BatchPutAttributes

        複数のアイテムをまとめて登録/更新できます。(1回の操作で25件)

  • Select

        SimpleDB用のselect文でアイテムを取得できます。

  • DeleteAttributes

        アイテムから属性を削除します。また、アイテムそのものを削除します。

  • BatchDeleteAttributes

        複数のアイテムについて属性削除からアイテムそのものを削除します。

【ドメイン/アイテムに関する制約事項、気をつけるポイント】

ここまで、「どんなことができるか」を簡単に説明してきましたが、それなりに制約もあります。

以下に気をつけたほうがいい制約事項を列挙します。

  • APIのリクエストサイズは1MBを超えることはできません。(BatchPutAttributesあたりで関係します)
  • 1つのアイテムにつき、属性は最大256個までです。
  • 1つのドメインに10億アイテムまで格納できます。つまり、それを超えた場合はドメイン名を変更するなど対処が必要です。
  • ドメインごとに最大10GBのユーザデータを持つことができます。
  • 1つのアカウントにつき100件のドメインを作成できます。ただし、AWSのサポートに連絡すれば追加ドメイン作成もお願いできるようです。※ http://aws.amazon.com/contact-us/simpledb-limit-request/ でお願いできるみたいです。
  • 1つのクエリ(select)で取得できるアイテム数は最大2500です。
  • RDBではないので、joinはできません。工夫してデータモデルの設計を行いましょう。
  • RDBのようにスキーマを事前に定義するわけではありません。いわゆるスキーマレスなデータベースになります。

それと、Wikipediaに以下のように記載がある通り、CAP定理に置ける一貫性は成立していないです。この辺がクラウド的(?)です。

CAP定理において、一貫性が成立していなく、それゆえ、書き込みをしても、一貫性読み込みを指定しない限り、読めるようになるまで1秒程度以下の時間がかかる。


【うれしいポイント】

制約も説明したので、個人的にうれしいと思っているポイントも列挙しておきます。

  • 管理が簡単

        インストールとかセットアップとかほとんど不要です。

        バッファとか一所懸命調整しなくても十分なパフォーマンスが出ます(出るらしいです)。

  • 高い可用性

        Amazon S3やSQSと同じように高い可用性があります。

        データは地理的に分散された環境の保存されるのでMySQLで

        一所懸命レプリケーション設定する、みたいなことはしなくてよいです。

  • EC2と使うのであれば高速

        同一リージョンであればLAN内アクセスと同程度の遅延でアクセスできます。

  • HTTPベースなのでEC2以外からも容易にアクセスできる

        オンプレミスの環境やセールスフォースなど他のクラウド環境からも

        REST/SOAPのAPIを通じて簡単にアクセスできます。

        SimpleDBを介したデータ連携なども容易にできます。
        (注意しないとセキュリティ上危険なことにもなりそうですが)

  • すごく安い

        あとで説明しますが、すごく安いです。

        Amazonのデータベースサービスでは他にAmazon RDSが
        ありますが、それと比べてもずっとずっと安いです。

【課金体系】

詳細は以下を見てください。安いです。

http://aws.amazon.com/jp/simpledb/#pricing

US価格だとデータ転送は送信に限り、0.15ドル/GB(US価格)、データ保存は1ヶ月に0.25ドル/GBです。それぞれ最初の1GBは無料です。それと、PUT/GET/Selectなどのクエリを実行するのに使ったSimpleDBのマシン稼働時間も課金対象です。毎月、最初の25時間は無料で、そのあとは1時間あたり0.140ドルです。

【まとめ】

今回はSimpleDBについてその概要的なことを説明しました。
joinができない、スキーマレス、一貫性、あたりにとまどいが出てしまう面はありますが、
簡単に使えて、Amazonクォリティの可用性があるデータベースということで、けっこう魅力があると思っています。特に、EC2だけでなく多様な環境が入り交じったときなどにHTTPベースのAPIで操作できることは大きなメリットがあるのではないかと考えています。

次回からはコマンドラインでの使い方やプログラムからの使い方など
より実戦で使いそうな内容を書いていきたいと思います。

採用情報

株式会社フレクトでは、事業拡大のため、
・Salesforce/Force.comのアプリケーション開発
・HerokuやAWSなどのクラウドプラットフォーム上での
Webアプリケーション開発
エンジニア、マネージャーを募集中です。

未経験でも、これからクラウドをやってみたい方、
是非ご応募下さい。

フレクト採用ページへ

会社紹介

株式会社フレクトは、
認定コンサルタント
認定上級デベロッパー
認定デベロッパー
が在籍している、セールスフォースパートナーです。
また、heroku partnersにも登録されています。
herokuパートナー
株式会社フレクトのSalesforce/Force.com
導入支援サービス
弊社の認定プロフェッショナルが支援致します。
・Visualforce/Apexによるアプリ開発
・Salesforceと連携するWebアプリ開発
も承っております。
セールスフォースご検討の際は、
お気軽にお問合せください。

2017年12月

          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 27 28 29 30
31            
ブログ powered by TypePad