
HerokuでPythonアプリのデプロイ
1.概要
HerokuとはPaaS(Platform as a Service)であり、Pythonアプリを公開できたりします。今回はHerokuへデプロイする方法を学びます。
2.環境構築
Herokuを使用するためには下記準備が必要となります。
【Heroku使用時の準備】
●Git・Git Bashのインストール(WIndowsユーザー)
●Gitの設定
●Herokuの登録(アカウント作成)
●Heroku CLIのインストール(Heroku CLI)
基本的には下記公式をベースに設定していきます。
2-1.Git・GitBushのインストール
Heroku CLIを使用するためにはGitが必要です。GitおよびGit Bushの設定は下記記事を参照ください。
2-2.Gitの設定
Gitを使用時にユーザー名とE-mailを登録します。
[Terminal]
git config --global user.name <username>
git config --global user.email <E-mail>
登録情報の確認は引数の部分を抜けばデータ確認できます。

2-3.Herokuの登録
Herokuより新規登録します。参考として記事を紹介しておきます。

2-4.Heroku CLIのインストール
次に Heroku CLIをインストールします。インストール完了の検証はターミナルに「heroku --version」と入力して出力を確認します。


3.Heroku CLI操作
Heroku CLIはCMDやGit Bushのような専用のアプリ(ターミナル)があるわけではなく既存のターミナルで操作可能です。今回はGitを使用するためターミナルは「Git Bush」を使用しました。
3-1.Heroku CLIへログイン:heroku login
herokuとgit コマンドを正常動作させるためHeroku CLIにログインします。"logged in as E-mail"と表示されればherokuコマンドが使用できます。
[Terminal]
heroku login

3-2.アプリの作成:heroku create
ターミナル上で「heroku create」のみでアプリを作成できます。引数無しだとアプリ名はランダムに作成されますが「heroku create <app名>」と記載すると指定した名前でアプリを作成することができます。
[Terminal]
heroku create sample-220416

【コマンド実行後のHeroku画面】

3-3.Herokuとローカルの紐づけ:heroku git: remote
Herokuに登録されたアプリとローカルPC(Herokuへデプロイしたいディレクトリ)を紐づけます。
まず初めにデプロイするフォルダをgitで初期化します。"git init"コマンドを実行して指定ディレクトリに".git"が作成されたら成功です。
[Terminal]
git init

git初期化が完了したら「heroku git:remote -a <アプリ名>」と入力することで紐づけができます。
[terminal]
heroku git:remote -a sample-220416

3-4.Python環境の用意:heroku buildpacks
[Terminal]
heroku buildpacks:set heroku/python
3-5.アプリのデプロイ
アプリの準備がすべてできたらアプリをデプロイします。デプロイはgitでpushしますがpush先は”origin"ではなく"heroku"となります。
[Terminal]
git add .
git commit -m "コメント"
git push heroku master
3-6.Pythonの対話モード:heroku run python
HerokuにデプロイしたアプリをPython対話モードで操作したい場合は下記コマンドを使用します。
[Terminal]
heroku run python

4.Herokuの機能追加:アドオン
デプロイ後のアプリに用途に応じて別の機能を追加(アドオン)することができます。なお基本的には無料で使用できる機能でも事前にクレジット登録が必要になります。
4-1.DataBase:PostgreSQL
データベースのPostgreSQLが追加可能です。追加手順は下記の通りです。
【アドオンの追加手順】
●対象アプリを選択して「Resource」タブを選択
●「Add-ons」から指定のアドオンを選択(Free枠を選定)
●「Submit Order Form」を押して登録されているか確認


4-2.定期実行:Scheduler
定期実行をしたい場合は「Heroku Scheduler」を追加します。

定期実行はブラウザのAdd-ons「Heroku Scheculer」を選択して、下記画面の「Create job」から①期間設定、②処理するコマンド(python <module>)を設定します。

5.必要ファイルの作成
デプロイするためのファイルを作成していきますが、Pythonファイル以外にHeroku用に作成する必要があるファイルがあります。
注意点としてHeroku用はファイル名を間違うとデプロイできません。
【必要ファイル】
●Pythonファイル:公開したいアプリ
【必要ファイル:Heroku用】
●Procfile:アプリの起動時に実行するコマンドを明示的に宣言
●requirements.txt:使用するPythonライブラリの一覧表
【推奨ファイル:Heroku用】
●runtime.txt(※無くても一応動きます):Pythonのバージョン
5-1.Pythonファイル(アプリ)
必要なPythonファイルを作成します。
5-2.Procfile
Procfileとはアプリの起動時に実行するコマンドを明示的に宣言するためのファイルです。作成時はメモ帳などで拡張子無しで作成できます。
[Procfile]※参考例
web: gunicorn gettingstarted.wsgi
5-3.requirements.txt
PaasのHerokuはデプロイ時に必要なPythonライブラリは存在しないためrequirements.txtを用いて必要なライブラリを指定します。Pythonの環境構築時にも利用しており詳細は下記記事に記載しております。
今回は下記の通り記載しました。一般的にversion指定をしないと将来的にエラーが出る可能性があるため、通常はすべてにversion指定します。
なおWebアプリを公開する場合、”gunicorn”はWSGIを使用するために必要なライブラリのため記載が必要になります。
[requrements.txt]
numpy
pandas
gunicorn
5-4.runtime.txt
一般的にはターミナル上で「python --version」で確認後、runtime.txtにPythonのVersionを記載します。

ただしVersion次第ではエラーになるため注意が必要です。下記は記載例ですがそのまま記載すると下図の通りエラーが出ます。
[runtime.txt]
python-3.9.7

6.実装編1:Line通知アプリ
上記をベースに下記の通りファイルを作成しました。
6-1.ファイル構成
今回のアプリのファイル構成は下記の通りです。
【ファイル構成】
●Linenotify.py:Lineへ通知するためのファイル
●Procfile:Linenofityを実行することを記載
●requirements.txt:必要なライブラリとしてrequestを記載
※runtime.txtは現在使用しているVersionだとエラーが出たため今回は作成しませんでした。

[Linenotify.py]
import requests
import json
token = 'xrRH50u8WcuHaaXtIrlKddCfDTTmpIo4p4kuacRBtzn' #APIのトークン
url = 'https://notify-api.line.me/api/notify' #APIのエンドポイント
headers = {'Authorization': 'Bearer ' + token}
payload = {'message': 'Hello, world!'} #LINEに送るメッセージ
requests.post(url, headers=headers, data=payload)
[Procfile]
web: python Linenotify.py
[requirements.txt]
requests
6-2.アプリのデプロイ
Git Bushから指定ディレクトリまでcdコマンドで移動後に下記を実行することでアプリをデプロイします。
[Terminal]
git add .
git commit -m '1st commit'
git push heroku master

成功するとLine Notifyから下記メッセージが飛びます。これはProcfileが実行->Linenotify.pyが実行されることでアプリが処理されたためです。

6-3.定期実行の設定
4章に記載の通りHeroku Schedulerを使用して定期実行ができます。今回は10minごとにLinenofity.pyを実行(Lineに通知)を設定しました。

上記設定より10minごとにLineへ通知が来ることが確認できました。
※検証用のため10minですがアプリの目的に応じて時間の設定が必要です。
7.実装編2:Webアプリの公開
※本当はWebアプリを公開したかったのですがハードルが高すぎたので将来理解してから実装します。
参考資料
あとがき
アプリのデプロイもGithub、 Deta、 Heroku、streamlit(Github) 、GCP、AWSなどいろいろあって悩む。とりあえず自分の飛び道具をたくさん持っておきたいね。
気軽にクリエイターの支援と、記事のオススメができます!