GAE Go 1.11への移行作業
2019-10-01からApp EngineにGo 1.9以下のバージョンのアプリがデプロイできなくなるとの通達を受けて、Go 1.11への移行作業を行ったのでざっくりとまとめておきます。
最終的にはApp Engine特有のAPIへの依存のない状態を目指す予定ですが、今回は初期段階としてappengine.Main()
を使用したものとなります。
作業内容
main.goの変更
package main
に変更- init関数をmain関数に置き換え
appengine.Main()
を追加
公式のサンプルをベースに改変したコード
package main
import (
"fmt"
"net/http"
"google.golang.org/appengine"
)
func main() {
http.HandleFunc("/", indexHandler)
appengine.Main()
}
func indexHandler(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/" {
http.NotFound(w, r)
return
}
fmt.Fprint(w, "Hello, World!")
}
app.yamlの変更
runtime: go111
に変更api_version: go1.9
を除去- handlersの
script: _go_app
をscript: auto
に置き換え - includesの除去
- handlersのloginの除去 (オプション)
上記以外にもDeprecatedになった設定がいくつかあるので注意
includesの除去
自分の場合、Gitで管理しないように環境変数(env_variables)を定義するファイルを個別に作ってincludesで読み込んでいました。
この用途ならgithub.com/joho/godotenvで代替できますし、それ以外の用途でも単純にファイル結合(e.g. cat app_base.yaml hoge.yaml > app.yaml
)させるなどで一応対応できるかと思います。
handlersのloginの除去
Go 1.11ではloginはまだサポートされているのでそのままでも問題ありませんが、将来的に使えなくなるので一応触れておきます。
TaskQueueのハンドラでlogin: admin
を使用してリクエストの検証をしていた場合には、HTTPヘッダーのX-Appengine-Taskname
などが空ではないことを確認すればいいかと思わます。
公式のサンプル
それ以外で使用している場合には何かしらの認証手段を導入する必要があるとのこと。
go.modの利用
vendorを利用している場合などはそのままでも問題ないかと思いますがgo.modが使えるようになったので移行します。(自分はdepで管理していました)
- デプロイの際のビルドとなるべく環境を合わせるためgoenvなどを利用してGo 1.11環境にする
- go.modを作成
go mod init
- module名やコード内でのimportのパスは適切なものに調整
- もしgoogle.golang.org/appengineが古い場合はアップデート
go get -u google.golang.org/appengine
- 一度ビルドしてgo.sumの作成などを行う
go build .
- 不要になったvendorディレクトリなどは削除しておく
gcloudコマンドでデプロイ
vendorディレクトリの関係でappcfg.pyを用いてデプロイしていましたが、Go 1.11はサポートされていないのでgcloudコマンドでデプロイするようにします。
$ gcloud app deploy app.yaml index.yaml queue.yaml
サービスアカウントでデプロイする場合などに必要な権限はこちらを参照