前回の記事の続きです。
go-swagger を使うのをやめて、Gin というフレームワークを使う事で無事入門できました。
Gin フレームワークの使い方はこちらの記事を参考にさせて頂きました。

[Golang/Go言語]GinフレームワークでAPI開発2~CRUDの実装~ | セルフノート
ソースコードを公開してます。参考になれば幸いです。
GitHub - nns7/serverless-api-go-tutorial
開発環境
- Windows 10 Home(20H2)
- WSL2
- Docker Desktop
- Visual Studio Code
- Remote - Containers 拡張
DynamoDB Local をローカルにデプロイする
前回の記事ではローカルでの DynamoDB のテストに LocalStack を使っていましたが、調べたところ AWS が DynamoDB Local というものを用意してくれているので、そちらを使うようにします。 コンピュータ上で DynamoDB をローカルでデプロイする - Amazon DynamoDB
公式に docker-compose が解説されているため、そちらを参考に以下のように記述しました。
エンドポイントをhttp://dynamodb-local:8000
とすればアクセスできます。
docker-compose.yml
version: "3"
services:
aws-sdk-go-containter:
build:
context: .
dockerfile: ./build/Dockerfile
container_name: aws-sdk-go-containter
depends_on:
- dynamodb-local
volumes:
- "~/.aws:/root/.aws"
# DynamoDB Local
dynamodb-local:
command: "-jar DynamoDBLocal.jar -sharedDb -optimizeDbBeforeStartup -dbPath ./data"
image: "amazon/dynamodb-local:latest"
container_name: dynamodb-local
ports:
- "8000:8000"
volumes:
- "./docker/dynamodb:/home/dynamodblocal/data"
working_dir: /home/dynamodblocal
API サーバーをローカルに立てる
公開しているソースコードは Lambda にデプロイするためのものですが、main.go
とdb.go
を以下のように書き換えることで、API サーバーとしてローカルで実行できるようになります。
main.go
package main
import (
"github.com/nns7/userapp"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
// ユーザー作成
router.POST("/users", userapp.PostUsers)
// ユーザー一覧の取得
router.GET("/users", userapp.GetUsers)
// ユーザーの更新
router.PUT("/users/:user_id", userapp.PutUser)
// ユーザーの削除
router.DELETE("/users/:user_id", userapp.DeleteUser)
// ユーザーの検索
router.GET("/users/search", userapp.SearchUser)
router.Run()
}
db.go
(省略)
func init() {
usersTable = "local_users"
if usersTable == "" {
log.Fatal("missing env variable: DYNAMO_TABLE_USERS")
}
dbEndpoint := "http://dynamodb-local:8000"
sess := session.Must(session.NewSessionWithOptions(session.Options{
Profile: "local",
SharedConfigState: session.SharedConfigEnable,
Config: aws.Config{
Endpoint: aws.String(dbEndpoint),
DisableSSL: aws.Bool(true),
},
}))
gdb = dynamo.New(sess)
}
書き換えたら Terminal 上で以下のコマンドを実行してください。DynamoDB Local にはテーブルが存在しないため、合わせてテーブルを作成します。
$ aws dynamodb create-table --table-name 'local_users' --endpoint-url "http://dynamodb-local:8000" \
--attribute-definitions '[{"AttributeName":"user_id","AttributeType": "S"}]' \
--key-schema '[{"AttributeName":"user_id","KeyType": "HASH"}]' \
--provisioned-throughput '{"ReadCapacityUnits": 5,"WriteCapacityUnits": 5}'
$ go run cmd/lambda/main.go
API サーバーにリクエストを投げてみる
Chrome 拡張の『Talend』を使って HTTP リクエストを投げていきます。
ユーザーの登録
- URL:http://localhost:8080/users
- METHOD:POST
- BODY:↓
{
"user_id": "001",
"name": "gopher"
}
Response に200 OK
と表示されたら成功です。
ユーザーの一覧
- URL:http://localhost:8080/users
- METHOD:GET
- Response↓
[
{
"user_id": "001",
"name": "gopher"
}
]
さきほど登録したユーザーが取得できましたね。
別のユーザーをもう一つ登録してみて、GET メソッドで取得できるユーザーが増える事を確認してみてください。
ユーザーの更新
- URL:http://localhost:8080/users/001
- METHOD:PUT
- BODY:↓
{
"name": "gopher2"
}
GET メソッドでユーザーの一覧を取得すると、name
が変わっている事が確認できます。
ユーザーの削除
- URL:http://localhost:8080/001
- METHOD:DELETE
- Response↓
{
"message": "user has been deleted"
}
GET メソッドでユーザーの一覧を取得すると削除された事が確認できます。