【Amazon Lex V2+LINE】Botによる自動注文受付実装例(LINE Messaging API)

記事タイトルとURLをコピーする

以前、Amazon ConnectとAmazon Lex V2を組み合わせた自動注文受付Botを実装した記事をポストしました。
今回は、Lex部分の実装は変更せず、LINEにをユーザーインターフェイスとした機能を実装してみました。

blog.serverworks.co.jp

概要

LINE Messaging APIを利用し、Amazon Lexとの会話形式ショッピング連携機能を実装します。

構成

今回のターゲットは図中1、2のLINE側とのインターフェイス部分となります。
3、4部分はLex とLexの動的応答部分で、前回の記事と同一になります。
Lambda関数はPython 3.9で記述します。

f:id:swx-shinsaka:20220323182645p:plain

構築手順

Lambda関数で使うLayer作成

シンプルに実装するため、公式 Python SDKを利用します。

github.com

モジュールをzipします。

$ pip install line-bot-sdk -t python/
$ zip -r python_layer.zip python/

zipファイルをアップロードし、 SabawaShopBotLayer を作成しました。

f:id:swx-shinsaka:20220323165942p:plain

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も指定しておきます。

f:id:swx-shinsaka:20220323171055p:plain

API Gateway構成

LINEからHTTP通信を受けるためのAPI Gatewayを構成します。

「HTTP API」タイプを選択して新規APIを作成します。
/SabawaShopLineBot へPOSTリクエストが来たら作成したLambda関数を実行する、という内容になります。

f:id:swx-shinsaka:20220323172043p:plain

f:id:swx-shinsaka:20220323172133p:plain

LINE チャネル作成

LINE Developerログインして新規チャネルを作成しました。

LINEログイン | LINE Developers

[Messaging API設定] タブの [Webhook URL] へ上記API GatewayのエンドポイントURLを指定します。
今回の手順の場合は https://abcdefg.execute-api.ap-northeast-1.amazonaws.com/SabawaShopLineBot のような文字列になるはずです。

f:id:swx-shinsaka:20220323172912p:plain

チャネルシークレット、チャネルアクセストークンを確認

[チャネル基本設定] タブの [チャネルシークレット]、および、[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 です

f:id:swx-shinsaka:20220323174013p:plain

Lambda実行ロールの設定

LambdaからLexBotを実行できるよう、実行ロールへ権限を設定します。
AmazonLexRunBotsOnly ポリシーを追加アタッチしました。

f:id:swx-shinsaka:20220323175442p:plain

設定確認

LINE側のコンソールページ、 [Messaging API設定] タブからWebhookの疎通確認ができます。

f:id:swx-shinsaka:20220323174939p:plain

動作確認

構築したLINEチャネルはLINE公式アカウント(ボット)となるので、手元のスマホでQRコードを読み取り、友達追加して動作を確認します。

テキストベースで注文受付動作を確認できました。

f:id:swx-shinsaka:20220323180819p:plain

まとめ

Amazon Connectと連携するために構築したLex Botですが、ごく簡単なLINE向けのユーザーインターフェイスを作成、接続するだけで再利用することができました。

Amazon Lexで構築したBot部分は共通とし、インターフェイスチャネルを増やしていくという、シンプルでとても分かりやすいアプローチができそうです。

ご参考になれば幸いです。