はじめに
- GAE/Go でウェブアプリケーションを作ろうとすると専用のライブラリを使う必要があったり専用のブートストラップ処理を実装する必要があったりとちょっと面倒だったのですが、Go 1.12 のランタイムからコンテナの実装が変わったということで普通のウェブアプリケーションと同じ感じで簡単につくれるようになったみたいです。
- この記事ではその GAE/Go 1.12 環境で web application framework の echo を使い go modules で依存関係管理をする普通のウェブアプリケーションを作ってみます。
できたものがこちらです
- 作ったアプリケーションはこちらです。
- サンプルとして HTTP ハンドラがひとつあるだけのアプリケーションになります。
ファイル構成
app.go # アプリケーションのメイン処理
app.yaml # GAE 設定ファイル
go.mod # go modules 設定ファイル
app/
handler.go # アプリケーションの HTTP ハンドラ
template.go # アプリケーションのテンプレート処理
template/
index.html # テンプレートファイル
public/
favicon.ico # 静的ファイル
アプリケーションのメイン処理
- GAE/Go のメイン処理であるサーバーを立ち上げる部分ですが、以前は
init()
とかでやっていてちょっと特殊な感じでした。 - Go 1.12 では
main()
で普通にウェブサーバーを立ち上げるだけで良くなったので気持ちいいです。 - 特殊な点として環境変数
PORT
で引き渡されたポートでウェブサーバーを起動する必要があります。
func main() {
e := echo.New()
e.Renderer = app.NewTemplate("templates/*.html")
e.GET("/", app.IndexHandler)
port := os.Getenv("PORT")
if port == "" {
port = "8080"
e.Logger.Printf("Defaulting to port %s", port)
}
e.Logger.Fatal(e.Start(fmt.Sprintf(":%s", port)))
}
GAE 設定ファイル
runtime: go112
handlers:
- url: /favicon.ico
mime_type: image/x-icon
static_files: public/favicon.ico
upload: public/favicon.ico
- url: /public
static_dir: /public
- url: /.*
secure: always
script: auto
依存関係の管理
- 依存関係の管理は go modules を使うようです。
go modules の利用準備
- go 1.12 をインストールします
依存関係管理の初期化
- 依存関係管理の初期化をするためにプロジェクトのルートで以下のコマンドを実行します
go mod init {MODULE_NAME}
- go modules はプロジェクトルートが GOPATH 以下であるかや環境変数 GO111MODULE の値によって挙動が変わります。
- 細かいことはおいておいて常に初期化を成功させたい場合は以下のコマンドを実行してください。
- 詳細はこちらなどが参考になりました。
GO111MODULE=on go mod init {MODULE_NAME}
依存関係を解決する
-
go build
など各種 go コマンドを実行するごとに自動で依存関係が解決されgo.mod
ファイルに記録されます
依存関係を反映させる
- GAE/Go 1.12 は go modules に対応しており
go.mod
ファイルを置いておくとデプロイ先で依存関係を解決してくれるようです。
デプロイ
- デプロイは
gcloud
コマンドで行います。
gcloud app deploy ./app.yaml --project PROJECT_NAME
他サービスとの連携
- Cloud Datastore とのデータの読み書きをなどの他サービスとの連携をする場合、従来は http.Request から appengine.NewContext して認証情報を取得するというような面倒な手順がありました。
- GAE/Go 1.12 ではサービスアカウントに権限を付けておくと
golang.org/x/oauth2/google
を使って認証できるようになるということで、ここのモック化が簡単であればだいぶ開発しやすくなっているはずだと思いますが、今検証できていないので後で時間があれば確認してみます。 - 関連ドキュメントはこちらです。
おわりに
- GAE/Go は便利だけどクセが強いのが微妙だと思っていたんですが、1.12 でだいぶ普通に使えるようになっているみたいなのがうれしいです。 今回さわりだけ見てみましたが、もうちょっとちゃんと時間使って使いこなせるようになろうと思います。