at kaneshin

Free space for me.

Flask を Google App Engine で動作させる


f:id:laplus-knsn:20160905010354p:plain


Google App Engine 上で Python の軽量 Web フレームワークである Flask を使うためのチュートリアルです。

TL;DR

github.com

GAE For Python

とにかく、Flask を App Engine で使うためには App Engine の SDK をインストールしておく必要があります。

インストール

Download the Google App Engine SDK  |  App Engine Documentation  |  Google Cloud Platform

上のリンクにある Google App Engine SDK for Python からインストールすることができます。

Flask on GAE

GitHub - GoogleCloudPlatform/appengine-flask-skeleton: A skeleton for creating Python applications using the Flask framework on App Engine

上のリンクにもありますが、ディレクトリは下のようになります。

app
 |_ app.yaml
 |_ appengine_config.py
 |_ lib/
 |_ main.py

Flask の準備

Flask を App Engine で使うためには Flask をロードしておく必要があります。そのため、ロードできるとうに Flask を lib というディレクトリの中にインストールしておきます。

mkdir lib
pip install -t lib flask

ちなみに、GCPリポジトリでは requirements.txt からインストールするようになっています。

# https://github.com/GoogleCloudPlatform/appengine-flask-skeleton の場合
pip install -r requirements.txt -t lib

この lib ディレクトリを App Engine の実行時にロードするために appengine_config.py へ下記の記述をします。

appengine_config.py

from google.appengine.ext import vendor

# Third-party libraries are stored in "lib", vendoring will make
# sure that they are importable by the application.
vendor.add('lib')

App Engine

App Engine へのリクエストハンドラや静的ファイルへのパス・アプリケーションの設定を app.yaml に記述します。

app.yaml

runtime: python27
api_version: 1
threadsafe: yes

# Handlers define how to route requests to your application.
handlers:
- url: .*
  script: main.app

ルーティング

main.py に Flask をインポートし、簡単なルーティングをします。

main.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    """Return a friendly HTTP greeting."""
    return 'Hello World!'

@app.errorhandler(404)
def page_not_found(e):
    """Return a custom 404 error."""
    return 'Sorry, Nothing at this URL.', 404

@app.errorhandler(500)
def application_error(e):
    """Return a custom 500 error."""
    return 'Sorry, unexpected error: {}'.format(e), 500

動作確認

App Engine の SDK にの中にある dev_appserver.py を使用して実行します。

dev_appserver.py .

※dev_appserver.py が実行できない場合、App Engine の SDK が PATH に通っていない可能性が高いです。

実行後、http://localhost:8080 を叩けば "Hello World!" の文字が確認できると思います。

# 動作確認
curl -XGET localhost:8080

デプロイ

デプロイするプロジェクトを GCP の管理画面にて作成し、Project ID を用意し、下記コマンドの [your-project-id] に記述して実行してください。

appcfg.py update -A [your-project-id] -V v1 .

特にエラーがでなければ https://[your-project-id].appspot.com でアクセスすれば "Hello World!" が表示されていると思います。