はじめに
先進サービス開発事業部の山岡です。
Google App Engine(GAE)は所謂PaaSでサーバーやネットワークの管理を気にせずアプリの開発に集中することができます。
最近これに関するホットな話題として2nd Generationへの移行がありますが、色々と情報が飛び交っていたりいつの間にか変更されているものもあり混乱してきましたので自分の整理を兼ねて改めてまとめたいと思います。
GAEの種別
まずGAEには大きく分けてStandard Environment(SE)とFlexible Environment(FE, Flex)の2種類があり、要件に合わせて選択することができます。
SEはGoogleが独自に実装したサンドボック環境で動き、アクセス数に応じて秒単位で次々とインスタンスが立ち上がりトラフィック捌くことができる強力なスケーラビリティが大きな特徴となっています(但し言語や使用フレームワーク等により上下します)。特にGolangを使用した場合は数十msでインスタンスが起動してくるためオートスケーリング発動から起動完了までのタイムラグによるHTTP503を心配する必要が殆どありません。その反面リクエストの応答を60秒以内にしなければならなかったり、外部アクセスにそれ用のサービス(URL Fetch、Quota有)を利用しなければならなかったりといった制約があります。
対してFlexはスケーリングが少々遅かったりする(分単位)代わりにリクエストへの応答時間制限が60分と長かったり、インスタンスへSSHで接続しデバッグしたり、直接インターネットへアクセスすることができるといった柔軟性の面でメリットがあります。
SEとFlexどちらを選ぶべきかについての選択については可能な限りSEでできないか検討しどうしてもダメな場合はFlexを使う、という具合にするのが公式で推奨されています *1 。
今回話題になっている2nd Generation云々についてはSEに関する話題で、ざっくり言うとSEの利便性をそのままに特有の制約をなるべく排除し使いやすくできるというものになります。
1st Generationと2nd Generationで何が変わるのか
GAEのユーザーが直接意識するものではないかもしれませんが、まず根幹の部分としてはアイソレーションの実現が独自実装のランタイムからgVisorベースのものに変更されます。この辺に関しては私も勉強不足であまり詳しくないのですが、アプリがリクエストするシステムコールに介入してVMと同等のアイソレーションを実現するようです *2 。
また使用するAPIが変更となり、App Engine APIからGoogle Cloud Client Libraryに変更となりますのでMemcacheやTask QueueといったGAE付属の便利なサービスも使うことができなくなります。これらには完全な移行先が無いものもあるため、2nd Genに完全対応するためにはそれなりの労力が必要になる可能性があります。以下はドキュメントに記載のあるマイグレーション先候補です。
- Mail API: サードパーティのメールサービス(例: SendGrid, Mailgun, Mailjet)
- Task Queue: Cloud Tasks
- Memcache: Redis Labs Memcached Cloud
- Blobstore: GCS
- Datastore: Cloud Datastore
- Search API: ElasticSearch on Compute Engine
- Images API: GCS + サードパーティの画像処理サービス
メールや画像処理はさておき、MemcacheはGCPのインメモリーキャッシュサービスであるMemorystoreが使えても良さそうなものですが現状は使うことができません。ただ先日参加させて頂いた酔いどれGCPUG Next'19報告会ではいずれGAEからもアクセスできるようになるとの話があったのでそのうち対応されると思われます(いつ頃なんだろう……)。他に私の用途範囲ではGAE経由で大容量ファイルをGCSにアップしたい場合にBlobstore APIが使えなくなるのが辛いです。
ネットワークについては通常のVMで動かす場合と変わらない形になるため利便性は大幅に上がるでしょう。URL Fetchサービスを使わないので当然Quotaも無くなります。また/tmp
配下限定ではありますがディスクの読み書きも可能になります。これらは純粋に利便性が上がるものなので特に問題となることはないでしょう。
1st Generationと2nd Generationで変わらないところ
GAE SEを使う上での主要なメリットは上記の点を除き基本点に変更が無さそうです *3 。
- トラフィック急増時のスケーリングにかかる時間
- アプリのビルド方法
- SLAの内容
- CLI, Webからの操作方法
- 無料利用枠
GAE/Go1.11は2nd Generationではない?!
以前は1.11は2nd Genだとされていた記憶があったのですが、いつの間にやらこっそりに1st Gen扱いされていました *4 。App Engine APIを使えるものが1st Genでそれを使えないものが2nd Genという覚え方で良いようです。
結果として前回のブログ記事に嘘を書いてしまったことになります。失礼しました。この場を借りて訂正します。
ただ、1st Gen扱いの1.11であってもランタイムは既に2nd Genで動いておりApp Engine APIもGoogle Cloud Client Libraryどちらでも使うことができます。他の言語については使っていないのでわかりませんが、恐らく同様に両環境とも使えるものがあるのではないかと思います(そうでないと移行が辛すぎます……)。
なお現在Beta中のGAE/Go1.12ではApp Engine APIが完全に使用不能となります。Deprecation Policyもあるので少なくとももう何年かは問題無いとは思いますが、いつかはApp Engine APIを卒業しなければなりません。
まとめ
- 2nd Genでは基本的なGAEのメリットそのままに自由度が上がる
- 但しGAEの付属便利サービスは使えなくなり、中には直接の代替手段が無いものもある
GAE/Goに関して言えば、今すぐの完全移行は厳しいにしても早めに1.11へ移行し徐々に脱App Engine APIを進めて行くのが良いのではないかと思っています。