GCPをAlways Freeで使っていて、GCE 以外のコンピューティングリソースとして無料で利用できるのがGAE(スタンダード限定)
PaaSで、コードを書いてgcloud app deployとかすれば環境とか作らずにアプリが動く。
環境自体がマネージされているから手間がかからないけど、逆に中がどうなっているかとか知らないととっつきにくく、カスタムも難しかったりできなかったり。
だけど、慣れればこれはこれで非常に便利で、オートスケーリングとかしてくれるし、実行された時間単位の課金で、VMみたいにインスタンスを立ち上げて止めてとかする必要がなく、アプリが呼び出されれば勝手に動いて、終われば勝手に止まるという事で、フィットするアプリなら非常に便利。 ユーザがどれだけいるかわからないアプリのバック機能とか、ここにコードを載せておけば需要がなければお金がかからず、需要が増えたらお金さえ払えば勝手に動く。
マネージなんでランタイムとかは提供されている中から選ぶしか無く、長らくPythonは2系のみだったんだけど、今年になってやっとこさPython3系がサポートされたと言うんでお試ししてみた(と言ってもベータリリース)
作業の基本
まずは、GAEの管理画面でプロジェクトを作っておく。 GAEはイマイチ上手く削除できないんで、適当にプロジェクトを作って置いていざとなったら消せるようにするのがオススメ(Google公式でプロジェクトごと消すのがオススメされてる)
プロジェクトを生成すると、プロジェクト名-自動採番の名前のアプリが生成されて、名前.appspot.comというドメインで動く。 独自ドメインはGoogleコンソールで認証すれば登録できる。
コードのアップロードは、ディレクトリの中で gcloud app deploy app.yaml –project アプリ名 とかやると、app.yamlに書いた条件でアプリケーションがデプロイされて、そのディレクトリの中身全部が転送される。 だから、アプリケーションディレクトリを切ってコードやファイルやら置いて普通に作る。
まずは、app.yaml作成。
python3を使いたいので、
1 |
runtime: python37 |
だけ記述して終了。
次にrequirements.txt の作成。
このファイルは、pipのrequirementsで、シェルとかで入れないGAE std環境にライブラリとかを組み込むために必要。
今回はFlaskアプリでBS4をhtml5libと共に使用するんでこんな感じ。
1 2 3 |
Flask==1.0.2 BeautifulSoup4 html5lib |
Python2系ランタイムだとGoogle提供標準外ライブラリはファイルを抱き合わせてアップして使うのが標準だった(Python3ランタイムだと環境が変更になっていて、多くのライブラリがRequirementsで動く) Python2ではアプリケーションディレクトリにlibディレクトリとか掘って
1 |
pip3 install -t lib/ beautifulsoup4 html5lib |
とかしてライブラリを入れて、appengine_config.pyでgoogle.appengine.extのvendorを使ってロード指定するとか書かれているけど、これはPython3ランタイムでは実装されてない(google.appengineをインポートしようとした時点でエラー)し、appenginie_config.pyもロードされない。 これは結構ハマった。
しかし、libの中に入れる方法自体は生きていて、vendorを呼ばずに普通にPythonでpathを通せば使える。 アプリ(標準はmain.py)の頭でsys.pathに追加してやる。
1 2 |
import sys, os sys.path.append(os.path.join(os.path.dirname(__file__), 'lib')) |
requirementsに書かないでこの方法でライブラリを入れても良いが、requirementsの方がスマートだろう。
で、あとはmain.pyの中に普通にFlaskのコードを書いていく。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#! coding utf-8 import sys, io, os sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.path.append(os.path.join(os.path.dirname(__file__), 'lib')) from falsk import Flask, request, make_response import urllib from bs4 import BeautifulSoup app = Flask(__name__) @app.route('/') def index(): """ app code """ return response if __name__ == '__main__': app.run(host='127.0.0.1', port=8080) |
バックグラウンド的に長時間走るような物は使えないので注意。 あと、メモリやレスポンスサイズも制約がある。 レンタルWebサーバみたいに制約があるけどコードベース管理が出来て、専用環境程は管理が要らないという絶妙加減、だからフィットする場合には最高で、フィットしないときには窮屈でどうにもならない。
SQLiteなんかも使えないし、GCPのSQLサービスは無料対象外なんで、無料でSQL動かすならGCEにDB入れて協調させるとかなるけど、それじゃGAEのおいしいところが減ってしまう。 データベースが必要な場合はNoSQLのDatastoreやBigqueryなんかで専用実装するのがいい。
なお、アプリのアクセス制限とかは、GCPのIAMにあるIAPを利用すると入り口でGoogleアカウント認証とか簡単に出来るんで、GCP上にあるリソースの管理機能とかをホスティングするとか言うのにはかなり良い。 ちょっとした管理スクリプトの為に、ログイン認証とか備えたアプリを作るのもアホらしいからね。
GAEはクラウドらしくデザインしたアプリケーションを動かすときには非常に便利だが、従来のアプリケーションをそのまま動かそうとする場合は色々不都合があるという事だ。 しかし、単に柔軟性が高いだけでサーバ管理作業が必要になるIaaSに比べると、やはりPaaSはクラウドのおいしさを享受している感じがする。 うまくマッチしたアプリを構築できれば有用なサービスだ。
(418)