GoでDynamoDBを使う

(2017-02-12)

テーブルを作成する

プライマリキー

テーブルの操作のガイドライン - Amazon DynamoDB

プライマリキーとしてパーティションキー(ハッシュキー)とオプションのソートキー(レンジキー)を設定する。 DynamoDBはこのパーティションキーに基づいて、複数のパーティションに分散して保存する。 テーブルにプロビジョニングされたスループット性能はパーティション間で均等に使われるので、 ソートキーを設定する場合にこれを最大限に活用するためには、 あるパーティションにリクエストが集中しないよう、パーティションキーに特定の値ばかり集中しないようなフィールドを 選ぶ必要がある。

セカンダリインデックス

パーティションキーのグローバルセカンダリインデックス(GSI)と ソートキーのローカルセカンダリインデックス(LSI)がある。 射影されるフィールドを選択でき、ここに含まれないフィールドは返さない。 ただし、すべてをインデックスに書き込むのはコストが高いのでなるべく絞る。

キャパシティユニット

  • 1読み込みキャパシティユニット: 4kbを超えないデータを1秒に1~2回(整合性による)読み込める
  • 1書き込みキャパシティユニット: 1kbを超えないデータを1秒に1回書き込める

ユニットに応じて1時間あたりで課金される。

未使用のキャパシティがある場合、最大5分保持してバーストに備えてくれる

読み書きする

aws-sdk-goを直接使ってもいいけど、簡単に扱えるラッパー guregu/dynamo を使うことにした。

type Data struct {
	ID   int64 `dynamo:"id"`
	Name string
	Age  int
}

db := dynamo.New(session.New(), &aws.Config{Region: aws.String("ap-northeast-1")})
table := db.Table("testtable")

Create & Update

d := Data{ID: 1, Name: "hogefuga", Age: 123}
if err := table.Put(d).Run(); err != nil {
    return err
}

if err := table.Update("id", 1).Set("name", "fugafuga").Run(); err != nil {
    return err
}

Get

var data Data
// 結果整合性がある読み込み(1秒に2回/ユニット) .Consistent(true)で強い整合性のある読み込み(1秒に1回/ユニット)にできる
if err := table.Get("id", 1).One(&data); err != nil {
    return err
}
fmt.Println(data)

if err := table.Get("id", 2).One(&data); err != nil {
    return err // dynamo: no item found
}
fmt.Println(data)

参考

AWS Black Belt Tech シリーズ 2015 - Amazon DynamoDB