Go+Gin+DynamoDBでWeb APIサーバを作る

仕事でGoを使うこととなりましたので、年明けから勉強しておりました。
一つの区切りとしてナンチャッテToDo Web APIサーバを作りましたので、GitHubで公開しておきます。

github.com

参考文献

Goは↓の本を読んでました。
他の言語と比較しながらGoの考え方やクセを細かく説明してくれるので、CやJavaの経験者であれば効率的に吸収できるかと思います。
Amazon CAPTCHA

GinはREADME、DynamoDBはAWSのドキュメントとQiita投稿で使い方を学びました。

github.com

dynamodb - Amazon Web Services - Go SDK

あえて aws-sdk-go で dynamoDB を使うときの基本操作 - Qiita

開発環境

Visual Studio Code(Windows)で構築しました。
↓の記事でコーディングからデバッグまでの一式できるようになるかと思います。
WindowsのVisual Studio CodeでGo言語の開発環境を作る - 素敵なおひげですね

構成

ユーザ登録、ログイン/ログアウト、ToDoの投稿と取得ができる簡単なWeb APIです。
Web APIフレームワークとしてGin、DBはDynamoDBを使っています。

Gin

Ginは高速さを売りとしているGoのWeb APIフレームワークです。
↓をビルド・実行するだけで、さくっとWeb APIサーバになります。

package main

import "gopkg.in/gin-gonic/gin.v1"

func main() {
    r := gin.Default()
    r.GET("/hello", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "Hello, World!",
        })
    })
    r.Run()
}

Goはnet/httpというHTTPサーバを標準搭載していますが、GinはAPIに特化していますのでそこは作りやすいようになっています。

  • 例えば、net/httpだと、リクエストbodyを文字列として読み込んでからデシリアライズ(アンマーシャル)する必要がありますが、
  • Ginでは、c.BindJSON(&request)だけでrequestへ値が詰められます。

DynamoDB

このAPIでは2つのDynamoDBテーブルにアクセスします。
テーブル名(とリージョン)はconfig.jsonで変更できます。

テーブル名 パーティションキー ソートキー
todo-user-table Id -
todo-todo-table Id UserId

GoからのDynamoDBのアクセスには素のaws-sdk-goを使っています。 なかなかツライです。

  • ソースコードを見ていただければわかるかと思いますが、DynamoDBへのCRUDでかなりの行数となっている上、ポインタとおまじないチックな手順が入り乱れています。
    • ExpressionAttributeNamesで項目名のプレースホルダ、ExpressionAttributeValuesで値のプレースホルダを指定したり、
    • map[string]*dynamodb.AttributeValue{ ":value": { S: aws.String(value),},},とかしんどいです。
  • 何らかのライブラリでラッピングしたくなる。

宿題

  • デプロイ
    • ローカルでサーバを実行し、DynamoDBのみAWSへアクセスしていました。
    • AWS ElasticBeanstalkにコマンドからデプロイできるようしたいところです。
  • テスト
    • 標準で揃っていますが、まだ手を出せてないです。

↓の本を読んで勉強します。
みんなのGo言語【現場で使える実践テクニック】 | 松木雅幸, mattn, 藤原俊一郎, 中島大一, 牧 大輔, 鈴木健太, 稲葉貴洋 |本 | 通販 | Amazon