The vision of eventually forming a truly scalable deployment architecture using Amazons EC2, S3, SQS and SimpleDB web services together, triggered a very vivid discussion at the Ruby Users Group Berlin (RUG-B).
The presention gives an introduction to Amazon SimpleDB focusing on how to connect it to Ruby on Rails via the ActiveResource framework and the <a href="http://agilewebdevelopment.com/plugins/aws_sdb_proxy">AWS SDB Proxy Server Plugin</a>.
2. Remember?
AWS Rails Scenario
}
EC2 S3
Web Static
Server Content
Application
Server
memcached,
backgrounDRb,
Code
...
SQL
HOW
TO
GET A
PERSIS
Database DB?
TENT
3. limited
beta
Amazon SimpleDB
• Database web service advertised as
• Simple, Flexible, Scalable, Fast,
Reliable, Inexpensive
• No RDBMS: no SQL, no joins, no schema,
no referential integrity, no transactions
• HTTP-Interface
• Pay per use:
• $0.14 per Machine Hour consumed
• $0.10-0.18 per GB - data transfer
• $1.50 per GB-month storage
4. Amazon SimpleDB
Common Terms
• Domain: SimpleDB
storage container ~ table
• Item: my domain A
attributes
~ table rows accessed by
ID ~ primary key }
items
• Attribute:
(multiple) values
~ table columns; every item
may have a different set of up
to 256 attributes my domain B
• Value: ...
each Attribute may have
multiple Values, always
varchar(1024)[]
5. SimpleDB @
no code
no code
no code
no code
no code
no code
no code
(amazon_sdb)
rich API*
simply working!
*) defect release 0.6.5 when evaluated, but newer release available (not re-tested yet)
6. Amazon SimpleDB API
• Domain level
• CREATE, LIST, DELETE
• Item level
• GET, PUT, DELETE attributes with values
• QUERY* for unordered item IDs by
attribute values within one domain
*) lexicographical =, !=, <, > <=, >=, STARTS-WITH,
AND, OR, NOT, INTERSECTION / UNION
• Beware: Eventual Consistency Approach!
8. Mapping RESTful URLs
HTTP/REST SimpleDB
GET
/domain?query QUERY
GET
/domain/itemID GET ATTRIBUTES
POST
/domain/itemID PUT ATTRIBUTES
PUT
/domain/itemID PUT ATTRIBUTES
(replace)
DELETE
/domain/itemID DELETE ATTRIBUTES
9. Mapping RESTful URLs
Emulating multiple resources in one domain via _resource attribute
HTTP/REST SimpleDB
GET
/domain/resource?query QUERY
GET
/domain/resource/itemID GET ATTRIBUTES
POST
/domain/resource/itemID PUT ATTRIBUTES
PUT
/domain/resource/itemID PUT ATTRIBUTES
(replace)
DELETE
/domain/resource/itemID DELETE ATTRIBUTES
10. A Bridge to Rails
ActiveResource
„Rails XML“
HTTP/REST
?
AWS
SDB Proxy
Server*
„AWS XML“
HTTP/SDB API
SimpleDB
*) http://inside.glnetworks.de/2008/01/20/bridging-rails-to-amazon-simpledb-using-activeresource/
12. AWS SDB Proxy Plugin II
• Create demo ActiveResource model
class Post < ActiveResource::Base
self.site = quot;http://localhost:8888quot;
self.prefix = quot;/ActiveResourceStore/quot;
end
• Testdrive in script/console
>> p = Post.create(:title => 'My first SimpleDB post')
=> #<Post:0x198ceec @prefix_options={}, @attributes={...}>
>> p.body = 'Content is king'
=> quot;Content is kingquot;
>> p.save
=> true
>> Post.find(:first, :params => { :title => 'My first SimpleDB post' })
=> #<Post:0x18efef8 @prefix_options={}, @attributes={...}>
13. Vision: Fully Virtualized
Scalable Stack...
• Building blocks for AWS-only web app
deployment:
• Static assets/content in S3
• As many app servers as needed on EC2
• Structured data persisted in SimpleDB
• All client/server interactions via SQS
Note: XmlHttpRequest cross-site restrictions must be examined
14. Q &A
! Martin Rehfeld
http://inside.glnetworks.de
martin.rehfeld@glnetworks.de