GAE/ Go1.9 から Go1.12 へ移行するためにやったこと
業務でGAEのGoアプリケーション(1.9)を1.12化をすることがあったので、作業ログをまとめておきます。
やること
app.yamlの書き換えruntime: go112script: autoskip_filesは.gcloudignoreへ移行loginが非推奨になるので新しい認証を入れるlogin | 非推奨 | Go 1.12 ラインタイムでは login がサポートされません。ユーザー認証に別の方法を使用する必要があります。
init.go&init_test.goの書き換え- ファイル名を
main.go&main_test.goに変更 func init()をfunc main()に変更
- ファイル名を
ハマったところ
go run main.go ができない
- localで
go run main.goしてみるとすでにappengineパッケージ周りでエラーが出ていたのでサポート対象外ってAPIが廃止になったてことかな......- ちなみに
dev_appserver.pyみたいなアレが1.12ランタイムから使えなくなったのでそれはそう、という感じ - 完全に appengine package から脱出しないとローカルで実行することができないのでちょっと面倒
- ちなみに
go mod 使うとワーキングディレクトリが go.mod がある場所になる
- これまでは
app.yamlのある場所がワーキングディレクトリだった - localでは動くものがデプロイすると
template file not foundになってしまった- ひとまずtemplateファイルの場所をgo.modからの相対パスで指定している
app.yamlにmain属性を指定するみたいな方法もあるらしい
internal.flushLog: Flush RPC: service bridge HTTP failed: Post http://appengine.googleapis.internal:10001/rpc_http: dial tcp 169.254.169.253:10001: i/o timeout というエラー
これは私の手元での問題なのだが、
go mod initするとGopkg.lockから依存を解決してくれていたのでしっかり以前のバージョンが更新されないまま入っていた- latestにアップデートしてみて、これで直るか!!と思ったけどダメ
- 検索してみると 同じような症状の人を見つけた
- 原因不明なのでgo1.11ランタイムを使っていますとのことぽい、そんな...
appengineパッケージを完全に脱出すると治った
appengine.Main()->http.ListenAndServeappengine.NewContext(req)->req.Context()google.golang.org/appengine/datastore->cloud.google.com/go/datastore- ちょっとずつ実装が変わっていたのでドキュメント見比べつつ直した
10月には1.9ランタイムがdeprecatedになっているにも関わらずあまりインターネッツに情報がなかったので少し大変だった。とりあえず動いてはいるけど、これでいいのかな?という感じで自信がない...