本章では、Golang 1.9ランタイムから1.13ランタイムへの移行、flexible環境からstandard環境への移行作業で行った内容について共有します。
背景
現在稼働中のプロジェクトは、もともと、以下の記事にある構成の通り、Golang 1.9ランタイム上で稼働中でした。 kikki.hatenablog.comしかしGCPで、App Engineの1.9ランタイム以前のサービスを20年6月末日で終了させると発表があり、稼働中のプロジェクトも1.11ランタイム以降に急遽対応せざるを得なくなりました。 cloud.google.com
もともと開発時には、App Engineの環境として費用対効果の面から見て、本来standard環境を採用する予定でした。
しかし当時の状況として、standard環境では外部APIへのリクエスト、ローカルへのファイル保存に対する制約が厳しく機能要件を満たせないため、flexible環境をやむなく採用しました。
App Engineが2世代目となった現在では、standard環境の制約がとても緩くなり、機能要件を満たせる状況でした。
そこで、今回の移行作業でGolangのバージョン上げに伴い、standard環境への移行も合わせて実施しました。
作業内容
対応すべき内容は、以下の公式記事で紹介されている通りに、まずは対応を実施します。 cloud.google.com
その上で、現行プロジェクトで改善できる箇所の変更を図りました。
プロジェクト構成の組み換え
従来のプロジェクト構成
現行のプロジェクトは、App Engine用に提供されていた独自のAPIは利用していませんでした。
そのため、ソースコードに大きな変更を入れる必要はなく、1.13ランタイムへの移行はすぐに完了しました。
一方でプロジェクト構成が、もともとflexible環境を対象としたプロジェクトであったため、複雑な構造でした。
元のプロジェクト1.9ランタイムでは、依存関係管理ツールとして、depを利用していました。
depは、ライブラリを直接プロジェクト内に取り込む仕組みです。
そのため取り込んだライブラリで、sysモジュールを利用しているソースがあると、App Engineでエラーとなり稼働させるための工夫が必要でした。
そこで、App Engine向けに以下のプロジェクト構成を採用していました。
(root) ├─ gae (gae用のルートフォルダ) │ └ (プロジェクトフォルダ) │ ├ statics (開発フォルダ内のstaticsフォルダへのシンボリックリンク ※gae環境で作る) │ ├ templates (開発フォルダ内のtemplatesフォルダへのシンボリックリンク ※gae環境で作る) │ ├ app.yaml (GAEの起動ファイル) │ └ init.go (GAE環境でのmainファイル) └─ go (開発用のルートフォルダ) ├ pkg └ src └ (プロジェクトフォルダ) ├ controllers (コントローラー) ├ repositories (リポジトリ) ├ services (サービス) ├ statics (静的ファイル js cssなど) ├ templates (htmlテンプレートファイル群) ├ vendor (ベンダリング) └ main.go (ローカル環境でのmainファイル)
新しいプロジェクト構成
今回、依存関係管理ツールとして、go modを採用できたことで、ライブラリを内包させる必要がなくなりました。
結果、以下の構成となり、プロジェクト構成のスリム化に成功しました。
(root) ├ app.yaml ├ cmd │ └ web │ └ main.go ├ static (静的ファイル js cssなど) └ pkg ├ controllers (コントローラー) ├ repositories (リポジトリ) ├ services (サービス) └ templates (htmlテンプレートファイル群)
前回との違いは、プロジェクトフォルダが不要(仮初のsrcフォルダも不要となる)になり、直接ライブラリを配置できるようになり階層構造が減ったことです。
app.yamlの変更
階層構造の変更、及びstandard環境の採用により、app.yamlも変更となります。
runtime: go113 instance_class: F1 main: ./cmd/web handlers:- url: /(.*\.(gif|png|jpg|css|ico))$ static_files: \1 upload: static/.*\.(gif|png|jpg|css|ico)$ - url: /.* secure: always script: auto
注意点として、go1.11以降の環境では、「handlers」に従来あった「login: admin」が利用できません。
App Engineでユーザーが管理者かどうかの判断ができなくなったので、今後は別の手法(プログラム上でサポートするなど)を取る必要があります。
筆休め
PaaSは、インフラ周りを管理する必要がなく、開発者としては非常に便利です。しかし構成をサービス提供側の指定に合わせる必要があり、リリース後も変更となることがあります。そのため、継続的な改修が必要となり、適宜開発元の情報はウォッチしていく事が重要です。