Amazon SDB は、データセットにリアルタイムで索引を付けてクエリーを実行するためのフレームワークで、スケーラブルかつ高速な動作が可能です。この SDB を利用すれば、Amazon Web サービス・ベースのアプリケーションは構造化データを簡単に保存、取得できるようになります。また SDB は、EC2 (Elastic Compute Cloud) や S3 (Simple Storage Service) などの他の Amazon Web サービスと効果的に連動するように設計されており、Amazon Web サービス環境内でアプリケーション・スタック全体を構築することを可能にします。このサービスで課金の対象となるのは、サービスを使用した分だけです。さらに、サービスの無料枠も用意されています。
SDB には、以下の優れた特徴があります。
- 信頼性
- 常にデータを利用できるように、SDB は冗長構成になっており、索引付きデータを複数のデータセンターに保存するように設計されています。
- 速度
- Amazon Web サービス環境内の EC2 インスタンスからのリクエストはなおさらのこと、SDB は素早くデータを取得できるように設計されています。
- 単純さ
- SDB にアクセスして使用するためのプログラミング・モデルは単純なため、さまざまなプログラミング言語で使用することができます。
- セキュリティー
- SDB は高度なセキュリティーを提供するように設計されています。データへのアクセスは、許可されたユーザーだけに制限されます。
- 柔軟性
- SDB により、スキーマを事前に定義することなくオンザフライでデータを保存することができます。
- 低コスト
- SDB の料金設定は極めて経済的です。実際に使用した分に対してのみ課金されます。
このセクションの残りでは、SDB を支える概念について説明します。
ドメインとは、構造化データを保存して、そのデータに対してクエリーを実行できるようにするコンテナーのことです。ドメイン内では、データはアイテムとして保存されます。概念上、ドメインはスプレッドシートのワークシート・タブのようなもので、アイテムはスプレッドシートの行に相当します。クエリーは 1 つのドメインに対して実行できますが、SDB の現行バージョンではドメイン間にまたがるクエリーを実行することはできません。
それぞれのドメインには、以下のメタデータが関連付けられます。
- メタデータの最終更新日時
- ドメイン内の合計アイテム数
- ドメイン内の属性名とその値の合計ペア数
- ドメイン内の固有属性名の数
- ドメイン内のすべてのアイテム名の合計サイズ (バイト単位)
- すべての属性値の合計サイズ (バイト単位)
- すべての固有属性名の合計サイズ (バイト単位)
SDB は SQS (Simple Queue Service) と同じく、「結果整合性」モデルに従います。耐障害性を目的に、SDB は各ドメインの複数のコピーを維持し、ドメインに対するあらゆる変更はすべてのコピーに伝搬します。
この操作には数秒かかる場合もあるため、システムの負荷とネットワーク遅延によってはドメインのコンシューマーが変更を即時に確認できない可能性があります。最終的には変更が SDB 全体に伝搬されますが、SDB ベースのアプリケーションを設計する際には、この遅延を考慮することが重要です。ドメイン内の個々のオブジェクトを表すアイテムには、値を設定した属性が含まれます。各アイテムは、概念的にはスプレッドシートを構成するそれぞれの行のようなものです。つまり属性は列に相当し、値はセルに相当します。属性の値は 1 つに限られません。属性が複数の値を持つこともあります。SDB はデータがどのように構造化されているかに関わらず、ドメインに自動的に索引を付けます。
SDB は、ドメインに対するクエリーのそれぞれに実行時間の制限も設けます。クエリーが 5 分を経過しても完了しない場合、SDB はそのクエリーを停止してエラーを返します。
SDB でのドメインは柔軟で、固定されたスキーマはありません。ドメイン内の各アイテムには、最大 256 までの一意の属性セットを含めることができます。アイテムの属性は、そのドメイン内の別のアイテムのどの属性とも完全に異なるものにすることもできます。
SDB の現行バージョンには、アプリケーションを設計する際に考慮しなければならない制限がいくつかあります。表 1 に、これらの制限内容を記載します (Amazon の最新資料で規定されている内容です)。
表 1. 現行の制限
| パラメーター | 現行の制限 |
|---|---|
| ドメインのサイズ | 1 ドメインあたり 10 GB 属性の名前と値のペア数 250,000,000 3-255 文字 (a-z、A-Z、0-9、下線 (_)、ダッシュ(-)、およびピリオド(.)) |
| Amazon Web サービスのアカウントごとのドメイン数 | 100 |
| 属性 | 1 アイテムあたりの名前と値のペア数 256 名前の長さ 1024 バイト 値の長さ 1024 バイト 使用できる文字は、XML 文書内で有効な UTF-8 文字のみです。制御文字や XML で有効でないシーケンスは使用できません。 PutAttributes 操作ごとの属性数 100Select または QueryWithAttributes 操作ごとに要求できる属性数 256 |
| クエリーに対する応答に含まれる最大アイテム数 | 256 |
| クエリーの最長実行時間 | 5 秒 |
| クエリー式ごとの最大述部数 | 10 |
| クエリー式の述部ごとの最大比較演算子数 | 10 |
| select 式ごとの一意の属性の最大数 | 20 |
| select 式ごとの最大比較演算子数 | 20 |
QueryWithAttributes および Select に対するレスポンスの最大サイズ | 1 MB |
Amazon では SDB の無料枠を用意しています。この無料枠の制限を超えた場合には、以下の要素を基準に料金が発生します。
- 各 SDB リクエストのマシン使用量
- 指定されたリクエストを完了するために使用されたマシン処理能力。これは、1.7-GHz Xeon プロセッサーの 1 時間あたりの処理能力に従って正規化されます。
少なくとも 2009年6月1日までは、1 ヶ月につきマシン利用の最初の 25 時間、1 GB のデータ転送、および 1 GB のストレージには料金はかかりません。この、Amazon によって限られた期間、無料で提供される使用量は相当な量になります。この無料枠内で、さまざまなタイプのアプリケーションを簡単に実行することができます。表 2 に、料金例を記載します。
表 2. マシンの使用料金
| 使用時間 | 料金 |
|---|---|
| 最初の 25 時間 | 無料 |
| 25 時間を超える分 | 1 時間あたり $0.14 |
表 3 に記載するのは、SDB との間のデータ転送量です。同一地域内であれば、SDB と他の Amazon Web サービス間でのデータ転送には、料金はかかりません。複数の地域にまたがる SDB と他の Amazon Web サービス間のデータ転送には、転送先と転送元の両方に、インターネット・データ転送料金が発生します。
表 3. データ転送料金
| 転送タイプ | 料金 |
|---|---|
| すべてのデータ転送 | データ・アップロードは最初の 1 GB まで無料 1 GB ごとに $0.100 — 1 GB を超えるすべてのデータ・アップロード データ・ダウンロードは最初の 1 GB まで無料 1 GB ごとに $0.170 — データ・ダウンロード: 1 ヶ月あたり最初の 10 TB まで 1 GB ごとに $0.130 — データ・ダウンロード: 1 ヶ月あたり次の 40 TB まで 1 GB ごとに $0.110 — データ・ダウンロード: 1 ヶ月あたり次の 100 TB まで 1 GB ごとに $0.100 — データ・ダウンロード: 1 ヶ月あたり 150 TB を超える分 |
表 4 は、構造化データ・ストレージ料金の概要です。
表 4. 構造化データ・ストレージ
| ストレージ量 | 料金 |
|---|---|
| すべてのデータ・ストレージ | 最初の 1 GB まで無料 1 ヶ月あたり 1 GB ごとに $0.25 – 1 GB を超えるすべてのデータ・ストレージ |
最新の料金については Amazon SDB を調べてください。また、Amazon が提供する Simple Monthly Calculator を使用して、SDB やその他の Amazon Web サービスの月々の使用料を計算することもできます。
SDB を使い始めるには、Amazon Web サービスのアカウントにサインアップする必要があります (「参考文献」を参照)。Amazon Web サービスのサインアップ手順についての詳細は、連載第 2 回を参照してください。Amazon Web サービスのアカウントを入手した後は、以下のステップに従ってアカウントの Amazon SDB サービスを有効にする必要があります。
- Amazon Web サービスのアカウントにログインします。
- SDB ホーム・ページまでナビゲートします。
- ページ右側の Sign Up For Amazon SimpleDB をクリックします。
- 必要な情報を入力し、サインアップ・プロセスを完了します。
Amazon Web サービスのどのサービスと通信するにも、その手段としては SOAP インターフェースまたはクエリー・インターフェースのいずれかが使用されます。この記事ではクエリー・インターフェースを使用して、サード・パーティーのライブラリーを介して SDB と通信します。
この後、アクセス・キーを取得する必要が出てきたら、Web Services Account 情報ページで AWT Access Identifiers を選択してアクセス・キーを入手してください。これで、Amazon Web サービスを使用するための準備が完了し、アカウントに対して SDB サービスも有効になっています。
この例ではサード・パーティーのオープンソース Python ライブラリー、boto を使用して、Python シェルで小さなコード・スニペットを実行しながら SDB の使い方を学びます。
boto をダウンロードします。この記事を執筆している時点での最新バージョンは 1.6b です。アーカイブは任意のディレクトリーに解凍して構いません。アーカイブを解凍したディレクトリーに移動して setup.py を実行すると、boto がローカル Python 環境にインストールされます (リスト 1 を参照)。
リスト 1. boto のインストール
$ cd directory_where_you_unzipped_boto $ python setup.py install |
Amazon Web サービスのアクセス・キーを指すように環境変数を設定します。アクセス・キーは、Web Services Account 情報ページから入手できます。
リスト 2. 環境変数の設定
# Export variables with your AWS access keys $ export AWS_ACCESS_KEY_ID=Your_AWS_Access_Key_ID $ export AWS_SECRET_ACCESS_KEY=Your_AWS_Secret_Access_Key |
すべてが正しくセットアップされていることを確認するため、Python シェルを起動し、boto ライブラリーをインポートします (リスト 3 を参照)。
リスト 3. 設定の確認
$ python Python 2.4.5 (#1, Apr 12 2008, 02:18:19) [GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import boto >>> |
ここで使用するのは、SDBConnection クラスです。このクラスが、SDB を操作するための主なインターフェースを提供します。boto は Python コンソールから使用します。この例では SDBConnection オブジェクトで数種類のメソッドを呼び出し、SDB が返すレスポンスを調べます。SDB の概念を探るこの手順をとおして、SDB の API についての理解も深まるはずです。
最初のステップは、前の手順で環境に対して export を実行した Amazon Web サービスのアクセス・キーを使用して、SDB との接続オブジェクトを作成することです。boto ライブラリーは必ず最初に環境をチェックして、アクセス・キーを指す変数が設定されているかどうかを確認します。変数が設定されていれば、boto は接続を作成する際に自動的にこれらの変数を使用します。
リスト 4. SDB との接続の作成
>>> import boto >>> sdb_conn = boto.connect_sdb() >>> |
この記事の残りでは、上記で作成した sdb_conn オブジェクトを使って SDB を操作することができます。ドメインを新規に作成するには、ドメインの名前を指定します。
リスト 5. ドメインの作成
>>> d1 = sdb_conn.create_domain('devworks-dom-1')
>>>
|
すべてのドメインのリストを取得します。これによって返される結果セット・オブジェクトは基本的に、Python リストです (リスト 6 を参照)。このリストを繰り返し処理することで、それぞれのドメインにアクセスすることができます。
リスト 6. すべてのドメインのリスト
>>> all_domains = sdb_conn.get_all_domains() >>> >>> len(all_domains) 1 >>> >>> for d in all_domains: ... print d.name ... devworks-dom-1 |
名前を指定して、特定のドメインを取得することもできます。
リスト 7. 単一のドメインのリスト
>>> my_domain = sdb_conn.get_domain('devworks-dom-1')
>>>
>>> print my_domain.name
devworks-dom-1
|
新しく作成されたドメインはアイテムを追加するまでは当然、空の状態です。ドメイン内に新しいアイテムを作成してから、そのアイテムに属性を追加します。
リスト 8. 新規アイテムの作成
>>> my_domain = sdb_conn.get_domain('devworks-dom-1')
>>>
>>> i1 = my_domain.new_item('test_item_1')
>>>
>>> i1['cars'] = 'BMW'
>>>
>>> i1['fruits'] = ['apple', 'orange', 'mango']
>>>
|
アイテムをドメインから取得するには、アイテムの名前を指定します。アイテムの名前は一意の名前でなければなりません。これは、リレーショナル・データベースでの主キーの概念と同様です。
リスト 9. アイテムとその属性の取得
>>> my_item = my_domain.get_item('test_item_1')
>>>
>>> print my_item
{u'cars': u'BMW', u'fruits': [u'apple', u'mango', u'orange']}
>>>
|
上記によって返されるアイテム・オブジェクトは現在有効な Item オブジェクトであるため、このアイテムのいずれかの属性にアクセスすると、アイテムのすべての属性が SDB から取得されます。さらに、このアイテムの属性値を更新すると、その更新内容は自動的に SDB に保存されます。
リスト 10. 属性の更新
>>> my_item['cars'] u'BMW' >>> >>> my_item['cars'] = 'Honda' >>> >>> my_item['cars'] 'Honda' >>> |
SDBConnection クラスを使用してドメインとアイテム名を指定するという方法でも、アイテムと属性を取得することができます。
リスト 11.
SDBConnection を使用したアイテムの取得
>>>
>>> sdb_conn.get_attributes('devworks-dom-1','test_item_1')
{u'cars': u'Honda', u'fruits': [u'apple', u'mango', u'orange']}
>>>
|
アイテムとその属性は、指定して削除することも可能ですが、アイテムに属性が 1 つもない場合、そのアイテムは自動的に SDB によって削除されます。
リスト 12. アイテムとその属性の削除
>>> sdb_conn.get_attributes('devworks-dom-1','test_item_1')
{u'cars': u'Honda', u'fruits': [u'apple', u'mango', u'orange']}
>>>
>>> sdb_conn.delete_attributes('devworks-dom-1','test_item_1')
True
>>> sdb_conn.get_attributes('devworks-dom-1','test_item_1')
{}
>>>
|
リスト 13. ドメインの削除
>>> sdb_conn.delete_domain('devworks-dom-1')
True
>>>
|
構造化データを検索できるように、SDB ではカスタム・クエリー言語を用意しています。この言語には、アイテムに関連付けられた属性の名前と値のペアが含まれます。クエリー式を作成する際の基本構成要素は、述部と呼ばれます。それぞれの述部は、属性を囲む大括弧、比較演算子、そして比較する値で表されます。例えば、['desc' = 'Hello Devworks'] という述部は、属性 desc での同等比較を定義します。述部はそれぞれ個別に評価され、一連のアイテム名を生成します。union、intersection などの設定操作によって複数の述部を組み合わせることで、複合クエリーを作成することもできます。
クエリーで述部を使用するときに考慮しなければならない重要な点として、SDB はすべての述部の比較を辞書式比較によって実行します。したがって、属性には適切なストリング表現で、確実にデータが保存されていなければなりません。また、5 秒を超えるクエリーは自動的に SDB によって中断されることも忘れないでください。
リスト 14. テスト・データの作成
>>> d2 = sdb_conn.create_domain('devworks-dom-2')
>>>
>>> i1 = d2.new_item('car1')
>>>
>>> i1['make']= 'BMW'
>>> i1['color']='grey'
>>> i1['year']='2008'
>>> i1['desc']='Sedan'
>>> i1['model']='530i'
>>>
>>> i2 = d2.new_item('car2')
>>>
>>> i2['make']= 'BMW'
>>> i2['color']='white'
>>> i2['year']='2007'
>>> i2['desc']='Sports Utility Vehicle'
>>> i2['model']='X5'
>>>
|
リスト 15. 述部が 1 つだけのクエリー
>>> rs = d2.query("['make' = 'BMW']")
>>> for result in rs:
... print result.name
...
car1
car2
>>>
|
リスト 16. 複数の述部を持つクエリー
>>> rs = d2.query("['make' = 'BMW'] intersection ['year' = '2007']")
>>> for result in rs:
... print result.name
...
car2
>>>
|
各種の比較演算子をサポートするこのクエリー言語では、範囲クエリーや複数の値を持つ属性クエリーを実行することも可能です。クエリーを作成する際、そしてパフォーマンスを最大限にするために微調整する際のあらゆる可能性とベスト・プラクティスを十分に把握するには、Amazon Web サービスで用意しているクエリー言語の入門記事を読むことを是非ともお薦めします。
ドメインのメタデータを取得して、ドメイン内の合計アイテム数 (そしてその他のデータ) を調べることもできます。
リスト 17. ドメインのメタデータ
>>> my_domain = sdb_conn.get_domain('devworks-dom-2')
>>>
>>> my_metadata = my_domain.get_metadata()
>>>
>>> print my_metadata.item_count
2
>>> print my_metadata.item_names_size
8
>>> print my_metadata.attr_value_count
10
>>> print my_metadata.attr_names_size
22
>>> print my_metadata.attr_values_size
56
>>> print my_metadata.timestamp
1231798889
>>>
|
Amazon の SDB サービスを紹介するこの記事では、基本概念を説明した後、SDB を操作するためのオープンソースの Python ライブラリー、boto が提供するいくつかの関数を使用してみました。
学ぶために
- クラウド・コンピューティングはなぜ重要なのか、そしてクラウド・コンピューティングを導入する方法や、詳しく調べるための資料については、developerWorks の Cloud computing スペースを参照してください。
- 連載「Amazon Web サービスを利用したクラウド・コンピューティング」の他の記事も読んでください。
- 第 1 回: 概要
- 第 2 回: Amazon S3 (Simple Storage Service) によるクラウド内のストレージ
- 第 3 回: EC2 によるオンデマンド・サーバー
- 第 4 回: SQS による信頼性の高いメッセージング
- Amazon Web サービスの各サービスについて学んでください。
- Amazon Simple Storage Service (Amazon S3)
- Amazon Elastic Compute Cloud (Amazon EC2)
- Amazon Simple Queue Service (Amazon SQS)
- Amazon SimpleDB (SDB)
- Amazon チームによって更新される Service Health Dashboard が、各サービスの現状を伝えます。
- Amazon Web サービスの世界で起きた最新の出来事は、このブログに記載されます。
- Amazon Web サービスのアカウントにサインアップしてください。
- Amazon Web Services Developer Community は、すべての開発者リソースにとっての AWS への入口となります。
- SDB Technical Resources に、技術資料とユーザー・ガイド、そして開発者にとって興味深い記事が用意されています。
- Amazon SimpleDB Developer Guide には、SDB の各種コンポーネントについての情報の他、高度な使用方法と構成が記載されています。
- チュートリアル「Query 101: Building Amazon SimpleDB Queries」で案内している多数の実践的な手順をとおして、Amazon SimpleDB の構成について学んでください。
- チュートリアル「Query 201: Tips & Tricks for Amazon SimpleDB Query」では、日付のクエリーをはじめ、否定を使用して効率的なクエリーを作成する方法、そしてクエリーのパフォーマンスを微調整する方法を学べます。
- AWS Simple Monthly Calculator ツールを使用して、EC2 やその他の Amazon Web サービスの月々の使用料を計算できます。
製品や技術を入手するために
- Amazon EC2 (Elastic Compute Cloud) 仮想環境の IBM ソフトウェア製品にアクセスして、今すぐアプリケーションの開発を始めてください。
議論するために
- developerWorks blogs から developerWorks コミュニティーに加わってください。

Prabhakar Chaganti が CTO を務める Ylastic は、EC2、S3、SQS、SimpleDB を含めたユーザーの AWS クラウド・コンピューティング環境全体を設計、管理、モニターするための統一インターフェースを構築している新興企業です。彼は最近、『Xen Virtualization』および『GWT Java AJAX Programming』という 2 冊の本を書いています。VMware Global Virtual Appliance Challenge では、最も革新的な仮想アプライアンスに贈られるコミュニティー特別賞も受賞しています。