以前、Amazon ConnectとAmazon Lex V2を組み合わせた自動注文受付Botを実装した記事をポストしました。
今回は、Lex部分の実装は変更せず、LINEにをユーザーインターフェイスとした機能を実装してみました。
概要
LINE Messaging APIを利用し、Amazon Lexとの会話形式ショッピング連携機能を実装します。
構成
今回のターゲットは図中1、2のLINE側とのインターフェイス部分となります。
3、4部分はLex とLexの動的応答部分で、前回の記事と同一になります。
Lambda関数はPython 3.9で記述します。
構築手順
Lambda関数で使うLayer作成
シンプルに実装するため、公式 Python SDKを利用します。
モジュールをzipします。
$ pip install line-bot-sdk -t python/ $ zip -r python_layer.zip python/
zipファイルをアップロードし、 SabawaShopBotLayer
を作成しました。
Lambda関数作成
Python3.9を指定し、新規Lambda関数 SabawaShopLineBot
を作成します。
コードは下記のように記述しました。SDKを利用した上に、短く記述するようにハショっていますが、それにしてもコンパクトではないでしょうか。
import os import boto3 from linebot import LineBotApi, WebhookHandler from linebot.models import MessageEvent, TextMessage, TextSendMessage lex_client = boto3.client('lexv2-runtime') line_bot_api = LineBotApi(os.environ.get('CHANNEL_ACCESS_TOKEN')) handler = WebhookHandler(os.environ.get('CHANNEL_SECRET')) def lambda_handler(event, context): handler.handle( event['body'], event['headers']['x-line-signature']) return {'statusCode': 200, 'body': 'OK'} @handler.add(MessageEvent, message=TextMessage) def handle_text_message(event: MessageEvent): # LINEから受け取ったテキストをLexへ認識させる response = lex_client.recognize_text( botId=os.environ.get('LEX_BOT_ID'), botAliasId=os.environ.get('LEX_BOT_ALIAS_ID'), localeId=os.environ.get('LEX_BOT_LOCALE_ID'), sessionId=event.source.user_id, text=event.message.text) # Lexからの応答テキストをLINEへポストする for message in response['messages']: line_bot_api.reply_message( event.reply_token, TextSendMessage(text=message['content']))
Layerを指定
先の手順で作成したLayerも指定しておきます。
API Gateway構成
LINEからHTTP通信を受けるためのAPI Gatewayを構成します。
「HTTP API」タイプを選択して新規APIを作成します。
/SabawaShopLineBot
へPOSTリクエストが来たら作成したLambda関数を実行する、という内容になります。
LINE チャネル作成
LINE Developerログインして新規チャネルを作成しました。
[Messaging API設定] タブの [Webhook URL] へ上記API GatewayのエンドポイントURLを指定します。
今回の手順の場合は https://abcdefg.execute-api.ap-northeast-1.amazonaws.com/SabawaShopLineBot
のような文字列になるはずです。
チャネルシークレット、チャネルアクセストークンを確認
[チャネル基本設定] タブの [チャネルシークレット]、および、[Messaging API設定] タブの [チャネルアクセストークン(長期)] をコピーしておきます。
Lambda関数の設定
先の手順で作成したLambda関数 SabawaShopLineBot
へパラメータを設定します。
キー | 内容 |
---|---|
CHANNEL_SECRET | LINEチャネル設定の [チャネルシークレット] を指定します |
CHANNEL_ACCESS_TOKEN | LINEチャネル設定の [チャネルアクセストークン(長期)] を指定します |
LEX_BOT_ID | Amazon Lexの [BOT ID] を指定します |
LEX_BOT_ALIAS_ID | 上記Lex Bot内の[エイリアスID] を指定します |
LEX_BOT_LOCALE_ID | 上記Lex Botエイリアス内の言語を示すIDを指定します。日本語の場合は ja_JP です |
Lambda実行ロールの設定
LambdaからLexBotを実行できるよう、実行ロールへ権限を設定します。
AmazonLexRunBotsOnly
ポリシーを追加アタッチしました。
設定確認
LINE側のコンソールページ、 [Messaging API設定] タブからWebhookの疎通確認ができます。
動作確認
構築したLINEチャネルはLINE公式アカウント(ボット)となるので、手元のスマホでQRコードを読み取り、友達追加して動作を確認します。
テキストベースで注文受付動作を確認できました。
まとめ
Amazon Connectと連携するために構築したLex Botですが、ごく簡単なLINE向けのユーザーインターフェイスを作成、接続するだけで再利用することができました。
Amazon Lexで構築したBot部分は共通とし、インターフェイスチャネルを増やしていくという、シンプルでとても分かりやすいアプローチができそうです。
ご参考になれば幸いです。