Using DynamoDB with Go

I've been looking for an excuse to use DynamoDB for awhile and I finally got a chance to this week. Previously I'd played around with it using IRB and the AWS Ruby SDK, but for my current project I'm integrating it into a Go application.

Unfortunately it didn't take long for me to realise that there isn't a mature package. I was able to find two, goamz and go-aws-sdk (created by the Stripe team which was recently adopted by Amazon as the basis for the official SDK)

Initially I thought I'd go with the (now) official SDK but after looking at the code I decided against it (didn't want to get involved with all the crazy Input/Output struct shenanigans), so I went with go-amz...which has almost no documentation for DynamoDB use either.

So I thought I'd share some notes on what I did and how I did it.

Setup the DynamoDB Connection

package main

import (
	"github.com/goamz/goamz/aws"
	"github.com/goamz/goamz/dynamodb"
    "log"
)

func main() {
	// This assumes you have ENV vars: AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
	auth, err := aws.EnvAuth()
	if err != nil {
		log.Panic(err)
	}

	ddbs := dynamodb.Server{auth, aws.USEast} // Initialize DynamoDB Server

	userTableDesc, _ := ddbs.DescribeTable("users") // Create Table Description
	userPK, _ := userTableDesc.BuildPrimaryKey() // Build the Primary Key
	udb := ddbs.NewTable("dev-email", edbPK) // Get the handle for the Table

	...
}

So now that we've got a handle for the Table, we can actually Get and Put data.

Put some data

    type User struct {
    	Name string
        Age int
    }
    
    func main () {
    	...
    	
        // Create user
        u := &User{
        	Name: "Ali Hamidi",
            Age: 31,
        }
    
    	// Convert User Object to DynamoDB Attributes
		ats, err := dynamodb.MarshalAttributes(u)
		if err != nil {
			log.Panic(err)
		}

		// Put Item
		_, err = edb.PutItem("1", "1", ats)
		if err != nil {
			log.Panic(err)
		}
    }

Here we're marshalling a user object into a DynamoDB Attributes object and then calling PutItem.

Resources