preload
2月 27

Amazon Web Service の Simple DB を試してみたけど、なかなかリクエストの作成がうまくいかなくて、一回リクエストに成功したところで、明日も早いしもう寝るか、というポスト。へにょいリクエスト作成用の Ruby クラス付き。


Amazon Simple DB (以下、ASDB)
は Web ベースで利用できるデータベースサービス。REST やら SOAP やらでアクセスできる。利用には Amazon Web Service (以下、AWS) のアカウントと Simple DB サービスへのサインアップが必要。2007 年末くらいから公開されていたのだが、サインアップが遅れた (Limited Beta の) ため、順番待ちに入っていた。で、1 月末にようやく使えるようになった。
ちなみに、S3 やら EC2 と同じく従量課金。手軽にスケールアウトできそうな反面、規模によっちゃ実はそんなに安くないんじゃないの?とハマりそうではある。(EC2 立ち上げっぱなしで放置してたら $70/月 くらいかかった。)

ASDB では、Domain というデータセットのハコに Item という単位でレコードを追加していく。Item には Attribute という名前で属性を付加する事ができ、記録されているレコードには Query によりアクセスする事ができる。ちょっと強引に RDB のように解釈するなら、Domain がテーブル、Item がレコード、Attribute はカラムみたいなものだとおもう。

まず、REST の API を使って、上記でいう Domain を定義する CreateDomain アクションを試してみる。実際の利用には、AWS にサインアップして得られる AWS Access Key ID と AWS Secret Access Key が必要。

ASDB へのリクエストの構成要素は大まかに以下のような感じ。これを GET のパラメタに含める。

  • AWS Access Key ID
  • アクション
  • アクション毎に指定するオプションパラメタ
  • タイムスタンプ
  • APIバージョン
  • シグネチャバージョン
  • シグネチャ

ここで、最後のシグネチャは、以下のようにして作る。

  1. シグネチャ以外の構成要素 (AWS Access Key ID 〜 API バージョン) をキー名で昇順ソートする
  2. ソートしたペアのキーと値をセパレータとか付けずに単純に並べる
  3. 並べたパラメタを HMAC-SHA-1 にかけてメッセージダイジェストを得る。この時の秘密鍵に AWS Secret Access Key を指定する
  4. 得られたダイジェストを Base64 エンコードする
  5. 得られたエンコード文字列を更に URL エンコードする

このようにして得られたシグネチャを Signature 値としてリクエストに含める事で、ASDB がメッセージの正当性を確認してくれるというしくみ。

で、このリクエストを作成するクラスが以下のもの (AWSACCESSKEY やら AWSSECRETKEY はサインアップして得られるものを使う):

require 'openssl'
require 'base64'
require 'cgi'
class AmazonSimpleDb
BASEURI = 'https://sdb.amazonaws.com/?'
AWSACCESSKEY = 'Your AWS Access Key'
AWSSECRETKEY = 'Your AWS Secret Key'
def initialize
@params = Hash.new
@params.store('AWSAccessKeyId', AWSACCESSKEY)
@params.store('SignatureVersion', '1')
@params.store('Version', '2007-11-07')
end
def add_param(key, value)
@params.store(key, value)
end
def request_uri
uri = BASEURI
message = ''
(@params.sort_by { |x| x[0].downcase }).each do |e|
uri << "#{CGI.escape(e[0])}=#{CGI.escape(e[1])}&"
message << "#{e[0]}#{e[1]}"
end
hmac = OpenSSL::HMAC.new(AWSSECRETKEY, OpenSSL::Digest::SHA1.new)
hmac.update(message)
signature = CGI.escape(Base64.encode64(hmac.digest).chop)
uri << "Signature=#{signature}"
end
end

sort_by してるんで、Ruby は 1.8 以上で。パラメタは case-sensitive なのに、ソート時は case-insensitive だったり、生メッセージは URL エンコード不要だったり(そりゃそうか)、Base64 したら最後に改行文字が入ってたりにハマった。

これを AmazonSimpleDb.rb とかで保存して、以下のような感じで使う。タイムスタンプで指定してる日付は適当。DomainName に DoCoMo とか指定してるのは、機種情報 DB を作ってみようとしただけで、深い意味は無し。XXX やら YYY はダミーです。

$ irb -r 'AmazonSimpleDb'
irb(main):001:0> asdb = AmazonSimpleDb.new
=> #"2007-11-07", "AWSAccessKeyId"=>"XXXXXXXXXXXXXXXX", "SignatureVersion"=>"1"}>
irb(main):002:0> asdb.add_param('Action', 'CreateDomain')
=> "CreateDomain"
irb(main):003:0> asdb.add_param('DomainName', 'DoCoMo')
=> "DoCoMo"
irb(main):004:0> asdb.add_param('Timestamp', '2008-02-26T23:27:00-09:00')
=> "2008-02-26T23:27:00-09:00"
irb(main):005:0> asdb.request_uri
=> "https://sdb.amazonaws.com/?Action=CreateDomain&
AWSAccessKeyId=XXXXXXXXXXXXXXXX&
DomainName=DoCoMo&
SignatureVersion=1&
Timestamp=2008-02-26T23%3A27%3A00-09%3A00&
Version=2007-11-07&
Signature=YYYYYYYYYYYY" (実際は一行)

得られた request_uri にブラウザとか適当な https が行けるクライアントからリクエストを投げれば XML で結果が返ってくる。net/http でアクセスするところはまだ作ってない。ていうか、まだ PutAttributes も Query も試してないし。これでバッコンバッコンリクエスト投げたらいくら請求くるんだろう。。誰かやってみたひと居ないかな..

参考:

Tagged with:
7月 29

Amazon EC2(Elastic Compute Cloud (Beta)) を試したので、そのメモ。Amazon EC2 は低額でAmazon.com管理のデータセンタ内に仮想コンピューティング環境を構築/利用できるサービス。利用状況に応じて、仮想環境数(ノード(インスタンス)数)、ストレージ容量を動的に変更することができるため、スケールするかもしれないけどスモールスタートでやっとくか、というサービスを作ってみるには都合の良さそうなサービスだ(スケールを想定するのであれば、アプリ側での工夫も必要だが)。そいえば、Second Lifeもこの環境上で動いてるとかなんとか。

で、3月くらいにbetaサービスに申し込んだのだが、申し込みが殺到してるらしく、利用可能な状況になるまでずいぶん待たされた。先日ようやく使えるようになったので、そのときのメモを残しておく。今はそんなに待たなくても使えるのかもしれない。なお、EC2を使うためには、Amazon S3(Simple Storage Service) の申し込みも併せて必要になる。ちなみに EC2 と S3 とも、料金体系は起動ノード(インスタンス)数/時間、ストレージ容量、転送データ量、リクエスト数等による従量制。
あと、ほとんどのツールはbashで書かれたシェルスクリプト群で提供されている(DOSプロンプト用のツールもあって、Windowsでも使えるぽい(けど、試してないからよくわからない))ので、ターミナル等の然るべき環境が必要になる。

さて、申し込みが終わって、EC2 環境が使えるようになると、次のようなメールが届く。

This is a brief note to confirm that we’ve enabled your access to the Amazon Elastic Compute Cloud (Amazon EC2) limited beta. We hope you enjoy the service and wanted to point out a few resources that will help you get up and running quickly. Please be sure to visit the following:

* Amazon EC2 Getting Started Guide – the best starting point for developing with Amazon EC2
* Amazon EC2 Developer Forums – share your ideas and receive support from AWS staff and developers
* Amazon EC2 Resource Center – technical documentation, code samples, and other resources to help you build
:
:

Getting Started Guide を読んでいけば、Amazon EC2 上で起動した Fedora Core 環境へ ssh ログインして apache 起動したり、そのデフォルトページをブラウザから確認するところまでは簡単に行き着ける。おおまかな流れは、次の通り。

  1. コマンドラインツールの取得
  2. ツール利用(環境変数)設定
  3. 認証用の秘密鍵と証明書の生成
  4. 利用できる仮想環境イメージの確認
  5. 仮想環境組込み用の鍵ペアの生成
  6. 仮想環境の起動
  7. 仮想環境のアクセス権設定
  8. 仮想環境へのssh接続

仮想環境イメージはデフォルトで Fedora Core のものがいくつか提供されているが、オリジナルのものを作ることもできるし、Amazon.comのフォーラムにいろんなイメージが転がってるので、それを使うこともできる。

続きはまた今度。

Tagged with: