DynamoDB local に Goアプリケーションで接続する
まずDynamoDBとDynamoDB Adminをlocal環境に構築をしてDynamoDB local 単体で動作が問題ないことを確認しておく
こちらの記事を参考にして構築進めた
Dockerで、DynamoDB Localを動かしてGo言語で操作する環境を構築する - Qiita
ただし上記記事は2019年のもので、go module機能が無い頃の記事であるためそのままではうまくいかない
色々とハマったのでメモっておく
Go用のDockerfileは以下とした
code:Dockerfile
FROM golang:latest
RUN apt-get install git bash make curl gcc libc-dev openssl
RUN go install golang.org/x/lint/golint@latest
RUN go install github.com/kyoh86/richgo@latest
WORKDIR /go/src/go-docker-dynamodb-sample
COPY . /go/src/go-docker-dynamodb-sample
# Go言語で使う依存モジュールをインストール
ENV GO111MODULE=on
RUN go mod download
Goアプリ用のdocker-compose.yml 記述部分は以下とした 。(DynamoDBとDynamoDB Adminをlocal環境に構築のymlと合体する)
code:docker-compose.yml
version: '3'
services:
go:
container_name: "app"
command: go run main.go
build: .
volumes:
- .:/go/src/go-docker-dynamodb-sample
tty: true
depends_on:
- dynamodb-local
networks:
- network
networks:
network:
driver: bridge
そして main.go を以下で用意した(今回は記事でよく紹介されている guregu/dynamoライブラリを使用した。
code:main.go
package main
import (
"fmt"
"log"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/guregu/dynamo"
)
type Sample struct {
UserID string dynamo:"UserID,hash"
Name string dynamo:"Name"
}
func main() {
fmt.Printf("Hello DynamoDB!")
sess, err := session.NewSession(&aws.Config{
Region: aws.String("ap-northeast-1"),
Endpoint: aws.String("dynamodb-local:8000"),
Credentials: credentials.NewStaticCredentials("dummy", "dummy", "dummy"),
DisableSSL: aws.Bool(true),
LogLevel: aws.LogLevel(0),
})
if err != nil {
log.Println(err)
panic(err)
}
db := dynamo.New(sess)
err = db.Table("Samples").DeleteTable().Run()
if err != nil {
log.Println(err)
panic(err)
}
err = db.CreateTable("Samples", Sample{}).Run()
if err != nil {
log.Println(err)
panic(err)
}
table := db.Table("Samples")
err = table.Put(&Sample{UserID: "1", Name: "Test1"}).Run()
if err != nil {
log.Println(err)
panic(err)
}
var sample Sample
err = table.Get("UserID", "1").One(&sample)
if err != nil {
log.Println(err)
panic(err)
}
fmt.Printf("%+v\n", sample)
}
注意ポイントとして、以下の2つの指定がないと接続できない
Credentials: credentials.NewStaticCredentials("dummy", "dummy", "dummy"),
DisableSSL: aws.Bool(true),
Endpointの指定は、Docker-Compose で Goアプリを動かす場合は以下にしないとDynamoDBに接続できない
Endpoint: aws.String("dynamodb-local:8000"),
最初ここをlocalhost:8000 にしていたために動かずにハマった
準備できたら以下のコマンド順次実行して、結果が出力されたらOK
docker-compose build
docker-compose up -d
docker-compose run go
参考記事
Go で DynamoDB Local を使った時にいろいろハマったのでメモ - bearmini's blog
Compose のネットワーク機能 — Docker-docs-ja 19.03 ドキュメント
Dockerで、DynamoDB Localを動かしてGo言語で操作する環境を構築する - Qiita
#DynamoDB
#Docker_Compose