Python AWS LambdaでLINE BOTを動作させる方法

今回はPythonを使ってLINE Botを作る方法についての記事です。
とりあえず受け取ったメッセージを返すだけのBOTを作成しました。
AWS Lambda上でLineからメッセージを受け取り、処理を返すようなイメージです。
chaliceを使うとAWS上の環境を自動で構築してくれるので便利でした。

LINE Botの作成

まずはLINE Bot APIを作成していきます。
Line Developersにログインしましょう。



コンソールをクリックして進んで行きます。



プロダクトMesaging API と進んで行きます。



今すぐはじめようをクリックします。



BOTの詳細を入力する画面に遷移します。
適当に入力していきましょう。
チャネル名はテストチャネルとしました。




入力が終わったら、下にある作成ボタンをクリックします。

シークレット、アクセストークンの取得

これでLINE Botができました。
次にチャネルシークレットとアクセストークンをメモしておきましょう。



チャネルシークレットはチャネル基本設定タブにあります。
アクセストークンはMessaging API設定タブの下の方にいきますと…



このようになっていますので、発行をしてメモしておきます。

標準応答をオフにする

次に標準応答をオフにしておきましょう。
オンになっているとBotにメッセージを飛ばした際に「メッセージありがとうございます!…」というようなメッセージが毎回入ってくるので、少し鬱陶しいです。

Messaging APIタブで応答メッセージ、編集と進みます。



詳細設定の応答メッセージをオフにします。

これで取り急ぎのBOT側の設定は終わりです。

Chaliceプロジェクトを開始する

次にPythonコードを記述していきます。
適当なディレクトリにbotディレクトリを作り仮想環境をアクティベートします。

mkdir bot
cd bot
python -m venv myvenv
myvenv\scripts\activate


次に必要なライブラリをpip installします。

pip install chalice line-bot-sdk python-dotenv


以下のコマンドでchaliceプロジェクトを開始します。

chalice new-project line_bot


すると自動でファイルが作成されます。


requirements.txtの編集

まずrequirements.txtを編集していきましょう。
ここに依存ライブラリを書いておくことで、AWS Lambdaにデプロイ時に必要ライブラリを集めてくれます。

python-dotenv~=0.19.2
line-bot-sdk~=2.1.0


.envファイルの作成

次に.envファイルを作成し、中身を以下のようにします。

LINE_CHANNEL_SECRET=メモしたチャネルシークレット
LINE_CHANNEL_ACCESS_TOKEN=メモしたチャネルアクセストークン


先ほどメモしたチャネルシークレットとアクセストークンを貼り付けます。
今回はgitにはpushしないですが、.gitignoreにも.envファイルを忘れずに追記しておきましょう。

.chalice/deployments/
.chalice/venv/
.env


app.pyの編集

次にapp.pyを編集していきます。
ここでLINE APIからメッセージを受け取ってメッセージを返す処理を記述します。

import os
import logging
from chalice import Chalice
from chalice import BadRequestError

from linebot import LineBotApi, WebhookHandler
from linebot.models import MessageEvent, TextMessage, TextSendMessage

from dotenv import load_dotenv

load_dotenv()
logger = logging.getLogger()
app = Chalice(app_name='line_bot')
handler = WebhookHandler(os.environ.get('LINE_CHANNEL_SECRET'))
line_bot_api = LineBotApi(os.environ.get('LINE_CHANNEL_ACCESS_TOKEN'))


@app.route('/callback', methods=['POST'])
def callback():
    try:
        request = app.current_request

        # get X-Line-Signature header value
        signature = request.headers['x-Line-Signature']

        # get request body as text
        body = request.raw_body.decode('utf8')

        # handle webhook body
        handler.handle(body, signature)
    except Exception as err:
        logger.exception(err)
        raise BadRequestError('Invalid signature. Please check your channel access token/channel secret.')

    return 'OK'


@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    """おうむ返しする処理"""
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=event.message.text))


config.jsonの編集

次に.chaliceディレクトリのconfig.jsonを以下のようにします。

{
  "version": "2.0",
  "app_name": "line_bot",
  "stages": {
    "dev": {
      "api_gateway_stage": "api",
      "environment_variables": {
        "LINE_CHANNEL_SECRET": "メモしたシークレット",
        "LINE_CHANNEL_ACCESS_TOKEN": "メモしたアクセストークン"
      }
    }
  }
}


AWS Lambdaにデプロイする

これで準備は完了しました。
あとはAWS Lambdaにchalice deploy コマンドでデプロイするだけです。

作成したline_botディレクトリに移動するようにします。
移動しないでコマンドを叩くとエラーになります。

chalice deploy
>>>
FileNotFoundError: [Errno 2] No such file or directory: 'C:...\\bot\\.chalice\\config.json'


移動してからコマンドを叩きましょう。
単純なことですが、ここで結構時間を消費してしまいました。

cd line_bot
chalice deploy


すると、以下のようにメッセージが返ります。

Creating deployment package.
Reusing existing deployment package.
Creating IAM role: line_bot-dev
Creating lambda function: line_bot-dev
Creating Rest API
Resources deployed:
  - Lambda ARN: arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxxxx:function:line_bot-dev
  - Rest API URL: https://xxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/api/


ちなみにこのURLにアクセスすると

{"message":"Missing Authentication Token"}

と表示されますが、特にエラーは起きていません。

その他、認証エラーが起きる場合

認証情報ファイルがない場合はデプロイ時に以下のようなエラーでます。

botocore.exceptions.NoCredentialsError: Unable to locate credentials


公式のこの辺りの記事を参考にして、IAMユーザーを作って認証情報ファイルを作成すればうまくいくと思います。


私はAWSに慣れていないのでここでも時間を浪費しました。

Webhookを設定する。

次にWebhookをLINE API上に設定しましょう。
Messaging APIタブにWebhookの設定があるので編集を押します。



ここに先ほどデプロイした際に発行されたURLにcallbackを足して入力します。

https://xxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/api/callback




検証を押して成功が返ってくれば動いています。

実際にbotを動かしてみる

次にスマホからbotを動かしてみましょう。
Lineアプリの友達を追加より、Messaging APIタブのQRコードを読み取って作成したbotを追加します。



試しに柴田聡子さんのラッキーカラーの歌詞を飛ばしてみました。
ちゃんとおうむ返しをしてくれていますね。

参考

TOPページ