読者です 読者をやめる 読者になる 読者になる

プログラマでありたい

おっさんになっても、プログラマでありつづけたい

RubyでAmazon DynamoDBを使ってみた

 話題のDynamoDB。かなり面白そうです。アマゾンの大量のトランザクションを支える技術を、インフラの面倒をみることなく使えるという、まさにクラウドの醍醐味というサービスです。
 今までクラウドとRDBの相性の悪さというのはどうしてもありました。RDBの本分は一貫性ですからね。それに対してNoSQLは分散性を重視したモノが多いです。そのトレードオフの部分を良い塩梅に調整してくれそうなのが、DynamoDBになるのじゃないかと期待しております。また性能と値段の関係など、解りやすくて非常にありがたいです。
 と言っても、まずは実際に使ってみないと話にならないので、サンプルコードを元に使ってみました。RubyでDynamoです。基本的にはSDKのサンプル通りに使えるのですが、認証絡みの部分が少し説明不足のようなので少し手こずりましたのでメモを残しておきます。


SDKのインストール

gem install aws-sdk

これだけです。DynamoDBの他にも下記のサービスが扱えるようです。
Amazon Elastic Compute Cloud(Amazon EC2)
Amazon SimpleDB
Amazon Simple Email Service
Amazon Simple Notification Service (Amazon SNS)
Amazon Simple Queue Service(Amazon SQS)
Amazon Simple Storage Service(Amazon S3)
AWS Identity and Access Management
Elastic Load Balancing


使い方
公式のサンプルをなぞりました。
Class: AWS::DynamoDB AWS SDK for Ruby


認証の部分は、下記を参照
Requesting AWS Security Token Service Authentication for Amazon DynamoDB - Amazon DynamoDB

1.
Obtain an AWS account with permission to use Amazon DynamoDB.
2.
Use your own AWS account credentials to request a set of session credentials from the AWS IAM service using the GetSessionToken action. The resulting session credentials contain: a session token, a Secret Access Key, an expiration date, and an Access Key ID.
For information about formatting IAM requests, see Making Query Requests.
For the complete AWS Security Token Service API, including sample requests, see the AWS Security Token Service API Reference.

3.
Use the Secret Access Key to sign your requests to Amazon DynamoDB. For details on signing a request to Amazon DynamoDB, see Calculating the HMAC-SHA Signature for Amazon DynamoDB.

4.
Provide the resulting signature and token values to Amazon DynamoDB in the header of your request to authenticate with Amazon DynamoDB as long as the token is valid. For details on forming a request to Amazon DynamoDB, see HTTP Header Contents.

 まず、WebサイトからDynamoDBのサインアップを行います。次にIAMのAccess Key ID,Secret Access Keyとsession tokenを使ってアクセスします。アクセスIDとシークレットアクセスキーはいいとして、session tokenとは何でしょう?どうやらAccess Key IDとSecret Access Keyを元に所定のアルゴリズムを元に生成するようです。実際のところはIAMのGetSessionToken機能を使えとのことで、クエリーの書き方へのリンクがあります。ただaws-sdkのAWS::STS(AWS Security Token Service)というクラスが用意されているので、それを使えば良いと思います。


 まとめると、次のような流れとなります。
〜事前作業〜
1.DynamoDBのサインアップ
2.IAMのユーザアカウント作成
3.そのユーザにDynamoDBへのアクセス権限を設定(Amazon DynamoDB Full Access)
〜プログラム〜
4.AWS::STSでセッショントークンの作成
5.アクセスID、シークレットアクセスキー、セッショントークンを元にDynamoDBオブジェクト作成
6.DynamoDBの各種操作


サンプルソース(Sample Source)

require 'rubygems'
require 'aws-sdk'

iam_access_key_id = "hogehoge"
iam_secret_access_key = "hogehoge"

sts = AWS::STS.new(
  :access_key_id => iam_access_key_id,
  :secret_access_key => iam_secret_access_key)

session = sts.new_session()

access_key_id = session.credentials[:access_key_id]
secret_access_key = session.credentials[:secret_access_key]
session_token = session.credentials[:session_token]

dynamo_db = AWS::DynamoDB.new(
    :access_key_id => access_key_id,
    :secret_access_key => secret_access_key,
    :session_token => session_token
    )

dynamo_db.tables.create('my-table', 10, 5)
#table = dynamo_db.tables['my-table']
dynamo_db.tables.each {|table| puts table.name }

begin
  sleep 3
  puts "Waiting on status change #{table.status}"
end while table.status == :creating

item = table.items.put(:id => "abc123")
item.hash_value # => "abc123"
item.attributes.set(
  :colors => ["red", "blue"],
  :numbers => [12, 24]
)

 注意点としては、IAMユーザのaccess_key_idとsecret_access_keyと、それで作成したSTSオブジェクトのaccess_key_id,secret_access_keyは別物であるということです。私はそれに気が付かず、ひたすら下記のようなエラーを出していました。

/Library/Ruby/Gems/1.8/gems/aws-sdk-1.3.2/lib/aws/core/client.rb:262:in `return_or_raise': The security token included in the request is invalid (AWS::DynamoDB::Errors::UnrecognizedClientException)
from /Library/Ruby/Gems/1.8/gems/aws-sdk-1.3.2/lib/aws/core/client.rb:322:in `client_request'
from (eval):3:in `create_table'
from /Library/Ruby/Gems/1.8/gems/aws-sdk-1.3.2/lib/aws/dynamo_db/table_collection.rb:98:in `create'
from sample.rb:28


 まだ触り始めたところですが、ひと通りの操作は後はドキュメントを読めば出来そうです。性能評価等、今後やっていきたいなと考えています。


See Also:
Amazon、DynamoDBをローンチ―AWS上で自動的にスケールする本格的NoSQLDB
Amazonクラウド、SSD上の新NoSQLデータベース「DynamoDB」を公開。性能をダイナミックに上げ下げ可能 − Publickey
【AWS発表】 Amazon DynamoDB - インターネット時代のアプリケーションのために設計された高速でスケーラブルなNoSQLデータストレージ - Amazon Web Services ブログ