最近の投稿 Recent posts

HerokuにLINE webhookをデプロイする(heroku/line-bot-sdk/python3)

詳細

HerokuにLINE Webhookをデプロイするまで

今回は無料で使えるホスティングサービスであるHerokuにLINE Webhookをデプロイするまでの手順を備忘録的に記します。

作りたいもの

実家でデジタル難民と化している祖母が他の家族からのLINEメッセージを見れるように、↓のようなシステムを作ろうと思い立ちました。

このシステムを作るにあたり、LINEメッセージを送ると自作のAPIにデータをPOSTするようなWebhookをつくりたいです。 今回はゴールとして、まずはLINE bot(Python)に送ったメッセージをそのままLINEで返信してくるようなエコーボットをデプロイすることにします。

本記事の構成

  1. 前提(heroku/line developerのアカウント作成等)
  2. Webhookの構成
  3. line-bot-sdkについて
  4. herokuへのデプロイ手順

1. 前提

1.1. herokuのアカウント作成

herokuの利用にはアカウント作成が必要です。今回は無料枠の範疇のことしかしないので、Freeアカウントで作成します。 こちらからアカウントを作成することができます。

また、heroku CLIを使うためインストールが必要です。こちらの手順に従い、インストールしてください。

1.2. LINE Developerアカウントの作成

今回のwebhook作成に関しては、LINEbotが必要となります。LINEbotの作成にはLINE developerアカウントが必要となるため、アカウント登録をおこないます。 こちらからアカウント作成をしてください。

2. webhookの構成

今回のwebhookを作成するにあたり、ローカル上で下記のようなフォルダ構成を作成します。

*/
|__main.py              # webhookの処理を記述する
|__requirements.txt  # 使用するライブラリの一覧
|__runtime.txt          # herokuで使用する言語の諸元
|__Procfile              # herokuで実行するコマンド
|__.env                   # herokuで使用する環境変数

2.1. main.py

main.pyにはline-bot-sdkを使って行う処理を記述することになります。 詳細は3節で説明するため、ここでは説明を省きます。

2.2. requirements.txt

requirements.txtには今回使用するライブラリを記述します。これをプロジェクトフォルダに含めることで、デプロイ時に自動でライブラリをインストールしてくれます。

Flask==2.0.3
line-bot-sdk==2.2.1
requests==2.27.1

2.3. runtime.txt

runtime.txtにはherokuで使用するPythonのバージョンを記述します。その際、herokuが対応しているバージョンを選択しなければならないため、現在のherokuが何に対応しているかを確認するようにします。 今回は以下の内容を記述します。一行のみです。

python-3.9.0

2.4. Procfile

Procfileはheroku上でデプロイ時に実行するコマンドを記述します。今回はmain.pyを実行することでサーバーを立ち上げたいので、下記の内容とします。

web: python3 main.py

2.5. .env

.envファイルはherokuの環境に登録したい環境変数を記述します。main.pyなどに直接記載したくない情報(例えばline-bot-sdkのシークレットキーなど)を記述し、herokuの環境に反映します。

3. line-bot-sdkについて

今回は開発者公式が公開しているline-bot-sdkのサンプルプログラムを使用します。サイトはこちら(GitHub)から見れます。

元のサンプルプログラムはアクセストークンとシークレットキーをベタ書きしているため、この二つだけは環境変数から読み込むように変更を加えています。

from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
import os

# Flaskでwebhookを立ち上げ
app = Flask(__name__)

# アクセストークンとシークレットキーは環境変数から読み込む
YOUR_CHANNEL_ACCESS_TOKEN = os.environ["YOUR_CHANNEL_ACCESS_TOKEN"]
YOUR_CHANNEL_SECRET = os.environ["YOUR_CHANNEL_SECRET"]

line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET)

@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']

    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("invalid signatrue. please check channel info")
        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__":
    port = int(os.getenv("PORT"))
    app.run(host="0.0.0.0", port=port)

4. herokuへのデプロイに関して

ここまでのプログラムの準備ができたところで、herokuへのデプロイを行います。大まかな手順は下記の通りです。

  1. heroku上でのプロジェクト作成
  2. gitリポジトリの作成・登録
  3. heroku環境変数の反映
  4. herokuへのpush

4.1. heroku上でのプロジェクト作成

まずは、herokuの個人コンソールから「create new app」を選択し、新しいアプリケーションを作成します。

名前を選ぶように促されるので、適当な名前をつけます。「hogehoge.herokuapp.com」というURLを与えられますが、世界で一意な名前である必要があるため、適度に長い名前にしてください。

4.2. gitリポジトリの作成・登録

ローカルのプロジェクトをgitリポジトリとして登録し、herokuにpushします。

ローカルで

git init
git add *
git commit -m "first commit"

とし、まずはgitのローカルリポジトリを作成します。

次に、herokuのリモートリポを紐付けます。heroku CLIから以下を実行します。

heroku git:remote -a {自分のアプリの名前}

このままgit pushすると、環境変数を設定しないままビルドが始まってしまうので、git pushする前に.envファイルで設定した環境変数をherokuに反映します。

4.3. 環境変数の反映

heroku CLIを用いて、.envファイル内に記述した環境変数をherokuのアプリに反映します。 プロジェクトディレクトリ内でheroku config:pushを実施します。成功すると「Successfully wrote settings to Heroku!」とログが出ます。

venv) hogehoge:~/Desktop/line-webhook-app$ heroku config:push
Successfully wrote settings to Heroku!

4.4. herokuへのpush

ここまで実施できたら、git push heroku masterでheroku上のリモートリポジトリにプロジェクトをpushします。 pushが成功すると自動でビルド→デプロイが行われます。

LINE botにメッセージを送って、全く同じ内容の返事が来れば成功です。

プロジェクト内でheroku logs --tailとすると、デプロイしたアプリのログを確認することができます。 うまくLINE botが返事を返してくれなければ、このログを見てトラブルシュートを行います。

まとめ

これまでVPSをメインで使っていたので、herokuのようなPaaSを使えば無料で簡単にデプロイできるんだなと感心しました。

【資格】ネットワークスペシャリスト試験に合格しました!

詳細

合格発表から時間が空いてしまいました。2023年4月にネットワークスペシャリスト試験を受験し、合格していました。

点数は午前2:8割、午後1:6割、午後2:8割といった具合で、落ちるなら午前1かなぁと思っていたところなんとか耐えていました。

次はセキスペとAWS SAAを受けようと思います。

このサイト(www.teenytinybot.dev)の構成に関して

詳細

最近更新しておりませんでした、IMAXおじさんです。 この頃本サイトに色々機能を足していたので、そろそろ全体をまとめた構成図を作ろうと思い立ちました。

1. コンテナの構成について

本サイトはさくらVPS上にデプロイしています。 当初はUbuntu Server上のネイティブで動かしていたのですが、お仕事でDockerをよく使うこともあり途中からDockerでのデプロイに切り替えました。

各コンポーネントの基本的な構成は以下となります。

  • OS:Ubuntu 18.04
  • 仮想化:Docker
  • リバースプロキシ:Nginx 1.21.6
  • アプリバックエンド:Python3, Django 3.0
  • DB:MySQL 5.7
  • 可視化ツール:Grafana 8.3.4
  • ログ監視:Splunk 8.2.5
  • ログ転送エージェント:UniversalForwarder(@Nginxコンテナ)

また、コンテナ間の関係とデータフローは以下の通りです。

2. Djangoで提供するアプリに関して

また、Djangoでは下記のアプリを作成して公開しています。

  • 質問箱

    • Djangoで初めて作ったWEBアプリです。
    • 中の人に匿名で質問が送れます。line-bot-sdkと連携しており、質問がくるとBotからLINEで中の人に通知が来ます。
    • (最近質問が来てなくてなんか寂しいので質問募集中です)
  • 自宅の温湿度監視

    • DjangoでRESTAPIを実装し、自宅のM5StackからAPI経由で気温・湿度・気圧をサーバに上げています。
    • Grafanaで監視用ダッシュボードを作成し、公開しています。
  • 技術ブログ

    • 技術系の記事を書いていくブログページです。
    • Markdown形式が使えるよう、Djangoプラグインであるmdeditorを入れています。
    • また、コードはシンタックスハイライトが行われるよう、aceというライブラリを入れています。
    • ↓こんな感じ
  • ログ監視

    • また、自明に公開はしていませんが、Nginxのログを見ると公開サーバへの攻撃と思しきアクセスがかなり多いので、監視ツールとしてSplunkを入れています。
    • 法人利用は有償ですが、個人利用であれば制限付きで一定期間は無償利用可能なようです。

3. 今後の予定

今後は以下のことに取り組みたいな〜と考えています。

  • AWSへのデプロイ(AWSできるようになりたい...)
  • elasticsearchとsplunkの比較
  • 機械学習がバックエンドで動くWEBアプリ
  • Vue.js+Django RESTAPIで動く構成に(モダンなWEBの構成にしたい...)

【資格】応用情報技術者試験に合格しました

詳細

応用情報に合格しました。午前午後ともに8割程度取れていました。次はNWスペシャリスト頑張ります。

技術系の備忘録を書き始めます.

詳細

技術系の記事を書き始めることにしました. 検索機能,月別アーカイブ,マークダウン,シンタックスハイライト等を実装したのでなんかいい感じに見れるようになると思います. 試しにPython形式でかいたコードの見栄えを確認してみましょう.

def func(param):
    return param**2

いい感じですね.

ページ 2 / 4 (全 17 件)

About

IMAXおじさんが(主に)技術系記事を備忘録として残していくブログです.

Category

  1. Tech
  2. Daily
  3. Job
  4. Other