サーバーレスWebAPI開発に入門できました

前回の記事の続きです。 go-swaggerを使うのをやめて、Ginというフレームワークを使う事で無事入門できました。

前回の記事の続きです。
go-swagger を使うのをやめて、Gin というフレームワークを使う事で無事入門できました。

Gin フレームワークの使い方はこちらの記事を参考にさせて頂きました。

[Golang/Go言語]GinフレームワークでAPI開発2~CRUDの実装~ | セルフノート

Go言語とGinフレームワークでAPI開発手法を学びましょう。今回は、GRUDの実装方法を学びます。CRUDとはCreate, Read, Update, Deleteの略でAPI開発の基本となるものなので、実装方法を知ることは今後のキャリア形成においても大変重要になります。

ソースコードを公開してます。参考になれば幸いです。

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.godb.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 リクエストを投げていきます。

ユーザーの登録

{
  "user_id": "001",
  "name": "gopher"
}

Response に200 OKと表示されたら成功です。

ユーザーの一覧

[
  {
    "user_id": "001",
    "name": "gopher"
  }
]

さきほど登録したユーザーが取得できましたね。
別のユーザーをもう一つ登録してみて、GET メソッドで取得できるユーザーが増える事を確認してみてください。

ユーザーの更新

{
  "name": "gopher2"
}

GET メソッドでユーザーの一覧を取得すると、nameが変わっている事が確認できます。

ユーザーの削除

{
  "message": "user has been deleted"
}

GET メソッドでユーザーの一覧を取得すると削除された事が確認できます。

参考

Built with Hugo
テーマ StackJimmy によって設計されています。