GAE+FlaskでHello, world!

概要

最近GAEとFlaskの勉強をし始めようと思ったのでその備忘Log とりあえずハローワールドまで。

GAEについて

Google App Engineの略で、Google Cloud Platformで利用できるPasSの一つ。
インフラの管理を担ってくれるので、アプリケーション開発に集中することができるというのが一番のメリットです。
PythonフレームワークであるFlaskを用いて、簡単なAPIサーバを構築します。

ディレクトリ構造

GAEの設定ファイルとFlaskのファイルのディレクトリ構造です。

ディレクトリ構造
app_dir/ アプリケーションのディレクトリ
  - main.py メインスクリプト
  - app.yaml GAEの設定ファイル
  - lib/ ライブラリのディレクトリ(GAEでサードパーティライブラリを使用する場合は必須)
  - appengine_config.py libを読み込ませる
  - requirements.txt ライブラリ管理テキスト

SampleApp実装

python3系を使います

app.yaml
runtime: python37

handlers:
- url: /.*
  secure: always
  script: auto
main.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'hello world!', 200

if __name__ == '__main__':
    app.run()

アクセスすると'hello world!'と返す簡単なWebアプリケーションをFlaskで作って見ましょう(なんとこれだけでハローワールドが完成!)

appengine_config.py
from google.appengine.ext import vendor
vendor.add('lib')

libディレクトリを読み込むことを示すPythonファイルです。

pip install -r requirements.txt -t lib

libディレクトリにライブラリをインポートします。

ローカル環境でのテスト

GAEでは通常、 dev_appserver.py app.yamlコマンドによってローカルでサーバーのテストを行えるのですが、Python3系は未対応なので行えません。
ですので通常のPythonサーバーを立ち上げ、テストを行います。

python main.py

http://localhost:5000/にアクセスし hello world!が表示されるか確認します。

デプロイ

ローカルで挙動を確認後、デプロイを行います。

glocud app deploy app.yaml
# 2回目以降はapp.yamlは不要

Services to deploy:

descriptor:      [/任意のディレクトリ/app.yaml]
source:          [/任意のディレクトリ]
target project:  [GCPプロジェクトID]
target service:  [サービス名]
target version:  [20181230]
target url:      [https://サービス名-dot-GCPプロジェクトID.appspot.com]


Do you want to continue (Y/n)?Y
...


Updating service [サービス名]...done.
Setting traffic split for service [サービス名]...done.
Deployed service [サービス名] to [https://サービス名-dot-GCPプロジェクトID.appspot.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s サービス名

To view your application in the web browser run:
  $ gcloud app browse -s サービス名

GAEはデプロイに時間がかかるイメージです。 この程度のアプリでも3分程度かかる時もあります。
最終行の

gcloud app browse

によって自分のサービスをブラウザからアクセスできます。 次回は今回簡単に立ち上げたAPIを拡張していきます。