AWS サーバーレスを使った翻訳 LINE Bot の製作

APIGateway,AWS,Lambda,LINE_Bot

概要

  • 学習のため、初めての LINE Bot 製作を行いました。AWS サーバーレスを使った和英翻訳を行うLINE Bot となります。AWS を利用したLINE Bot に興味がある方の入門として活用頂けたらありがたいです。

 

LINE Bot のシステム構成

  • 以下、今回製作したLINE Bot のシステム構成となります。
  • AWS サーバーレスには、Amazon API Gateway, AWS Lambda, Amazon Translate を使用しています。

 

 

完成のLINEアプリイメージ

  • 今回の記事を通して製作したLINE Bot の完成したイメージを先にお見せします。
  • 「こんにちわ」と送信した場合、LINE Bot から自動応答メッセージと和英翻訳された「Hello」が応答として返ります。

 

 

翻訳 LINE Bot の製作

LINE Developers にログインしてアカウント, Provider を作成する

  • LINE のMessaging APIを始めるにあたって、事前準備として、LINE Developers のコンソールにログインして、アカウント, Provider を作成します。
  • 詳しい手順は、以下のドキュメントを参照下さい。

 

  • 以下に、私が行った手順を説明します。
  • LINE Developersコンソールにログインします。私の場合は、「LINEアカウントでログイン」を選択しました。

 

  • LINE Developersコンソールに初めてログインした場合は、下記の画面が表示されます。

 

 

  • 開発者アカウントとして、名前、メールアドレスを入力します。使用許諾をチェックします。
  • 「Create my account」を押します。

 

 

  • 開発者アカウントが登録できました。

 

  • 次に、以下のホーム画面が表示されます。「Create new provider」を選択します。(プロバイダーを作成済みの場合は、表示されません)

 

  • Provider の名前を入力します。「Create」を押します。(プロバイダはアプリを提供する組織を差し、個人や企業の名前を入力します)

 

  • Provider が作成されました。

 

 

LINE Developers にMessaging APIチャネルを準備する

  • LINE のMessaging APIを始めるにあたって、チャネルを作成する必要があります。以下チャネルの説明です。(LINE Developers のドキュメントより引用)

チャネルは、Messaging APIやLINEログインといったLINEプラットフォームが提供する機能を、プロバイダーが開発するサービスで利用するための通信路です。LINEプラットフォームを利用するには、まずチャネルを作成します。このチャネルに紐づくアクセストークンなどの情報を利用することで、Messaging APIの各機能を使えます。

 

  • 先ほどの続きで、Provider のChannelsタブから「Create Message API Channnel」を選択します。

 

  • Channnel type に「Messaging API」、Provider に先ほど作成した名前、Company or owner’s country or region に「Japan」を選択、任意で Channnel icon を指定します。

 

  • 続けて、Channnel name、Channnel description を指定、Category、Subcategory を選択、Email address を指定します。なお、Channnel name には、"LINE" などの予約語は使用できない様です。

 

  • 最後に使用許諾をチェックして、「Create」を押します。

 

  • 以下の画面が表示されます。「OK」を押します。

 

  • Channnel が作成されました。

 

Messaging APIチャネルのシークレット、アクセストークンを発行

  • 作成されたChannnel にて、「Basic settings」タブを選択します。「Channel secret 」をコピーし、後で使用するためシークレットを控えておきます。

  • 続けて、「Messaging API」タブを選択します。
  • 「Channel access token」の「Issue」を押します。

 

  • トークンが発行されました。後で使用するためトークンを控えておきます。

 

AWS サーバーレスによる Api構築

  • ここからは、AWSを利用したサーバーレスによるApi 構築です。先ず、Lambda 関数を作成します。
  • 事前に、Amazon Translate を使用するためのIAM ロールを作成しておきましょう。
    • AWS管理ポリシーのTranslateFullAccess,AWSLambdaBasicExecutionRole の2つを割り当てれば問題ありません。
  • 関数名にlambda-translate 、ランタイムにPython 3.9 を使用しています。
  • コードは下記を使用します。
    • コンソールにコードを貼り付けた場合は、ライブラリ linebot が使用できないため、下記のエラーが出力されます。
      • [ERROR] Runtime.ImportModuleError: Unable to import module 'lambda_function’: No module named 'linebot’
    • こちらに紹介した方法を参考に、開発環境でデプロイパッケージを作成します。デプロイパッケージのファイル名は、lambda_function.zip とします。
import os
import json
import logging
import boto3

from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import FollowEvent, MessageEvent, TextMessage, TextSendMessage, StickerMessage, StickerSendMessage

logger = logging.getLogger()
logger.setLevel(logging.INFO)

handler = WebhookHandler(os.environ.get('LINE_CHANNEL_SECRET'))
linebot = LineBotApi(os.environ.get('LINE_CHANNEL_ACCESS_TOKEN'))

translate = boto3.client('translate')

def lambda_handler(event, context):
    logger.info(event)
    line_events_message_text = json.loads(event['body'])['events'][0]['message']['text']
    logger.info(line_events_message_text)

    response = translate.translate_text(
        Text=line_events_message_text,
        SourceLanguageCode="auto",
        TargetLanguageCode="en"
    )

    translated_result = response.get('TranslatedText')
    logger.info(translated_result)

    linebot.reply_message(
        json.loads(event['body'])['events'][0]['replyToken'],
        TextSendMessage(text=translated_result)
    )

    return {
        'statusCode': 200
    }

 

  • デプロイパッケージ(lambda_function.zip)を使用して、コードをデプロイします。

 

  • API Gateway を作成します。/translate リソースPOSTメソッドを作成します。先ほど作成したLambda 関数を登録します。「Lambda プロキシ統合の使用」は有効とします。
  • Lambda、API Gateway 構築の詳しい手順は、こちらの記事を参照ください。

 

  • Api をデプロイします。ステージ名をdev としています。
  • デプロイされたApi のエンドポイントを確認します。

 

 

  • 最後に、Lambda の環境変数をセットします。
  • 環境変数 LINE_CHANNEL_SECRET および LINE_CHANNEL_ACCESS_TOKEN に、以前の手順で準備したMessaging APIチャネルのシークレット、アクセストークンを使用します。

 

  • これでApi の構築が完了しました。

 

Messaging APIチャネルに Webhook URL を登録する

  • 作成されたChannnel にて、「Messaging API」を選択します。Webhook URL にて、「Edit」を押します。
  • デプロイしたAPI のエンドポイントを登録します。エンドポイントの最後に、/translate のパスを付けることを忘れずに。
  • Use webhook を有効に設定します。

 

 

LINE アカウントに自動応答メッセージを設定する

  • LINE Official Account Manager (以下URL) にログインします。

 

  • 自動応答メッセージを作成します。以下は、サンプルです。

 

 

QRコードを読み取りLINE Bot を友達追加する

  • 最後に、LINEアプリにLINE Bot を友だち追加します。LINE Developers に戻り、Channnel の「Messaging API」を選択します。
  • LINEアプリの「友だち追加」からQRコードを使用し、LINE Bot を友だち追加します。

 

LINE Bot をテストしてみる

  • LINE Bot に日本語を入力して、動作確認を行います。
  • 無事に、和英翻訳された結果が返って来ました。

 

  • このようにAWS サーバーレスと組み合わせることで、手軽にLINE Bot を製作することができました!
  • 記事に登場するApi のエンドポイントおよび各種設定は、検証後に削除済みとなります。

 

参考資料