Getting started with Amazon DynamoDB

by

What’s Amazon DynamoDB?

DynamoDB is one of the most recent services offered by Amazon.com. Announced on January 18, 2012, it is a fully managed NoSQL database service that provides fast and predictable performance along with excellent scalability. Let’s quickly analyze its positive and negative aspects in the lists below:

PROS:

  • Scalable
  • Simple
  • Hosted by Amazon
  • Good SDK
  • Free account for small amount of reads/writes
  • Pricing based on throughput

CONS:

  • Poor documentation
  • Limited data types
  • Poor query comparison operators
  • Unable to do complex queries
  • 64KB limit on row size
  • 1MB limit on querying

Setup and simple usage

Below I will provide a step-by-step guide to setup and start using DynamoDB

Requirements

This tutorial uses the following environment:

  • Mac OS 10.7.3
  • Aptana 3.0.8
  • PHP 5.3.8
  • AWS sdk 1.5.3

0) Sign up for an Amazon AWS account

Go to www.aws.amazon.com and signup for a free AWS account. With a free account you can obtain DynamoDB with up to 5 reads / sec and 5 writes / sec.

1) Install AWS sdk for php

Assuming you have pear already installed in your system enter the following commands (for more information on pear, see http://pear.php.net/):

 pear channel-discover pear.amazonwebservices.com pear install aws/sdk 

Now some configuration files need to be modified in order to connect to your DynamoDB:

Go to your AWS management console (www.console.aws.amazon.com), click on your user name (top-right corner) and select “Security credentials”. Here you’ll find your Access Key Id and your Secret Access Key. Insert these credentials in the following file:

 ~/pear/share/pear/AWSSDKforPHP/sample-config.inc.php 

and save the file with the name “config.inc.php

 sudo mv ~/pear/share/pear/AWSSDKforPHP/sample-config.inc.php ~/pear/share/pear/AWSSDKforPHP/config.inc.php 

Once the sdk is installed and configured, you can use its APIs by including it with the following command: 

 require_once 'AWSSDKforPHP/sdk.class.php'; 

 and establish a connection with your DynamoDB with: 

 $dynamodb = new AmazonDynamoDB(); 

2) Install AWS Toolkit for Eclipse/Aptana

With the AWS Toolkit for Eclipse/Aptana, it’s possible to manage your DynamoDB tables without having to login to the AWS management console.

To install it, follow the next steps:

  • Start Eclipse/Aptana
  • Open Help -> Install New Software….
  • Enter http://aws.amazon.com/eclipse in the text box labeled “Work with” at the top of the dialog.
  • Select “AWS Toolkit for Eclipse” from the list below.
  • Click “Next”. Eclipse/Aptana guides you through the remaining installation steps.
  • Restart Eclipse/Aptana;
  • Go to preferences -> AWS Toolkit and insert your account’s credentials*.

3) Start using DynamoDB

Below I provide some instructions to start using DynamoDB through the AWS SDK. Starting from creating a new table, loading data into it and perform a simple query.

3.1) Create Table

To create a table, go to the AWS explorer in Eclipse/Aptana, right click on Amazon DynamoDB and click on “Create Table”. Define the Table name, the key attribute and value and define (if needed) the range key attribute and value. This last parameter represents a secondary key to filter data.

Let’s assume that you want to create a table called “Websites” that has two columns: id (key)(String) and URL (String) 

3.2) Load data

To insert one row in your new table use the following function:

 $dynamodb = new AmazonDynamoDB(); $generatedId = uniqid(); $websiteUrl = ‘http://www.grio.com’; $put_response = $dynamodb->put_item(array( 'TableName' => “Websites”, 'Item' => array( 'id' => array( AmazonDynamoDB::TYPE_STRING => $generatedId ), 'URL' => array( AmazonDynamoDB::TYPE_STRING => $websiteUrl ) ) )); 

3.3) Query data

To query DynamoDB two methods can be used. The first one is called “query” and helps you to find the row identified by the provided key.

 $dynamodb = new AmazonDynamoDB(); $grioId = “4f605c68e8c14” $response = $dynamodb->query(array( 'TableName' => “Websites”, 'HashKeyValue' => array( AmazonDynamoDB::TYPE_STRING => $grioId ), )); 

This will return the URL corresponding to the generated unique id (key) in the table “Webistes”.

The second method for querying DynamoDB is called “scan” and allows you to get the all table and filter it using more than one field.

 $dynamodb = new AmazonDynamoDB(); $scan_response = $dynamodb->scan(array('TableName' => 'ProductCatalog', 'AttributesToGet' => array('Id'), 'ScanFilter' => array('Price' => array( 'ComparisonOperator' => AmazonDynamoDB::CONDITION_LESS_THAN, 'AttributeValueList' => array( array( AmazonDynamoDB::TYPE_NUMBER => '100' )) )) )); 

Suppose you have a table called ProductCatalog that contains the ids and the prices of all the products.

The response of the above request will contain all the ids of Products with a Price lower than 100$.

“Scan” allows you to perform “more complex” queries but “query” guarantees better performances.

3.4) Parse response

The results of the above queries will be an Object of the type ECFResponse whose most important part is the body (that is a CFSimpleXML Object). To access the number of rows returned by the query it’s sufficient to look at the Count attribute:

 $response->body->Count; 

To get a specific field (e.g. URL) of the nth element of the response it’s necessary to access the Items attribute in the following way:

 (string) $response->body->Items[n]->URL->S; 

Where the cast ( “(string)” ) and the last letter “S”, depend on the type of the field ( in this case URL it’s an AmazonDynamoDB::TYPE_STRING as specified in 3.2).

Now you have all you need to start using DynamoDB for your application.

Summarizing, Amazon DynamoDB is a useful service if you need a simple, plug-and-play, scalable db. It becomes less handy if scalability is not your first concern or if your application needs to perform very complex queries. This said, we’re still talking of a very new product, which is going to improve over time.

To learn more about DynamoDB’s characteristics and APIs, go to its official website http://aws.amazon.com/dynamodb/ and reading its documentation at http://docs.amazonwebservices.com/amazondynamodb/

Alberto Montagnese

12 Comments

  1. Pingback: Forecast Cloudy – Working with AWS DynamoDB in .NET | A posteriori

  2. Gary Kraft on said:

    Check out s3nosql.com for a case study on overcoming DynamoDB limitations definitively

  3. Binh Thanh Nguyen on said:

    Nice Post.

  4. Aaron on said:

    Helpful.

    Where is best to host my PHP server?

  5. Brandon on said:

    Great tutorial guys! Have you done anything more with Dynamo? Any hands on experience with the SDK2 version? You’d think it impossible, but the documentation for SDK2 seems substantially /worse/ than version 1! None of the info you’ve written here can be found anywhere in their docs for version 2 — would love to see a followup post in the future comparing this article to how you’d accomplish the same tasks in v2.

  6. Craig Winstanley on said:

    Thanks for the info, straight to the point which i wanted.
    I think the DynamoDB is more for a storage database rather than a complex database. For the Relational properties you’d want to use the RDS service they offer. DynamoDB is the NoSQL style database which isnt really good for complex queries, it cant join etc things like that but is really fast on simple things and lets you chuck any sort of data at it to be stored

  7. Chris on said:

    I completely agree with “poor documentation”

  8. Xander on said:

    Thanks for the scan and query() example !!

  9. Alberto Montagnese on said:

    Yes, we’re currently using it for a project that involves storing a lot of key-value (i.e. id-counter) pairs.
    For the most part the queries are in the form:
    SELECT ‘counter’
    FROM ‘id_counter_table’
    WHERE ‘id’ = ‘xxxx’
    and we’re expecting to store a large amount of ids, that’s why we decided to use DynamoDB.

  10. Jeremeamia on said:

    Nice tutorial! Very easy to follow. Have you used DynamoDB for any of your projects?

Leave a Reply to Aaron Cancel reply

Your email address will not be published. Required fields are marked