2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Go moduleを使ってプロジェクトを複数パッケージに分割する

Last updated at Posted at 2021-03-04

初めに

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のパッケージに依存しています。

handler/main.go
package main

import (
    "github.com/masamichhhi/my-project/db"
)

func main() {
    db.PutPerson()
}
go.mod
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を使います。

db/db.go
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("成功!")
    }

}
go.mod
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です。

model/model.go
package model

type Person struct {
    Name string  `dynamo:"name"`
}
model/go.mod
module "github.com/masamichhhi/my-project/model"

go 1.14

これでパッケージを分割できたと思います!

参考

Go moduleのローカルパッケージに多層の依存をもたせられない
↑(僕の質問に答えてくれた方、ありがとうございます🙇‍♂️)

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?