こんにちは。みなさんはGoogle App Engine(GAE)使っていますか?
フルマネージドでオートスケールでお気に入りのプロダクトなのですが、やや情報が少ないような・・・
実戦投入しようと思うと、環境変数の設定や、サービス間認証、はたまたcloud_build.yamlどう書くんだ、など結構詰まるポイントが多いかと思います。
そこで、基本的な部分を実装したGAE+goのAPI実装のサンプルを公開します! これからGAE+Goを始める方のご参考になればと。
サンプル
- GAEスタンダード環境です
- GAEのruntimeはgo116です
- ユーザオブジェクトを登録/取得するだけの簡単なAPIのサンプルです
- Firebaseを使うので、Firebaseのセットアップと、GAEサービスアカウントへの「Firebase管理者」ロールの付与が必要です
ポイントの紹介
工夫しているポイントをいくつかご紹介します。
環境変数が使えるようにしてあります
調べても意外とサンプルが出てこないように思います。envconfigを使い、ビルド時にapp_{ENV}.yamlから埋め込みます。
クリーンアーキテクチャを意識したレイヤリング
全体の構成は↓こんな感じです。
- /src
- /handler
- /input
- request bodyをマッピングする構造体
- /output
- response bodyをマッピングする構造体
- router.go
- APIのルーティング
- /domain
- /model
- ドメインモデル
- /repository
- infra層(DBやFirestoreなど)のinterface
- /usecase
- ビジネスロジックの実装
- /infra
- repositoryの実装
- /registry
- repositoryの実装を返す
- /lib
- logging、HTTPリクエストなど共通基盤
- /main
- app_{ENV}.yaml(ビルド時にenvconfigで出し分けます)
- main.go
テスト時にRepository層をモックできるようにDIを実装してあります。
こちらの記事がとても参考になります。
ロギングの強化
GAEは1st-Genのロギングが素敵すぎるのですが、これはもう諦めるしかないですね。。。
こちらの記事を参考に、できるだけGAE-1st-Genに近い使い心地のログを出せるようにしています。
Identity Aware Proxy(IAP)のサンプル
GAE-2nd-Genでは魔法のヘッダx-appengine-appid
がつかないため、サービス間認証はIAPで実現することになります。
IAP有効状態で、他サービスにHTTPリクエストを投げる場合のサンプルコードを実装してあります。
Firebaseのサンプル
大体どこでも使うAuthenticationとFirestoreのサンプルを実装してあります。
cloudbuild.yaml
Cloud Buildについても案外サンプルが少なく苦労したので。
Cloud Buildの代入変数で_APP_YAML_NAME
に指定したい環境のapp_{ENV}.yaml
を指定してください。
終わりに
参考になれば幸いです。今後は工夫ポイントそれぞれの詳しい解説も投稿していく予定です!