Posted at

GoogleAppEngineスタンダード環境のPython3サポートはもう少し話題になっていいと思う

More than 1 year has passed since last update.


お知らせ

タイトルの通りですが、2018年7月にGoogleAppEngineスタンダード環境におけるPython3.7サポートがアナウンスされました。(まだベータですが)

https://cloudplatform.googleblog.com/2018/07/bringing-the-best-of-serverless-to-you.html

長らくPython2系のみのサポートだったため個人的には非常に喜ばしいニュースでしたが、特に話題になっていないようなので、念のためこちらでもお知らせしておきます。

伝えたかったことは以上なのですが、AppEngineは少しサービスとして分かりにくいところもあり、「スタンダード環境って何?」といった疑問もあるかと思いますので、AppEngineについてPythonとの関連を中心に簡単に説明したいと思います。

また、今回サポートされたPython3ランタイムは、これまでのPython2ランタイムとは仕組みが異なります。gVisorというテクノロジーが採用され、それによっていくつかの制限が緩和され、より自由な開発が可能になりました。


AppEngineって何?

PaaSです。開発者がアプリを書いてデプロイすれば、インフラのことは気にしなくてもいいやつです。

AppEngineはGCPのサービスの中で最も歴史が古く(2008年プレビュー版)、看板サービスの一つです。

スケーリングが非常に速く大量のアクセスをさばける点に定評がありますが、これはAppEngineのスタンダード環境の特徴です。(スタンダード環境については後述)


今までPython3は使えなかったの?

フレキシブル環境で使えました。

https://cloudplatform.googleblog.com/2016/08/python-3-on-Google-App-Engine-flexible-environment-now-in-beta.html


スタンダード環境とフレキシブル環境の違いは?

AppEngineにはスタンダード環境とフレキシブル環境の2つがあり、それぞれ違いがあります。

下記の公式ドキュメントをまとまっていますが、ポイントをしぼって説明します。

https://cloud.google.com/appengine/docs/the-appengine-environments?hl=ja


フレキシブル環境

フレキシブル環境のほうが後発です。この環境では、ユーザが開発したアプリケーションはDockerコンテナにまとめられます。フレキシブル環境の特徴として、ランタイムの選択肢が豊富で、サードパーティライブラリも好きなものが使えます。(Dockerなので)

スタンダード環境にはないランタイムで、Googleがあらかじめ用意しているものでいうと.NETやRubyがあります。また、ユーザがDockerfileを持ち込むこともできます。

アプリケーションを起動するには最低1台以上のインスタンス(つまりDockerコンテナ)が必要になりますが、起動させるインスタンスごとにVM(仮想マシン)が起動します。その結果として、課金モデルもGCEと近くなっています。

ユーザはVMにSSHすることが可能であり、インフラレイヤの抽象度は高くないといえるでしょう。(docker psを実行すると、デプロイしたアプリがコンテナとして起動しているのが見えます。)


スタンダード環境

* 下記はPythonランタイムについてであり、他のランタイムでは事情が異なるかもしれません。

フレキシブル環境はDockerベースでしたが、スタンダード環境は技術的なアーキテクチャが公開されておらず、Google内部の技術が使われていると思われます。

フレキシブル環境に比べると制約が多くあります。たとえば、ランタイムの選択肢が限定的、一部のライブラリが使用不可、リクエストが60秒でタイムアウトする、ローカルディスクへ書き込めない、などです。(あとで触れますが、Python3で一部の制限が緩和されています

このようにデメリットもありますが、インスタンスの起動がかなり早いという大きなメリットがあります。

GCPのドキュメントではフレキシブル環境が分のオーダーに対し、スタンダード環境はミリ秒とされています。

https://cloud.google.com/appengine/docs/the-appengine-environments?hl=ja

高速なスケーリングにより突発的なアクセス集中にも対応できます。また、あらかじめ多くのインスタンスを起動させておく必要がないため、コストの節約にもなります。

これは私の経験ですが、デプロイ時間についてもスタンダード環境のほうが優れています。フレキシブル環境では10分程度かかっていましたが、スタンダード環境に変更したところ1分半〜2分で完了するようになりました。(どちらもPython3ランタイムを使用)


Python3での制限緩和

スタンダード環境のPython3ランタイムでは、Python2ランタイムと比較して、制限が緩和されています。

特にサードパーティライブラリが自由に使えるようになったのが大きいです。

requirements.txtに書くだけでOKです。(フレキシブル環境と同じですね)

以前はCloud SDK(GCPサービスと連携するためのSDK)が呼び出せないという冗談のような問題がありました。(特定のサービスだけかも)

その他の制限の緩和については、こちらを見てください。

https://cloud.google.com/appengine/docs/standard/python3/python-differences

これらの制限緩和については、gVisorによるところが大きいと思います。

https://cloudplatform.googleblog.com/2018/05/Open-sourcing-gVisor-a-sandboxed-container-runtime.html


まとめ

GCPでWebアプリを提供するにはAppEngineが非常に便利です。しかし、今までPython3はスタンダード環境で使えなかったため、高速なスケーリングというAppEngineの恩恵を受けることができませんでした。

そして、Python2を選んだとしても、少なくない制限を受け入れる必要がありました。また、サポート切れが見えているPython2系を新しいプロジェクトで使うのも微妙です。

しかし、今回gVisorベースのPython3サポートが発表され、開発における制限が少なく、高速なスケーリングというAppEngineの恩恵を受けながらPython3を使うことができるようになりました。