dynamoDBにアクセスするためのユーザーを作成する
dynamoDBにアクセスする際に、awsのシークレットキー等が必要になってきます。これらを取得するために、IAMでDynamoDBにアクセスすることができる権限を持ったユーザーを作成して、シークレットキー等を取得します。
DynamoDBにアクセス権限を持ったグループを作成する
AWSの検索バーからIAMと検索してIAMの作成ページにいきましょう。
グループを作成から適当な名前を入力し、グループを作成します。
ここでこのグループにどんな権限を与えるのかを決めることができます。AWSのサービスのほとんどをいじれるような権限だったり、ごく一部の部分しかいじれない権限だったりですね。今回は、DynamoDBの読み取り書き込みができればいいのでそれに合うようなポリシーを当てたいです。
AmazonDynamoDBFullAccess
が良さそうなので、これを設定します。
それにチェックを入れて、グループを作成しましょう。
ユーザーをそのグループに属させる
さっきの作業でDynamoDBにアクセスすることのできるグループを作ることができました。しかし、まだそのグループを作っただけでそのグループに属しているユーザーはいません。なので、次にやることはこのグループにユーザーを属させることです。
サイドバーのユーザーからユーザーを追加します。
適当なユーザー名を入力して、アクセスの種類を選択します。この種類ですが、AWSマネジメントコンソールの他にプログラムによるアクセスを許可したいので、上にもチェックを入れておきます。他は何もいじらずに次のステップへ。
ここで今作っているユーザーをどのグループに属させるかを決めます。ここはさっき作ったDynamoDBにアクセス権があるグループを選択しましょう。そして、最後にユーザー作成です。これでdynamoDBにアクセス権のあるユーザーが作られたはず。
ユーザーを作成すると、アクセスキー等を確認する画面が出ますが、これが認証情報を確認できる最後の機会です。csvをダウンロードするボタンがあるので、ダウンロードしておくといいでしょう。
DynamoDBのテーブルを作成する
DynamoDBを作成したら、テーブルを作成します。
テーブルの作成からテーブルを作成しましょう。
今回は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のラッパーのようです。
今回はこれを使っていきたいと思います。
$ 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でダウンロードしていれば、そこに記述されているのでその値を入力しましょう。
コードの参考はこちらの記事です。ありがとうございます。
プログラム実行
先ほどのプログラムを実行してDynamoDBに値が保存されるか確かめます。
$ go run ファイル名
実行した後にテーブルの項目を見てみると、値が保存されているのがわかりますね。
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を見てみるといいですね。