概要
- line-bot-sdk-pythonを利用したオウム返しをDocker + Herokuで構築したのでその備忘録
主に参考にしたページ
https://devcenter.heroku.com/articles/container-registry-and-runtime
※ アカウントの取得やアクセスキーの取得は終わっているものとします(たくさんのページが見つかるのでここでは割愛)
Dockerにlinebot用のサーバ環境を構築
通常のHerokuへのデプロイだと、requirement.txtとかprocfileとかもろもろプッシュするのだと思うが、自分がDockerで環境を作れればそれを利用するほうが楽だろうという考えでDockerを使った環境構築を行う。
フォルダ構成
linebot
│ .dockerignore
│ Dockerfile.heroku
│
└─app
│ bot.py
FROM kyobad/miniconda3-alpine:latest
MAINTAINER K.Kato
RUN pip install --upgrade pip \
&& conda install -y flask \
&& pip install flask gunicorn line-bot-sdk \
&& adduser -D botter \
&& mkdir /home/botter/app
USER botter
COPY ./app /home/botter/app
WORKDIR /home/botter/app
CMD gunicorn -b 0.0.0.0:$PORT bot:app --log-file=-
###公式SDKのコピペです###
from flask import Flask, request, abort
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.exceptions import (
InvalidSignatureError
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
app = Flask(__name__)
line_bot_api = LineBotApi('YOUR_CHANNEL_ACCESS_TOKEN')
handler = WebhookHandler('YOUR_CHANNEL_SECRET')
@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:
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()
Dockerfileでは、自分が使用する環境を構築しています。自由に変えられるが、ポートだけは$PORT
としないとHeroku側で認識されないので注意
デプロイ方法
Herokuにアプリケーションを作成する
https://www.heroku.com/home
自分の作成したアプリケーション名は覚えておく(cliを使ったアプリケーション生成でもOK)
DockerイメージをBuildする
ここからはcliで作業をしていく
まずは、heroku container:login
でレジストリにログインする
次に、docker -f Dockerfile.heroku build
でイメージを作成する。イメージ名は後で変えることになるので自由につけてよし
HerokuにPushしてデプロイ
イメージを作成した後に、HerokuにPushするためにイメージ名を書き換える
docker tag <image> registry.heroku.com/<app>/<process-type>
ここでの<app>
はherokuでのアプリケーション名、<process-type>
はwebとしておけばOK
そして、docker push registry.heroku.com/<app>/<process-type>
これで、指定のURLでコンテナが立ち上がる!便利!だけどこれではまだ動かない
環境変数の設定
アクセスキーやシークレットキーをコードにベタ打ちはさすがにしないので、herokuのcliを使って設定する
heroku config:set ACCESS_TOKEN=hogehoge --app appname
といった具合に、コンソールから環境変数を設定してあげる。
ここまで終わるとオウム返しが完成しているはず