GAE/ Go1.9 から Go1.12 へ移行するためにやったこと
業務でGAEのGoアプリケーション(1.9)を1.12化をすることがあったので、作業ログをまとめておきます。
やること
app.yaml
の書き換えruntime: go112
script: auto
skip_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.ListenAndServe
appengine.NewContext(req)
->req.Context()
google.golang.org/appengine/datastore
->cloud.google.com/go/datastore
- ちょっとずつ実装が変わっていたのでドキュメント見比べつつ直した
10月には1.9ランタイムがdeprecatedになっているにも関わらずあまりインターネッツに情報がなかったので少し大変だった。とりあえず動いてはいるけど、これでいいのかな?という感じで自信がない...