目次
Echo + GORM(v2)をAWS EC2上に構築に構築
Clean Architectureを採用する前に、とてもシンプルなサンプルソースになります。
AWS EC2にインスタンスを作成、goのインストールをします。
GORMですが、日本語情報のほとんどが旧バージョンv1を元にしたものが多いのでご注意ください。
- go version go1.15.6
- Echo v4.1.17
- GORM v2
なお、AWS EC2 (Amazon Linux 2)へのGoのインストールは、前の記事をご確認ください。
AWS EC2にMySQLをインストール、事前にデータベースを作成しておきます。
ここではAWS EC2へのMySQLインストール方法の説明は省きます。
作成するDB名「db_name」は適宜変更してください。
mysql> CREATE DATABASE db_name
ディレクトリ構造
ディレクトリ構造は下記になります。
sampleディレクトリは/home/ec2-user/go/src 直下に作成しました。
└── src
└── sample
├── controller
│ └─ user_controller.go
├── go.mod
├── go.sum
├── main.go
├── model
│ ├── db.go
│ └── user.go
├── router
│ └── router.go
controller/user_controller.go
コントローラーを作成します。CRUDそれぞれの関数を作成します。
package controller
import (
"net/http"
"strconv"
"sample/model"
"github.com/labstack/echo/v4"
)
func GetUser(c echo.Context) error {
i, _ := strconv.Atoi(c.Param("id"))
id := uint(i)
user := model.User{}
user.FirstById(id)
return c.JSON(http.StatusOK, user)
}
func CreateUser(c echo.Context) error {
name := c.FormValue("name")
a, _ := strconv.Atoi(c.FormValue("age"))
age := uint(a)
user := model.User{
Name: name,
Age: age,
}
user.Create()
return c.JSON(http.StatusOK, user)
}
func UpdateUser(c echo.Context) error {
i, _ := strconv.Atoi(c.Param("id"))
id := uint(i)
name := c.FormValue("name")
a, _ := strconv.Atoi(c.FormValue("age"))
age := uint(a)
user := model.User{
ID: id,
Name: name,
Age: age,
}
user.Updates()
return c.JSON(http.StatusOK, user)
}
func DeleteUser(c echo.Context) error {
i, _ := strconv.Atoi(c.Param("id"))
id := uint(i)
user := model.User{}
user.DeleteById(id)
return c.JSON(http.StatusOK, user)
}
model/db.go
import部分のGORMの読み込みや、DB接続部分の記述はv2用です。
v1と互換性が無いのでご注意ください。
DB接続部分のroot:passwordはDBユーザー名とパスワードに適宜変更。
/db_name?の部分も作成したDB名に適宜変更してください。
package model
import (
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var DB *gorm.DB
var err error
func init() {
dsn := "root:password@tcp(127.0.0.1:3306)/db_name?charset=utf8mb4&parseTime=True&loc=Local"
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalln(dsn + "database can't connect")
}
DB.AutoMigrate(&User{})
}
model/user.go
作成したDBの構造に合わせてモデルの作成をします。
ユーザー名「Name」と年齢「Age」を持ちます。
package model
import (
"time"
"gorm.io/gorm"
)
type User struct {
ID uint `json:"id"`
Name string `json:"name" gorm:"type:varchar(255);not null"`
Age uint `json:"age" gorm:"not null;default:0"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
func (p *User) FirstById(id uint) (tx *gorm.DB) {
return DB.Where("id = ?", id).First(&p)
}
func (p *User) Create() (tx *gorm.DB) {
return DB.Create(&p)
}
func (p *User) Save() (tx *gorm.DB) {
return DB.Save(&p)
}
func (p *User) Updates() (tx *gorm.DB) {
return DB.Model(&p).Updates(p)
}
func (p *User) Delete() (tx *gorm.DB) {
return DB.Delete(&p)
}
func (p *User) DeleteById(id uint) (tx *gorm.DB) {
return DB.Where("id = ?", id).Delete(&p)
}
router/router.go
接続するポート番号「8080」は適宜変更してください。
AWSのセキュリティーグループで、ポートの解放をしておいてください。
package router
import (
"net/http"
"sample/controller"
"github.com/labstack/echo/v4"
)
func Init() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, World!")
})
e.GET("/user/:id", controller.GetUser)
e.POST("/user", controller.CreateUser)
e.PUT("/user/:id", controller.UpdateUser)
e.DELETE("/user/:id", controller.DeleteUser)
e.Logger.Fatal(e.Start(":8080"))
}
main.go
routeの初期化を呼び出します。
package main
import (
"sample/router"
)
func main() {
router.Init()
}
Goを実行
下記のコマンドでGoを実行します。
$ cd /home/ec2-user/go/src/sample
$ go mod init
$ go run main.go
____ __
/ __/___/ / ___
/ _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.1.17
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
O\
Curlで動作テスト
データベースへの登録を、Curlコマンドで実行して動作確認します。
ここでは説明を省きますが、Postmanなどのツールで動作確認も可能です。
AWS EC2のパス「http://ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8080」は適宜変更をお願いします。
Create
$ curl -X POST http://ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8080/user -d "name=Yamada&age=20"
Update
$ curl -X PUT http://ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8080/user/1 -d "name=Suzuki&age=24"
Read
$ curl -X GET http://ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8080/user/1
Delete
$ curl -X DELETE http://ec2-xx-xx-xxx-xxx.ap-northeast-1.compute.amazonaws.com:8080/user/1
MySQLに接続して、DBに正常に作成・更新・削除ができるがご確認ください。
これでサンプルソースの説明は以上になります。
次回の記事は、テンプレート機能を使ってブラウザにフォームを表示させます。