読者です 読者をやめる 読者になる 読者になる

Go で DynamoDB Local を使った時にいろいろハマったのでメモ

AWS 公式の Go 言語用 SDK がありますが、Developer Preview ということもあってかドキュメントがちょっと不足しているように思います。

github.com


私は Go のプログラムから DynamoDB を使いたかったのですが、検索するときのキーの指定の仕方とかがだいぶ特殊な感じだったので最初は苦労しましたが、とはいえ、AWS のマネージドサービスとしての DynamoDB を使う分には検索したりすれば多少情報が出てきますのでなんとかなります。

しかし DynamoDB Local を使うとなるとまったく情報がなく、だいぶつまづきました。

以下、いくつかハマったところと解決方法をメモしておきます。

1. 接続先として Endpoint を指定する必要がある

var ac aws.Config
ac.Endpoint = aws.String("hostname:port") 

という感じで DynamoDB Local が動いているアドレスを指定します。
これを指定しないと AWS の DynamoDB に接続しに行ってしまいます。

2. Region を指定する必要がある

これはたしか指定しないとエラーが起きていたはずなので、エラーメッセージにしたがって Region を指定しましょう。

DynamoDB Local ではリージョンとか関係ないはずなのですが、なんでも良いので指定する必要があります。

ac.Region = aws.String("ap-northeast-1")

という感じです。

3. SSL を Disable する必要がある

これはよくよく考えたら当然なのですが、DynamoDB Local には証明書とかを入れてないので SSL なしで接続します。

ac.DisableSSL = aws.Bool(true)

を設定します。


ここまできて、ようやく DynamoDB Local に接続できるようになったはずですが、もう一つ注意点があります。

4. 正しい Credentials を指定する必要がある

私の場合は、DynamoDB Local を Docker コンテナ上で実行しており、その DynamoDB Local に aws コマンドを使ってテスト用のデータを populate する際に、ダミーでもよいので AWS の Credentials 情報(~/.aws/credentials)が存在していないといけなかったので

[default]
aws_access_key_id = dummy
aws_secret_access_key = dummy

という内容のファイルを作成していました。

そしてその populate したデータを Go のプログラムから参照しようとすると、これと同じ内容を aws.Config.Credentials に設定しておかないといけませんでした。
(さもなければ、作ったはずのテーブルが存在しないというエラーになったりします)

ac.Credentials = credentials.NewStaticCredentials("dummy", "dummy", "dummy")

(第3引数の token は指定しなくても良さそうでしたが入れてみました)

これは DynamoDB Local には接続できているのにデータが見えないという挙動になるので、すごく悩みました。

なお、AWS 上の DynamoDB に接続するときは EC2 Instance Role を使ったので Credentials を指定する必要がありませんでした。


Amazon Web Services クラウドデザインパターン設計ガイド 改訂版

Amazon Web Services クラウドデザインパターン設計ガイド 改訂版