Python3.7+Django2.1のアプリケーションをGoogleAppEngine/Standard環境にデプロイする

GoogleAppEngineのStandard環境でPython3.7のランタイムがベータ版で利用できるようになったので、試していました。

ドキュメントにはFlaskアプリケーションをデプロイする手順が記載されていましたが、Djangoアプリケーションだと少し設定が追加で必要だったので、メモを残しておきます。

ファイル構成

django-adminツールの startproject コマンドでは、 mysite という名前のプロジェクトを作成しました。 manage.py ファイルの階層にapp.yamlを配置しています。

├── app.yaml
├── db.sqlite3
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── requirements.txt
└── venv

requirements.txtにはDjangoとgunicornを並べています。

AppEngineの設定

app.yamlの最低限の内容はこれぐらい。

runtime: python37
entrypoint: gunicorn -b :$PORT mysite.wsgi:application

skip_files:
- ^venv/.*$

静的ファイルなどがある場合は、従来と同様にhandlersを設定します。entrypointを省略すると、main.pyのapp変数をWSGIアプリケーションとして実行しようとするみたいです。

CloudSQL等を使う場合には追加の設定が必要です。

また、entrypointを記述した場合はgunicornがインストールされないようで、requirements.txtに書いておく必要がありました。

app.yaml Reference  |  App Engine standard environment for Python 3 docs  |  Google Cloud

デプロイコマンド

gcloudコマンドでデプロイします。事前に gcloud auth login コマンドで認証し、 gcloud config set project PROJECT_ID コマンドでGCPのプロジェクトIDを指定しておく必要があります。

gcloud app deploy

Flexible環境と比べるとデプロイに要する時間が1割ぐらい(Flexibleだと10分、Standardだと1分)とかなり差がありました。

気になっていること

従来のPython2.7ランタイムにあった各種GAE向けのサービスで使えないものが多いようです。今後はAppEngine専用のマネージドサービスではなく、GCP上で提供されるサービスを使っていく必要があるのかな。

従来のランタイムとの差異を見るとかなり違うようなので、移行する場合は気をつけたほうがよさそう。

Understanding differences between Python 2 and Python 3 on the App Engine standard environment  |  App Engine standard environment for Python 3 docs  |  Google Cloud