GolangのプロジェクトをGAE(flex)とローカル環境で動作させる
本章では、Golangのプロジェクトを、Google App Engine (flexible) 環境とローカル環境で両立して動作させる方法について共有します。
考察
一般的には、開発で本番環境と開発環境を分けて管理するケースが多いです。もし、GAEの環境をそのままGOのプロジェクトフォルダに配置すると、GAEに必要な「main」関数とローカル環境に必要な「main」関数が競合します。
開発用のRDBSやインメモリDBの設定が同じ場合であれば、特に問題は発生しません。しかし、本番環境と開発環境を分けて管理していると、同じ「main」を使いたくない場合が多いかと思います。
そこで、ローカル環境で参照される設定と、本番環境となるGAEでの設定を分けて利用できるように、フォルダ構成を工夫する必要があります。
フォルダ構成
ローカル環境とGAEの環境を使い分けるフォルダ構成は、以下の通りです。
(root) ├─ gae (gae用のルートフォルダ) │ └ (プロジェクトフォルダ) │ ├ statics (開発フォルダ内のstaticsフォルダへのシンボリックリンク ※gae環境で作る) │ ├ templates (開発フォルダ内のtemplatesフォルダへのシンボリックリンク ※gae環境で作る) │ ├ app.yaml (GAEの起動ファイル) │ └ init.go (GAE環境でのmainファイル) └─ go (開発用のルートフォルダ) ├ pkg └ src └ (プロジェクトフォルダ) ├ controllers (コントローラー) ├ repositories (リポジトリ) ├ services (サービス) ├ statics (静的ファイル js cssなど) ├ templates (htmlテンプレートファイル群) ├ vendor (ベンダリング) └ main.go (ローカル環境でのmainファイル)
init.go
init.goの記述は以下の通りです。
package main import ( "log" "net/http" ) func init() { // cloud SQLなどの初期化をここで行う // httpへのルーティングを登録する } func main() { log.Fatal(http.ListenAndServe(":8080", nil)) }
app.yaml
app.yamlの記述は以下の通りです。flexible環境で利用する構成です。
runtime: go api_version: go1 env: flex manual_scaling: instances: 1 resources: cpu: 1 memory_gb: 0.5 disk_size_gb: 10 beta_settings: cloud_sql_instances: #cloud SQLへの接続文字列 handlers: - url: /.* script: _go_app
GAEでの実行
GAEでのデプロイと実行では、「gcloud」コマンドを使用します。init.yamlのフォルダに移動し、以下のコマンドを実行すると、デプロイが開始されサーバーが起動します。
export GOPATH=/(gaeでのユーザーフォルダ)/(root)/go; gcloud app deploy -v (バージョン番号)