Google App EngineでFalconを動かす

Posted by rhoboro on 2016-12-23

FalconフレームワークをGAE(Google App Engine)で動かしたときのメモ。
Falconはミニマルで軽いWebフレームワークなので、GAEと相性がいいんじゃないかなーと思って動かして見ました。
ちなみに、書いてある手順はFalcon以外のWSGIアプリケーションでも同じように使えます。

環境

  • macOS Sierra
  • PyCharm Professional 2016.3.1
  • Python2.7
    • (ほぼ確実にないだろうけど、)GAEはSEもPython3対応してくんないかな...
  • すでにgoogle_appengineのSDKはインストール済みであることを想定
  • ソースコードはGitHubにおいています

PyCharmでGAEプロジェクトを作成

  1. プロジェクト用のディレクトリを作成する。
[alpaca]~ % mkdir gae-falcon
[alpaca]~ % cd gae-falcon
[alpaca]~ % virtualenv venv
[alpaca]~ % mkdir gae-falcon
  1. PyCharmを起動して、File > New Projectを選択して、下記のように設定してCreate。
    • Google App Engineを選択
    • 空のgae-falconディレクトリを選択
    • Add Localから先ほど作成したvenv/bin/python2.7を選択
    • Application IDはGoogle App EngineのIDになるので世界で一意なものを指定
      • 先にGoogle Cloud Platform上でプロジェクト作っておいたほうがいいかも

new-project

Falconのインストール

GAEでThird-party製ライブラリを使うには下記の2通りある。(公式ドキュメント)

  1. GAE側であらかじめ用意しているものを利用
  2. 自分で作るアプリケーションにライブラリのソースコードを入れる

今回利用するFalconはGAE側では用意されていないため、アプリケーション内にソースコードを配置します。

# app.yamlのある場所で
[alpaca]~ % mkdir lib
[alpaca]~ % pip install -t lib falcon
[alpaca]~ % cat << EOF > appengine_config.py
heredoc> from google.appengine.ext import vendor
heredoc> vendor.add('lib')
heredoc> EOF
  1. PyCharmでlibディレクトリを補完対象にする

    1. PyCharm > Preferences... を開き、Project: XXX > Project Interpreterを選択
    2. 歯車マークからMoreを選択
      • interpreter
    3. ウィンドウ下にあるボタンのうち、一番右を選択
      • more
    4. 表示されたウィンドウの左下の+マークからFalconをインストールしたlibディレクリを選択
  2. main.pyを下記の内容に編集(公式ドキュメントのQuickstartより)

# things.py

# Let's get this party started!
import falcon


# Falcon follows the REST architectural style, meaning (among
# other things) that you think in terms of resources and state
# transitions, which map to HTTP verbs.
class ThingsResource(object):
    def on_get(self, req, resp):
        """Handles GET requests"""
        resp.status = falcon.HTTP_200  # This is the default status
        resp.body = ('\nTwo things awe me most, the starry sky '
                     'above me and the moral law within me.\n'
                     '\n'
                     '    ~ Immanuel Kant\n\n')

# falcon.API instances are callable WSGI apps
app = falcon.API()

# Resources are represented by long-lived class instances
things = ThingsResource()

# things will handle all requests to the '/things' URL path
app.add_route('/things', things)

PyCharmでRunボタンからアプリケーションを実行して、localhost:8080/thingsにアクセスして下記が表示されたらOK。

Two things awe me most, the starry sky above me and the moral law within me.

    ~ Immanuel Kant

ちなみにこれで動くのは、app.yamlで下記のような指定がされているからです。 ここで指定してあるmain.appmainスクリプト内のapp変数がWSGIアプリケーションという宣言なので、Falcon以外のPython製Webフレームワークでも全く同じように利用できます。

- url: .*
  script: main.app

デプロイ

  1. ブラウザでGoogle Cloud Platformを開く
  2. プロジェクトを新規作成する。プロジェクト名はPyCharmでプロジェクト作成時に指定したものと同じにする。
  3. 新規作成したプロジェクトのダッシュボードからGoogle App Engineを有効化
  4. PyCharmでTerminalを開いてappcfg.py update . app.yamlを実行
  5. 下記のようになればデプロイ成功

update

最後にhttps://[プロジェクト名].appspot.com/thingsにアクセスして、先ほどローカルで表示されたものと同じ内容が表示されたら完了です。

ちなみに、GAE関係なく、自分で書いたスクリプトでlibディレクトリからimportしたいときは、こちらを参考に下記のようにします。

import sys
sys.path.insert(0, 'libs')
from falcon import falcon