HerokuにLINE botをデプロイする手順
Python等で作成したLINE botを本番環境で動かしたいと思ったらサーバーにデプロイする必要があります。一番最初に選択肢にあがるのがHerokuだと思います。Herokuは2022年11月に無料枠を廃止したことで利用者はだいぶ減少したと言われていますが、それでも比較的安価なサーバーとして利用しやすいのも事実です。
また世界中のユーザーが利用しているので、フォーラムが充実しており、なにか問題があったときに比較的解決しやすいのもメリットです。
今回はそんなHerokuサーバーに自作したLINE botをデプロイ(アップロード)する手順を解説します。
LINE botの作り方については以下の記事で解説しておりますので、気になる方はどうぞ。
requirements.txtおよびProcfileの作成
この記事では以下のようなLINE botのソースコードがすでに完成している前提で進めていきます。
# app.py
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
from scrape import get_url
app = Flask(__name__)
line_bot_api = LineBotApi('アクセストークン')
handler = WebhookHandler('チャネルシークレット')
@app.route("/callback", methods=['POST'])
def callback():
# get X-Line-Signature header value
signature = request.headers['X-Line-Signature']
# get request body as text
body = request.get_data(as_text=True)
app.logger.info("Request body: " + body)
# handle webhook body
try:
handler.handle(body, signature)
except InvalidSignatureError:
print("Invalid signature. Please check your channel access token/channel secret.")
abort(400)
return 'OK'
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
line_bot_api.reply_message(
event.reply_token,
TextSendMessage(text=event.message.text))
if __name__ == "__main__":
app.run()
Pythonで作られたLINE botは基本的にFlaskを利用しているので、HerokuでFlaskを実行させるためのgunicornというライブラリをインストールします。
pip install gunicorn
これまでにインストールしたライブラリをHerokuにデプロイした際にもインストールするように伝えるためのrequirements.txtを作成します。
pip freeze > requirements.txt
aiohttp==3.8.3
aiosignal==1.3.1
async-generator==1.10
async-timeout==4.0.2
attrs==22.2.0
certifi==2022.12.7
cffi==1.15.1
charset-normalizer==2.1.1
...
...
上記のようなファイルが出来上がるはずです。
続いて、app.py(メインのソースコード)と同じ階層にProcfileという名前のファイルを新規作成してください。

ProcfileはHerokuにデプロイした際に最初に実行する内容を指示するためのファイルです。先程インストールしたgunicornを用いてapp.pyを実行させたいので、以下のコードをコピペしてください。
web: gunicorn app:app
半角スペースが全角になっていたり、改行が入ったりするとエラーが発生するので、上のコードをそのまま貼り付けてください。
以上で下準備は完了です。
Herokuでの作業
https://www.heroku.comよりサインアップを済ませ、ログインしてください。
ログイン後、ダッシュボードにいくとNEW > Create new appというボタンがありますので、クリックして新規アプリを作成してください。

なんでも良いのでアプリ名を決めて、Create appをクリックします。名前は固有のものないといけないので、availableと表示されていることを確認してください。regionに関してはUnited Statesのままで問題ありません。

The Heroku CLI | Heroku Dev CenterよりHeroku CLIをダウンロード・インストールしてください。

macの場合は上記コマンド、Windowsの場合はインストーラーをダウンロードして実行します。
heroku --version
インストールが完了したら上記コマンドを実行し、下画像のようにバージョンが表示されれば正常にインストールされています。

インストールしたらターミナルからherokuにログインします。下記のコマンドを実行してください。
heroku login
実行後、なんでもいいのでキーを押すように求められるので、エンターキーなどを押すとログインするためにブラウザが起動しますので、通常通りログインしてください。
ログインが完了するとターミナルにログインが完了した旨が表示されるので、cdコマンドを利用してapp.pyがあるディレクトリまで移動してください。
cd my-project/
移動したら下記のコマンドで下記コマンドを順番に実行してください。
git init
heroku git:remote -a your-app-name
your-app-nameは最初に登録したアプリ名に置き換えてください。私の場合は以下のようになります。
heroku git:remote -a my-first-line-bot
引き続き以下のコマンドを実行してください。
git add .
git commit -am "make it better"
git push heroku master
以上でデプロイは完了です。
デプロイが完了したらLINE botのwebhook URLの設定を変更するのを忘れないようにしましょう。

問題なくデプロイが完了していればherokuのアプリ管理画面に以下のように表示されているはずです。

デフォルトではデプロイが完了しただけではアプリは実行されていないのでconfigure DynosをクリックしてDynosをONにしましょう。

以上で完了です。お疲れ様でした。
LINE botが正常に動くか確認してみてください。動かない場合はWebhook URLの変更を忘れているか、DynosがONになっていない可能性があります。
デプロイ時にエラーが出ている人はrequirements.txtかProcfileが正しく作成できていない可能性が高いですのでもう一度確認してみてください。
まとめ
HerokuにFlaskアプリ(LINE botなど)をデプロイするには
- gunicornのインストール
- requirements.txtの作成
- Procfileの作成
をしてから、サーバーにアップロードします。最初はそれぞれのファイルやコマンドがなんの意味を持つのか知る必要はありません。とりあえず必要な手順として従いましょう。Webアプリを開発していくうちに嫌でもコマンドの意味やそれぞれのファイルの意味が自然と身についていくはずです。
今回はLINE botのデプロイというタイトルで解説しましたが、基本的に一連の流れはどのようなアプリでも変わりません。Procfileの中身や必要なライブラリが少し変わる程度です。