DynamoDBにGOで読み取り・書き込みを行う

dynamoDBにアクセスするためのユーザーを作成する

dynamoDBにアクセスする際に、awsのシークレットキー等が必要になってきます。これらを取得するために、IAMでDynamoDBにアクセスすることができる権限を持ったユーザーを作成して、シークレットキー等を取得します。

DynamoDBにアクセス権限を持ったグループを作成する

f:id:utr066:20180728150943p:plain

AWSの検索バーからIAMと検索してIAMの作成ページにいきましょう。

f:id:utr066:20180728150939p:plain

f:id:utr066:20180728150934p:plain

グループを作成から適当な名前を入力し、グループを作成します。

f:id:utr066:20180728151637p:plain

ここでこのグループにどんな権限を与えるのかを決めることができます。AWSのサービスのほとんどをいじれるような権限だったり、ごく一部の部分しかいじれない権限だったりですね。今回は、DynamoDBの読み取り書き込みができればいいのでそれに合うようなポリシーを当てたいです。

  • AmazonDynamoDBReadOnlyAccess – AWS マネジメントコンソール を使用して DynamoDB リソースへ読み取り専用アクセスを付与します。
  • AmazonDynamoDBFullAccess – AWS マネジメントコンソール を使用して DynamoDB リソースへのフルアクセスを付与します。
  • AmazonDynamoDBFullAccesswithDataPipeline – AWS マネジメントコンソール を使用して、AWS Data Pipeline によるエクスポートおよびインポートを含む、DynamoDB リソースへのフルアクセスを付与します。

AmazonDynamoDBFullAccessが良さそうなので、これを設定します。

それにチェックを入れて、グループを作成しましょう。

ユーザーをそのグループに属させる

さっきの作業でDynamoDBにアクセスすることのできるグループを作ることができました。しかし、まだそのグループを作っただけでそのグループに属しているユーザーはいません。なので、次にやることはこのグループにユーザーを属させることです。

f:id:utr066:20180728152207p:plain

サイドバーのユーザーからユーザーを追加します。

f:id:utr066:20180728152200p:plain

適当なユーザー名を入力して、アクセスの種類を選択します。この種類ですが、AWSマネジメントコンソールの他にプログラムによるアクセスを許可したいので、上にもチェックを入れておきます。他は何もいじらずに次のステップへ。

f:id:utr066:20180728153321p:plain

ここで今作っているユーザーをどのグループに属させるかを決めます。ここはさっき作ったDynamoDBにアクセス権があるグループを選択しましょう。そして、最後にユーザー作成です。これでdynamoDBにアクセス権のあるユーザーが作られたはず。

ユーザーを作成すると、アクセスキー等を確認する画面が出ますが、これが認証情報を確認できる最後の機会です。csvをダウンロードするボタンがあるので、ダウンロードしておくといいでしょう。

DynamoDBのテーブルを作成する

DynamoDBを作成したら、テーブルを作成します。

f:id:utr066:20180728155401p:plain

テーブルの作成からテーブルを作成しましょう。

f:id:utr066:20180728155405p:plain

今回はUserをテーブルに保存しようと思うので、テーブル名はUser、primaryKeyはuser_idとします。

goでDynamoDBにアクセスする

次にGoで書いたプログラムを使ってさっき作ったDynamoDBのUsersテーブルにユーザーを書き込んでいきます。

guregu/dynamoを使う

aws-sdk-goを使ってDynamoDBにアクセスすることも可能ですが、結構面倒なようですね。

AWSの公式がライブラリー。最近やっと1.0になりました!aws-sdk-goでは、DynamoDBへの問い合わせはできるが、かなり面倒臭いことをやらなきゃいけない。公式のライブラリーはポインターだらけで、データのMarshalとUnmarshalで苦労することがあります。

ポインターだらけ、MarshalとUnmarshalで苦労したくないので、以下のライブラリを使おうと思います。これはaws-sdk-goのラッパーのようです。

github.com

今回はこれを使っていきたいと思います。

$ go get github.com/aws/aws-sdk-go
$ go get github.com/guregu/dynamo

Goのコードを書く

package main

import (
  "fmt"
  "time"
  "github.com/aws/aws-sdk-go/aws"
  "github.com/aws/aws-sdk-go/aws/session"
  "github.com/aws/aws-sdk-go/aws/credentials"
  "github.com/guregu/dynamo"
)

type User struct {
  UserId int `dynamo:"user_id"`
  CreatedTime time.Time `dynamo:"created_time"`
}


func main(){
  cred := credentials.NewStaticCredentials("アクセスキー", "シークレットキー", "") // 最後の引数は[セッショントークン]

  db := dynamo.New(session.New(), &aws.Config{
      Credentials: cred,
      Region: aws.String("ap-northeast-1"), // "ap-northeast-1"等
  })

  table := db.Table("User")

  u := User{UserId: 100, CreatedTime: time.Now().UTC()}
  fmt.Println(u)

  if err := table.Put(u).Run(); err != nil {
    fmt.Println("err")
    panic(err.Error())
  }
}

Putを実行することでDBに書き込むことができるようですね。 "アクセスキー", "シークレットキー"の部分は、最初の方にIAMで作ったユーザー情報ですね。csvでダウンロードしていれば、そこに記述されているのでその値を入力しましょう。

コードの参考はこちらの記事です。ありがとうございます。

Go言語でDynamoDB接続を試みたときの備忘録

プログラム実行

先ほどのプログラムを実行してDynamoDBに値が保存されるか確かめます。

$ go run ファイル名

f:id:utr066:20180728160054p:plain

実行した後にテーブルの項目を見てみると、値が保存されているのがわかりますね。

DynamoDBからデータを読み取る

func main(){
  cred := credentials.NewStaticCredentials("アクセスキー", "シークレットキー", "") // 最後の引数は[セッショントークン]

  db := dynamo.New(session.New(), &aws.Config{
      Credentials: cred,
      Region: aws.String("ap-northeast-1"), // "ap-northeast-1"等
  })

  table := db.Table("User")

  var users []User
  err := table.Scan().All(&users)
  if err != nil {
    fmt.Println("err")
    panic(err.Error())
  }

  fmt.Println(users)

  for i, _ := range users {
    fmt.Println(users[i])
  }
}

フィルを実行してみるとfmt,Printlnでちゃんと値が取れているのが確認できるのではないでしょうか。 読み取りや書き込みだったりのメソッドはGitHub - guregu/dynamo: expressive DynamoDB library for Goを見てみるといいですね。