初めに
golangやlambdaに入門したくて、GoとSAMで学ぶAWS Lambdaを読み進めてみました。
しかし、本書ではパッケージの依存管理にdepを使っていて、最近主流になってきたGo moduleを使っていなかったので、これを使ってlambdaのプロジェクトを複数パッケージに分割してみようと思います。
ディレクトリ構成
aws samで出来るlambdaを考えます。(samについての解説は省略します)
dynamoDBにName
をフィールドにもつPerson
を保存してみます。
以下のようにhandler
(lambdaのエントリーポイントになるところ)、db
(DBに接続するところ)、model
(DBから取り出したデータをパースする構造体の置き場)の3つに分けてみました。
ディレクトリ構成はテキトーなのでご了承ください(笑)
.
├── template.yaml
├── db
│ ├── db.go
│ └── go.mod
├── go.mod
├── handler
│ └── main.go
└── model
├── go.mod
└── model.go
実装
まずはhandler/main.go
とルート直下のgo.mod
です
ここはdbのパッケージに依存しています。
package main
import (
"github.com/masamichhhi/my-project/db"
)
func main() {
db.PutPerson()
}
module github.com/masamichhhi/my-project
go 1.14
require github.com/masamichhhi/my-project/db v0.0.0-00010101000000-000000000000
replace (
github.com/masamichhhi/my-project/db => ./db
github.com/masamichhhi/my-project/model => ./model
)
このreplace
を書くことで、相対パスで指定したディレクトリを好きな名前でインポートできます。
次に、db
です
ここでdynamoDBに接続する処理を書きます。
公式のSDKよりも簡単にdynamoDBを使えるguregu/dynamo
を使います。
package db
import (
"os"
"fmt"
"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"
"github.com/masamichhhi/my-project/model"
)
var (
Region = os.Getenv("REGION")
)
func PutPerson() {
creds := credentials.NewStaticCredentials(os.Getenv("AWS_ACCEESS_KEY"), os.Getenv("AWS_SECRET_ACCEESS_KEY"), "")
sess, _ := session.NewSession(&aws.Config{
Credentials: creds,
Region: aws.String(Region)},
)
newPerson := model.Person{Name: "Gopher"}
db := dynamo.New(sess)
table := db.Table("person-table")
err := table.Put(newPerson).Run()
if err != nil {
fmt.Println("エラー発生")
}else{
fmt.Println("成功!")
}
}
module github.com/masamichhhi/my-project
go 1.14
require (
github.com/github.com/masamichhhi/my-project/model v0.0.0-00010101000000-000000000000
)
replace github.com/masamichhhi/my-project/model => ../model
最後にmodel
です。
package model
type Person struct {
Name string `dynamo:"name"`
}
module "github.com/masamichhhi/my-project/model"
go 1.14
これでパッケージを分割できたと思います!
参考
Go moduleのローカルパッケージに多層の依存をもたせられない
↑(僕の質問に答えてくれた方、ありがとうございます🙇♂️)