際際滷

際際滷Share a Scribd company logo
はじめての Go 冱Z のプロジェクトを
AWS Lambda + API Gateway
でやったので パッケ`ジ撹 を氷すよ
Go(Un)ConferenceGoあんこLT寄氏 5kg
@okashoi
弥 屎峠┐かだ しょうへい@okashoi
? 幄塀氏芙ウィルゲ`ト
? Gopher にもなりたい PHPer
? 2019 定は室g鵡Pにチャレンジ
2
徭失B初
? 撹 Go + AWS Lambda + Amazon API Gateway + DynamoDB
? 匯何に web クロ`リングI尖を根む芙坪システム
? 弌ト8 エンドポイント殻業
? 芙坪兜のフル Go 冱Zプロジェクト
? Go 冱Z隆UY宀も謹い
3
プロジェクト古勣
? 汐〆みんなのGo冱Z〇の坪否をった
? レイヤ`ドア`キテクチャを駻
? Semantic Import Versioning
4
畠悶
? 汐〆みんなのGo冱Z〇の坪否をった
? レイヤ`ドア`キテクチャを駻
? Semantic Import Versioning
5
畠悶
卆
贋
の
圭
? 汐〆みんなのGo冱Z〇の坪否をった
? レイヤ`ドア`キテクチャを駻
? Semantic Import Versioning
6
畠悶
? import path にメジャ`バ`ジョンを根める
? ほぼ_gに v2 が恬られることはないが
メンバ`に仝容Xされているやりかた々
を岑ってもらう朕議
? controller, usecase, presenter
? presenter は interface を協xして
メディアタイプごとにg廾 (json, xml, text)
7
application
鮫餝灸Clean Coder Blog
https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
? 麿のパッケ`ジに卆贋しない
? import するのは淵僖奪羽`ジに浙
? デ`タ荷恬にvする interface を協x
? クロ`リングのための HTTP リクエストを
CQRS における Query とみなした
? 書房えば ~Repository じゃなくて
~Command という圭が蛍かりやすかった
8
domain
? domain で協xした interface をg廾
? DynamoDB への Read/Write
? HTTP クライアント + HTML パ`サ
? gHのクロ`リング鵐擧`ジの HTML を
testdata 和にO崔してパ`サのテストをいた
9
infrastructure
? request/response を鏡徭のものにQしてから
application.controller に局す
? ル`ティング
? DI
10
main.go
? request/response を鏡徭のものにQしてから゛
? パッケ`ジを AWS のものに卆贋させないため
11
main.go
func newRequest(awsRequest events.APIGatewayProxyRequest) application.Request {
return application.Request{
Path: awsRequest.Path,
HTTPMethod: awsRequest.HTTPMethod,
Headers: awsRequest.Headers,
QueryStringParameters: awsRequest.QueryStringParameters,
PathParameters: awsRequest.PathParameters,
}
}
func convertToAwsResponse(res application.Response) events.APIGatewayProxyResponse {
return events.APIGatewayProxyResponse{
StatusCode: res.StatusCode,
Headers: res.Headers,
Body: res.Body,
}
}
? ル`ティング
? 嘲岷に猟忖双曳^の switch case
? これで割蛍な喘余だったため
12
main.go
switch {
case req.HTTPMethod == "GET" && req.Path == "/v1/hoge":
res = hogeController.Hoge(req)
case req.HTTPMethod == "GET" && req.Path == "/v1/fuga":
res = fugaController.Fuga(req)
// ...待
}
? DI
? ★
? シンプルで Go らしくて殆海世繁爾辰
┳伉宀K湖
13
main.go
https://speakerdeck.com/morikuni/golang-dot-tokyo-number-11
いまのところこんな湖じで寄きく篤`はしていない
? これ參貧寄きくなるとやや徭佚ない┐發Δ舛腓辰伴蛍晒したい
Go 隆UY宀がいるプロジェクトでもタスクが尅りやすかった
? まずは repository の 1 メソッドからやってもらう
? 母してきたら usecase 參和をまるごと販せる
? 侏 + ビルドが宥っている並g + テストコ`ド = レビュ`するのもS
14
やってみて侭湖
JSONHTTP レスポンス○★ DynamoDB のマッピング圭隈む
? 夛悶協xにタグをつければQできるのは宴旋
? domain に協xしたエンティティにタグをつけるとよさそうだが
HTTP や DB にvする岑Rが domain に息れ竃すことになる
? 恷K議にはエンティティにつけることにしたが...
? そういうことは深えずにシンプルにやろうというのが Go の房襪辰櫃ぃ
エラ`ハンドリングどうしようかむ
? 鏡徭エラ`を協xしてログなどに圀しい秤鵑魍薦するなどした
? 和了で伏撹したエラ`を貧了に局していくのがややj
15
やってみて侭湖

More Related Content

はじめての Go 冱Zのプロジェクトを AWS Lambda + API Gateway でやったのでパッケ`ジ撹を氷すよ