かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Heroku に Flask のアプリをデプロイしたメモ

ちょいちょいと試せる localhost でないサーバーで検証したいことがあったので Flask のアプリを Heroku にデプロイしてみました。(DB無し)

Flask アプリの準備

# 仮想環境を作成
$ python -m venv .venv
# 仮想環境を実行
$ source .venv/bin/activate
# Flask をインストール
(.venv) pip install Flask

app.py

from flask import Flask

@app.route('/')
def hello_heroku():
  return "Hello flask APP!"

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

Gunicorn の設定を作成する

Heroku に Python アプリをデプロイするには Gunicorn を使う必要があるっぽい

The Django and Flask web frameworks feature convenient built-in web servers, but these blocking servers only process a single request at a time. If you deploy with one of these servers on Heroku, your dyno resources will be underutilized and your application will feel unresponsive.

Gunicorn is a pure-Python HTTP server for WSGI applications. It allows you to run any Python application concurrently by running multiple Python processes within a single dyno. It provides a perfect balance of performance, flexibility, and configuration simplicity.
cf. Deploying Python Applications with Gunicorn | Heroku Dev Center


DjangoやFlaskなどのWebフレームワークを使っているとき、開発時にもサーバーを起動して動作確認をしていると思います。 例えばDjangoであれば python manage.py runserver というコマンドでサーバーを起動できます。 なぜこのサーバーを使わずにgunicornを使うのでしょうか?
理由は簡単に言うと、動作が速いからです。

gunicorn やuWSGI、 waitress といったWSGIサーバーは速く、 安定して動作することを考慮して作られています (何をもって「速い」と言うのかは別の機会に詳しく解説できればと思います)。
なので、一般に公開して多くの人に使ってもらうサーバーなどでは、専用のWSGIサーバーを使うほうが良いです。 「本番環境ではgunicornなど別のWSGIサーバーを使う」と、プラクティスとして覚えておくと良いでしょう。
cf. gunicornでPython製Webアプリケーションを動作させよう(DjangoとFlask) - Make組ブログ

Gunicornのインストール と設定の作成

# gunicorn のインストール
(.venv) pip install gunicorn
# 設定ファイルの作成
(.venv) touch Procfile

Procfile

web: gunicorn app:app 

Heroku へのデプロイ

1. Flask App の依存パッケージのファイルを作成

# Flask App の依存パッケージのファイルを作成
(.venv) pip freeze > requirements.txt
# 仮想環境を終了
(.venv) deactivate

2. git リポジトリの準備

git を使って Heroku にデプロイするので、ここまでのアプリを git 管理下に置きます。

$ git init
# .venv 以外をコミット
$ git add app.py Procfile requirements.txt
$ git commit -m init

3. Heroku CLI のインストール

$ brew install heroku/brew/heroku

4. Heroku にアプリを作成してデプロイする

$ heroku login
# heroku にアプリを作成
$ heroku create <APP_NAME>
Creating ⬢ <APP_NAME>... done
https://<APP_NAME>.herokuapp.com/ | https://git.heroku.com/<APP_NAME>.git
# heroku 側のリポジトリを追加
$ heroku git:remote -a <APP_NAME>
set git remote heroku to https://git.heroku.com/<APP_NAME>
# デプロイ
$ git push heroku main
# アプリの確認
$ heroku open

これで Flask アプリを Hreoku にデプロイすることができました!
めっちゃ簡単〜 ₍ ᐢ. ̫ .ᐢ ₎

4. GitHub に push したら Heroku にデプロイされるようにする

毎回コマンドでデプロイするのはちょい面倒なので GitHub の main リポジトリが更新されたら自動で Heroku にデプロイさるようにします。

まずは Heroku の管理画面にアクセスして、作成したアプリのコンソールを開きます。
f:id:kikiki-kiki:20211017021024p:plain
メニューから「Deploy」を選択

f:id:kikiki-kiki:20211017021122p:plain

  1. Deploy method で GitHub を選択
  2. 接続したいリポジトリを検索
  3. 接続するリポジトリの右にある「Connect」ボタンをクリック

f:id:kikiki-kiki:20211017021417p:plain
Automatic Deploy の欄で、変更をトリガーに Deploy させるブランチを選択して「Enable Automatic Deploys」をクリック

これで GitHub との接続が完了して、選択しブランチに push したり PR をマージしたりで変更があると自動的に Heroku にデプロイされるようになりました!
簡単で助かる〜 ₍ ᐢ. ̫ .ᐢ ₎

所管

Heroku あまり使ってなかったのですが、めちゃめちゃ楽に Deploy できるので実験用途などで積極的に使っていこうと思いました。
おわり。


[参考]

これはフラスコ