最近GAEのバージョンをgo1.11にアップデートしたのでそのときのメモ
なぜgo1.11に移行したか
GAE/GO(1.9) Standard から Cloud PubSubに秒間15000件パブリッシュしようとして色々ハマった話でも書いたように、go1.9を使っていたためにGAEのfetchURLの制限にひっかかってました。それを解決するために、リクエストをメモリ上にキャッシングするような実装をしていました。実は、このpubsubを使った実装への移行によりGAEの料金が3割程度あがってしまったという問題があり、その原因としてこのキューに詰め込む処理が怪しいという仮説を立てていました。
今回、go1.11へ移行し、シンプルな実装に戻して料金がどうなるかを検証するために移行を行いました。
あ、うちもgo1.9 -> go1.11に移行したほうがいいの?
まだgo1.11はベータ版ですし、go1.9で問題なく動いているなら必要ないとは思います。
新規で作る場合はgo1.11がよさそうです。
App Engine Standard Go 1.9 migration to Go 1.11
やったこと
箇条書きするとこんな感じでした。
- goのバージョンを1.11にする
- app.yamlを書き換える
-
runtime: go
->runtime: go111
に -
script: _go_app
->script: auto
に
-
- main.goの変更
- package名をmainに
- init() -> main() に
- appengine.Main() を追加
- これないと
dev_appserver
起動時にconnection error
発生した
- これないと
- デプロイできるようにディレクトリを調整(※1)
基本、公式マニュアル通りにやればだいじょぶです。
Migrating your App Engine app from Go 1.9 to Go 1.11
こちらも、日本語でわかりやすかったです。
GAE/Go アプリケーションを Go 1.11 に移行するためにやったこと
Gcloud SDK と GAE SDK for GO
GAEを取り扱うコマンドラインツールはGcloud SDKとGAE SDK for GOの2つあります。
現在はGcloud SDKが推奨のようです。弊システムでもGcloud SDKを使っています。
depとglide
Goのパッケージマネージャにはdepとglideがあります。glideのリポジトリをみるとdepへの移行を推奨しているようなので、depを使ったほうがよさそうです。
弊システムではglideを使っていたので引き続きglideを使います。
デプロイできるようにディレクトリを調整
gcloud deploy
しようとしたらパッケージのimportパスが見つからないエラーが出ました。
すべての実装ファイルを GOPATH/src
以下に配置したら動くようになりました。
↓こんな感じ
GOPATH/
- bin
- pkg
- src
- main
- main.go
- app.yaml
- hoge
- hige.go
- fuga
- foo.go
- glide.lock
- glide.yaml
- vendor
- github.com/...
- google.golang.org/...
sonatardさんのサンプルを参考にさせてもらいました sonatard/appengine-go-migrate-2nd-gen-sample。glideもGOPATH/src/
以下で glide update
すれば普通にパス通るので便利です。
go1.11のディレクトリに関する公式ドキュメント
structuring_your_files
gopath
で、課金額はどうなった?
go1.11にあげて、実装をシンプルなものに戻したところ、課金額が3割ほど下がりました。作成インスタンス数は前バージョンからあまり変わっていないのですが、有効インスタンス数が下がったのが大きかったと思います。前バージョンでは作成インスタンス数が有効インスタンス数と同数になってしまっていました。これは、普通ではありえないと思います。おそらく、ログのロストを避けるために長い時間リクエストコネクションはるような実装をしていたので、そのあたりが悪さをしていたと考えています。
※ go1.9 -> go1.11になれば料金が安くなるという意味ではありません。