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 は元々シングルスレッドですが,threadsafe
を true
にするとマルチスレッドで処理できます.
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 も便利そうだということだけわかりました....