kikki's tech note

技術ブログです。UnityやSpine、MS、Javaなど技術色々について解説しています。

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 (バージョン番号)

筆休め

ローカル環境での開発で、googleで用意されたGAEの実行スクリプトを毎回実行するのは手間だと思います。開発環境と本番環境で上手く使い分けられるよう、プロジェクト作成時から準備しておきましょう。

以上、「GolangのプロジェクトをGAE(flex)とローカル環境で動作させる」でした。


※無断転載禁止 Copyright (C) kikkisnrdec All Rights Reserved.