shine-Notes

ゆるふわ思考ダンプ

シンプルなFlaskアプリをGoogle App Engineで稼働させる

サマリ

モチベーション

今年はGoogle CloudのFree Tierを色々使ってみよう!という思いがあり、前から所謂サーバレス系のサービスを動かしてみたかった。とはいえ以下の記事を読むまで、Cloud FunctionとCloud RunとAppEngineの違いも元々良く分かっていなかった。

cloud.google.com

どうもサーバレスと言っても基本はWebアプリを載せることが前提のサービスが多いらしい(後で考えるとherokuやpython anywhereもそうだなと気づいた)、という事に思い至り、まずはFlaskで簡易なアプリを作り(前エントリ)、そのまま一番お作法等が簡単そうなApp Engineにアプリを載せてみることにした。

実装結果

ざっくりこんな感じ。F2インスタンスなので1日14時間以上稼働させると、おそらくFree Tierの範囲を超えてしまうので、普段はApp Engineのサービスごと停止している。

f:id:shinebalance:20200812161712p:plain:w300 f:id:shinebalance:20200812162027p:plain:w200 github.com

以降は実装のざっくりとした手順と詰まりどころについて記載する。

実装手順(と詰まりどころ)

gunicornを通す

Webの作法には明るくないのだが、パブリック環境で動かす場合はちゃんとしたWSGIを建てるべきとは聞いていたので、一番簡単そうなgunicornを間に挟むことにした。なるほど簡単。コマンドを見るに、単なるPythonの実行プロセスではなく、Webサーバのプロセスとして名前をつけて管理させることでロードバランシング等をやりやすいようにしているのかな、というのはなんとなく分かった。

blog.hirokiky.org

  • pipenvで環境を作っていたので、ローカルでテストする場合は以下手順
python3 -m pipenv shell
gunicorn -b :$8080 main:app

Google App Engnineの利用手順

次にApp Engineの作法をざっくり確認する。大まかな流れはHello worldチュートリアルを動かしておけば理解できた。

cloud.google.com

ざっくりした理解としては、app.ymlにきちんと設定を書いて、自身のGoogle Cloudアカウントにプロジェクトを作成&ローカルPCにもSDK導入済みであればDeployできるらしい、というのはわかった。加えて今回は前エントリに引き続き、実際にFlaskアプリをGAEにデプロイされた方のBlogも参考にした。

  • 結局今回もめちゃくちゃお世話になりました nishipy.com

app.ymlを書く-->F1インスタンスではメモリが足りなかった

というわけでapp deployである。まずはインスタンスは節約したいし…と思って、下記の設定でDeployした。

# app.yaml
runtime: python37
instance_class: F1

entrypoint: gunicorn -b :$PORT main:app

無事ターミナル上で見るとDeployはできたのだが、何度アクセスしてもサイトにつながらない。途方に暮れてコンソール内のログディレクトリを見たところ……メモリ不足だった。泣く泣くF2インスタンスを明示的に指定したら動いた。

ファイルはtmpディレクトリにしか出力できない

無事トップページが出てきたので、早速生成する……が、ローカルでは動いていたgeneratorが動かない。これもあーでもないこーでもないと試行錯誤してログを見たところ、どうもファイルの書き込み権限で失敗している。あ、もしかして、と気づく。

cloud.google.com

この時点でjpgファイルはstaticディレクトリ参加に書き込みに行く構成にしていたが、そもそも一時ファイルは/tmp/参加にしか書き込めないのであった。仕方ないのでmain.pyを書き換えて対応した。(Cloud Storageに書き込みに行く形でも解決できるのは分かっていたが、文字通り一時的な画像ファイルを生成するだけなので、なるべくAppEngine内で完結させてしまいたかった)

以上を踏まえて完成である。

疑問や振り返りなど

多少はApp Engine特有の作法への対応もあったが、終わってみれば大体1日で対応できるものだったし、なかなかの手軽さだと感じた。またデプロイ後に気づいたのだが、デプロイしたコードのバージョン管理やデバッグ機能など、結構デプロイしたあとのサポート機能が充実しているのである。試しに新しいバージョンをデプロイして、様子を見て導線を変えるなんて事もできるらしい。

App Engine の概要  |  Python 3 の App Engine スタンダード環境  |  Google Cloud

サーバレスがなんぼのもんじゃい、と思っていたが、ここまでマネージドサービスとして行き届いているのはなかなか魅力的だと感じた。というか薄々分かっていたのだが、この辺り「サーバレスなのでOSの管理要りません」とかではなく、「とにかく素早くリリースできる」ことのほうがメリットなのだなぁと改めて思うしきり(Dockerなんかもそうなのだが、オンプレ脳でどこが置き換わるのかばかり考えていると真の価値を見過ごしがち)

なかなか楽しかった。また何か作ったときはApp Engineを利用してみたい(といいつつCloud Runも気になってるが…)

以上