はじめに
line-bot-sdk-pythonを使用したlambdaでのBOT作成の記事が見当たらなかったので作成。
オウム返しBOTの作成を目標にします。
AWS超初心者なのでまずいところはコメントお願いいたします。
環境
- Windows10
- Python3.6
①作業用ディレクトリ作成
lambdaでライブラリを使用するには、ファイルを一括でzipでまとめてアップロードする必要があるため、lambdaにアップロードしやすいようにフォルダを作成します。
とりあえずC\:Users\ユーザー名\Documents\aws\parrot
の中に作成することとします。
②ライブラリ導入
作業フォルダに移動
cd C\:Users\ユーザー名\Documents\aws\parrot
-tオプションをつけることでインストール先を指定しライブラリをインストール。
python -m pip install line-bot-sdk -t .
③lambdaで使用する関数を作成
いっぱいファルダが出来上がっていると思いますが、C\\:Users\ユーザー名\Documents\aws\parrot
の中にlambdaで使う関数をlambda_function.py
という名前で作成しましょう。
中身はこんなかんじ。
import os
import sys
from linebot import (
LineBotApi, WebhookHandler
)
from linebot.models import (
MessageEvent, TextMessage, TextSendMessage,
)
from linebot.exceptions import (
LineBotApiError, InvalidSignatureError
)
import logging
logger = logging.getLogger()
logger.setLevel(logging.ERROR)
channel_secret = os.getenv('LINE_CHANNEL_SECRET', None)
channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', None)
if channel_secret is None:
logger.error('Specify LINE_CHANNEL_SECRET as environment variable.')
sys.exit(1)
if channel_access_token is None:
logger.error('Specify LINE_CHANNEL_ACCESS_TOKEN as environment variable.')
sys.exit(1)
line_bot_api = LineBotApi(channel_access_token)
handler = WebhookHandler(channel_secret)
def lambda_handler(event, context):
if "x-line-signature" in event["headers"]:
signature = event["headers"]["x-line-signature"]
elif "X-Line-Signature" in event["headers"]:
signature = event["headers"]["X-Line-Signature"]
body = event["body"]
ok_json = {"isBase64Encoded": False,
"statusCode": 200,
"headers": {},
"body": ""}
error_json = {"isBase64Encoded": False,
"statusCode": 500,
"headers": {},
"body": "Error"}
@handler.add(MessageEvent, message=TextMessage)
def message(line_event):
text = line_event.message.text
line_bot_api.reply_message(line_event.reply_token, TextSendMessage(text=text))
try:
handler.handle(body, signature)
except LineBotApiError as e:
logger.error("Got exception from LINE Messaging API: %s\n" % e.message)
for m in e.error.details:
logger.error(" %s: %s" % (m.property, m.message))
return error_json
except InvalidSignatureError:
return error_json
return ok_json
注意点として、@handler.add(MessageEvent, message=TextMessage)
をhandler.handle(body, signature)
より上に書かないとそんな関数みあたらねーってことで失敗するので気をつけましょう。
2/5変更
コメントより @Aki_fujita さんの報告があったので調べてみました。
https://developers.line.biz/ja/news/2021/01/18/reminder-update-webhook-client-and-root-certificate/#header-field-name-2
LINE側でのヘッダーフィールド名に関する取り扱いが少し変更されていたようです。
参考資料を読んでみるとHTTP/2での制約でフィールド名が小文字しか使えなくなったことが原因みたいです。
こちらの昔作ったアプリなどは問題なく動作しているので一律変更が加えられてるわけではなさそうですが、LINE側の発表の通り"X-Line-Signature"でも"x-line-signature"でも対応可能なように書き換えました。
動作確認できていないので動かなかったらすいません...
変更点終了
④ZIPにまとめる
作業フォルダ内のファイルを全選択してzipにまとめましょう。
こんな感じで全選択してzipに圧縮してしまいます。
⑤awsでlambdaを作成
awsコンソールを開き、lambdaの場所へ移動しましょう。そしてこんな感じでlambdaを作成します。
ロールは特に必要な権限がないため、何も追加しません。
次に進んだらコードをアップロードします。
コードエントリタイプをZIPファイルをアップロードに変更し、さきほど作成したzipファイルをアップロードします。
つぎに環境変数へアクセストークンなどを設定します。
LINE Developersのサイトでボット用LINEアカウントを作成し、
- アクセストークン再発行
- Webhookを利用する
- 自動応答メッセージを利用しない
このへんをやっちゃいましょう。WebhookURLは次の章で設定します。
そこで表示されているチャンネルシークレットとアクセストークンをlambdaの環境変数へコピペし、保存を押しましょう。
lambdaの作業はおしまい。
⑥AWS API Gatewayを設定する
LINEからのWebhookを受け取るAPIGatewayを設定します。
AWSのサービスからAPI Gatewayを選択しAPIの作成を選びましょう。
次に表示される画面で、メソッドリクエストを選択し、以下の画像のように設定しましょう。
このURLをLINE DevelopersにてWebhook URLとして設定すると完成!
Demo
参考文献
https://qiita.com/Hironsan/items/0eb5578f3321c72637b4
https://qiita.com/hiyuzawa/items/10e7bf2f6ad5d1c7fc9c
https://qiita.com/_mogaming/items/2bd83204e212e35b2c6c