Google App EngineでFlaskを動かす

Python の Web フレームワークとして有名な Flask を使って,Google Cloud の Google App Engine 上でサーバを建ててみたいと思います.

Heroku ではなく GAE で

これまでは Flask を Heroku 上で扱っていたのですが,Heroku は基本的に米国と欧州しか選べないので,東京にデータセンターがある GAE を選んでいます.

Django ではなく Flask で

楽だから.(ボソ)

Flask が使えれば API サーバを作ったりウェブサイトを公開したりできるので,それだけで十分ですし,Django を使うほどの機能がないので....

Bottle も使ったことがありますが,あれは軽量すぎて使いづらいです.

環境

  • Windows 10
  • App Engine Standard Environment

Standard Environment の注意点

インスタンス合計で一日 28 時間まで無料枠です.(Heroku でいえば 28 dyno 時間) また,Python 2.7 までしか使えず,3 系は Flexible Environment のみの提供です.

準備

Google Cloud SDK をインストールし,コマンド操作ができる環境を作ります.

terminal
$ gcloud init

インストール後に上記コマンドを実行すると,確か Google へのログインなどが行われます.

ディレクトリの構成

Flask を動かすファイルの構成はこのようになっています.

  • lib ディレクトリ
  • app.yaml
  • appengine_config.py
  • main.py
  • requirements.txt
  • static ディレクトリ
  • templates ディレクトリ

今回は API サーバを建てようと思ったので,下二つは用意しませんでした.

構成ファイルの概要

Getting Started with Flask on Google App Engine Standard Environment に沿う形で.

app.yaml

App Engine の設定を色々書き込むファイルです.

app.yaml
runtime: python27
api_version: 1
threadsafe: true

handlers:
  - url: /.*
    script: main.app

Flask は元々シングルスレッドですが,threadsafetrue にするとマルチスレッドで処理できます.

appengine_config.py

appengine_config.py
from google.appengine.ext import vendor

# Add any libraries installed in the "lib" folder.
vendor.add('lib')

これはドキュメントのコピペ.lib ディレクトリにサードパーティのモジュールを入れるための設定です.

requirements.txt

requirements.txt
Flask==0.12.2
Werkzeug<0.13.0,>=0.12.0

使うモジュールを書きます.これを使って lib にインストールしますが,デプロイしなくてもいいのかもしれません.

terminal
$ pip install -t lib -r requirements.txt

main.py

main.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return('Hello World!')

最低限これがあれば動きます.トップページに接続すると Hello World! と表示されるはずです.

app.run() は必要ありません.ちなみに,Flask 側でマルチスレッドにするためには app.run(threaded=True) とするらしいです.(こないだ知った)

ローカル環境でのテスト

ここが少し曲者で,パスがうまく通っていないらしくドキュメント通りにはいきませんでした.

terminal
$ dev_appserver.py app.yaml

本来はこれでいけるはず.パスをいじってもだめだったので,普通に実行する形でやりました.

terminal
$ python "c:/Users/[user]/AppData/Local/Google/Cloud SDK/google-cloud-sdk/bin/dev_appserver.py" app.yaml

これでローカルの 8080 番ポートで接続できます.

エラーの対処

No module named 'setup'

→ ローカル開発環境が Python 2.7 になってません.

Can't connect to HTTPS URL because the SSL module is not available on google app engine

→ app.yaml への書き込みで解決できます.

app.yaml
libraries:
  - name: ssl
    version: latest

GAE へのデプロイ

terminal
$ gcloud app deploy app.yaml --project PROJECT_ID

Heroku のように Git で管理しているわけではないので,これだけです.二回目以降は gcloud app deploy でやってます.

最後に

GAE を使って解決しようと思った問題は結局未解決なのですが,GAE も便利そうだということだけわかりました....