imple is Best

Heroku に Flask で作った Web アプリをデプロイする

この記事は投稿から 3 年以上経過しています。
最新の情報は各種公式ドキュメント等をご覧下さい。

最近 Flask で Web API っぽいのを作ってるんですが、いい感じにできてきたので Heroku で公開しようかな、なんてことを考えています。

Heroku は Discord Bot をホスティングするときに使ってましたが、Web アプリは恐らくはじめてですし Flask というフレームワークで Heroku は初の試みなので簡単なデモアプリを作ってホスティングしてみました。

環境

pipenv を使って開発環境を管理しています。Pipfile は以下の通りです。

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
flask = "*"
gunicorn = "*"

[requires]
python_version = "3.8"

Python は 3.8.0、Flask は 1.1.1 でやってます。2019/11/08 現在、Heroku は Python 3.8.0 をフルサポートしていませんが、なんか上げたら動いたので 3.8.0 でやっていきます。

ソースコード

中身はルートにアクセスしたら Hello World と表示するだけのとてもシンプルなものです。

import os

from flask import Flask


app = Flask(__name__)


@app.route('/')
def hello():
    return 'Hello World'


if __name__ == '__main__':
    app.run(port=os.environ.get('PORT', 5000))

Heroku に上げる準備

Flask のアプリ(といいうか Python 製の Web アプリ)を Heroku で動かすには WSGI と呼ばれるインターフェイスが必要です。今回は gunicorn というものを使います。なのでまずは gunicorn をインストールします。(さっきの Pipfile にはインストール後の Pipfile です。)

$ pipenv install guincorn

念の為 gunicorn で Flask アプリが動くかを確認してみます。gunicorn は gunicorn [OPTIONS] APP_MODULE で動作します。APP_MODULE は大体 $(MODULE_NAME):$(VARIABLE_NAME) で指定するようです。なので今回の場合は以下のコマンドで動くはずです。

$ gunicorn server:app
[2019-11-08 15:49:37 +0900] [93932] [INFO] Starting gunicorn 19.9.0
[2019-11-08 15:49:37 +0900] [93932] [INFO] Listening at: http://127.0.0.1:8000 (93932)
[2019-11-08 15:49:37 +0900] [93932] [INFO] Using worker: sync
/Users/developer/.local/share/virtualenvs/Flask_Heroku_Test-LqQPIm6h/lib/python3.8/os.py:1021: RuntimeWarning: line buffering (buffering=1) isn't supported in binary mode, the default buffer size will be used
  return io.open(fd, *args, **kwargs)
[2019-11-08 15:49:37 +0900] [93934] [INFO] Booting worker with pid: 93934

動きました。あとはこのコマンドを実行してくれと Heroku に教えるだけです。

Procfile

Heroku に起動コマンドを伝える方法が Procfile。公式ドキュメントは こちら にあります。

Procfile のフォーマットは <process type>: <command>。Process Type は web、Command はさっきの通り gunicorn server:app です。なので今回の場合、 Procfile はこんな感じになります。

web: gunicorn server:app --log-file -

最後の --log-file - をつけることでログがコンソールで表示されるので heroku logs などでも Flask のログが確認できるようです。

あとはいつも通りに

あとは git でよしなにして heroku へ push しましょう。必須ではありませんが runtime.txtpython-3.8.0 と書いておくといいかも知れません。これで Flask アプリを Heroku にあげることができました、やったね。