7
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LineBot + Heroku + Docker + Pythonで環境立ち上げ

Last updated at Posted at 2017-02-20

概要

  • line-bot-sdk-pythonを利用したオウム返しをDocker + Herokuで構築したのでその備忘録

主に参考にしたページ

https://devcenter.heroku.com/articles/container-registry-and-runtime

https://github.com/line/line-bot-sdk-python

※ アカウントの取得やアクセスキーの取得は終わっているものとします(たくさんのページが見つかるのでここでは割愛)

Dockerにlinebot用のサーバ環境を構築

通常のHerokuへのデプロイだと、requirement.txtとかprocfileとかもろもろプッシュするのだと思うが、自分がDockerで環境を作れればそれを利用するほうが楽だろうという考えでDockerを使った環境構築を行う。

フォルダ構成

linebot
│ .dockerignore
│ Dockerfile.heroku

└─app
│ bot.py

Dockerfile.heroku
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=-
bot.py
###公式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
といった具合に、コンソールから環境変数を設定してあげる。

ここまで終わるとオウム返しが完成しているはず

7
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?