この手順はJAWS DAYS 2021ハンズオンセッションにて使うハンズオン手順です。この手順は公開しますので復習や社内展開して自由に使って頂いて構いません。

作業前提

以下が実施できているかを確認しましょう

ハンズオンルール

資材ダウンロード

AWS LambdaのソースなどをPCにダウンロードします。

こちらのgithubにアクセスしZIPファイルをダウンロードしてください。

ZIPファイルを解凍します。以下の3つのzipファイルを本日のハンズオンで使いますので、3つのZIPファイルが存在することを確認してください。

aws-handson-nlp-linebot
|   README.md
|
+---Lambda
|       bot.zip
|       push.zip
|       startTranscribe.zip
|
\---linebot
        jaws_beginner_icon.png
        memo.txt
        richmenu_jawsdays2021_hondson-line.png

memo.txtはパラメータなどをメモする際に任意で使用してください。

完成イメージです。LINEのMessaging APIを使い、英語のテキストメッセージを送信すると日本語訳してメッセージを返し、日本語の音声メッセージを送信すると文字起こしした日本語メッセージを返すLINEボットです。

LINEボットの設定を行います。構成図だとここです。

LINE Developersへのアカウント登録

LINEボットを作成するためには、LINE Developersへの登録が必要となります。

LINE Developersコンソールで[コンソール]もしくは[ログイン]をクリックします。

認証画面で[LINEアカウントでログイン]をクリック

LINEアカウントのメールアドレスとパスワードを入力し、ログインしてください。

以下のような二要素認証のための4桁の数字が表示されるため

LINEアプリで4桁を入力してください。

ログイン後にアカウント情報の登録画面になりますので任意の開発者名とメールアドレスを入力し、[アカウントを作成]をクリック

登録できました。

LINEボットを開発するために開発者の所属となるプロバイダーを作成します。[新規プロバイダー]ボタンをクリック

個人開発者ですのでプロバイダー名は本名でもニックネームでも任意で設定してください。

作成できました。今日からあなたもLINE Developerの一員です!

LINEボットアカウントを作成します。以下の画面で[Messaging API]をクリックします。

チャネル作成画面で、必要項目を埋めて[作成]ボタンをクリックします。

チャネルの種類

Messaging API

プロバイダー

(作成したプロバイダー)

チャネルアイコン

任意

*1度設定すると1時間変更不可

*素材フォルダにサンプルのJAWSアイコン素材あり

チャネル名

任意

*一度設定したら7日間変更不可

チャネル説明

任意

*埋まっていればOK

大業種

通信・情報・メディア

*ハンズオン用なので適当でOK

小業種

その他通信・情報・メディア

*ハンズオン用なので適当でOK

メールアドレス

(LINEアカウントメールアドレス)

プライバシーポリシー

空欄

サービス利用規約

空欄

[作成]ボタンをクリックします。

[同意する]をクリック

チャネル作成できました。

リッチメニュー設定

LINEのリッチメニューを設定します。[LINE official Account manager]をクリックします。

LINE Official Account Manager(公式アカウントからの配信などを行うコンソール)に画面遷移しますので、ホームタブをクリックし

左ペインからトークルーム管理>リッチメニューをクリックします。

リッチメニュー設定画面で[作成]をクリックします。

以下のようにリッチメニューを設定し

コンテンツ設定項目で[テンプレートを選択]をクリック

小項目の以下を選択して[選択]

[テンプレートを選択]をクリックし

素材フォルダのrichmenu_jawsdays2021_hondson-line.pngをアップロードします。

アクション項目で以下を設定します。

タイプ

URL

アクションラベル

A

リンク

https://jawsug-bgnr.connpass.com/

connpass

B

リンク

https://forms.gle/BysejaSa3uv2Zzqm7

アンケート

リッチメニューが設定できました。

APIの設定を行うため、別タブで操作していたLINE Developer コンソールの画面に戻ります。チャネル基本設定タブのチャネルIDとチャネルシークレットをメモしておきます。

チャネルIDは以下。

チャネルシークレットは以下。

Messaging API設定タブをクリックし

チャネルアクセストークンの[発行]をクリックし、表示されるトークンをメモします。

ここまでメモできていれば完了です。

ここをつなげます。

LINEのQRコードでボットと友達になります。

リッチメニューが設置されていてウェルカムメッセージが来たら成功です。

この時点だと任意のメッセージを送ってもLINE側の応答機能でソーリー文が返されます。

次からはAWS側の構築を行います。

AWSマネジメントコンソールにログインし、東京リージョンに変更します。

Lambda用のロールを作成します。IAMサービス画面でロールメニューをクリックします。

AWS > Lambdaをクリックします。

LambdaからAmazon Translate, Amazon S3 , Amazon CloudWatch Logs, Amazon Transcribeにアクセスが必要です。以下のポリシーを選択し、[次のステップ:タグ]をクリックします。

TranslateFullAccess

AmazonS3FullAccess

CloudWatchLogsFullAccess

AmazonTranscribeFullAcces

タグの追加(オプション)画面は設定不要ですのでそのまま[次のステップ:確認]をクリックします。

ロールを作成します。ロール名にhandson-20210320-role-linebotのとおりで設定して[ロールの作成]をクリックしてください。

作成できました。

LINEボットから送信される音声を保存するS3バケットとAmazon Transcribeの結果を保存するS3バケットを作成します。

AWSマネジメントコンソールでAmazon S3にアクセスし、[バケットを作成する]をクリックしてください。

下記のバケット名を入力し作成をクリックしてください。バケット名は、全リージョンでユニークな名前である必要がありますので、利用しているAWSアカウントIDをバケット名に追加する形でご用意ください。利用しているAWSアカウントIDはマネジメントコンソール右上部のタブから確認ができます。

S3バケット名

用途

transcribe-input-${AWSAccountID}

音声データを保存

transcribe-output-${AWSAccountID}

Amazon Transcribeの結果を保存

${AWSAccountID}はAWSマネジメントコンソール右上部のタブから確認できます。

バケット名を入力し以下以外の設定は変更せずに[バケットを作成]をクリックします。

再度[バケットを作成]をクリックしてバケット名transcribe-output-${AWSAccountID}を作成してください。

このバケット名をメモしておきます。

S3の完成です。

LINEボット用のLambda関数作成

サービス名検索バーでlambdaを検索し、Lambdaサービス画面で[関数の作成]をクリックします。

以下の設定を行い[関数の作成]をクリックします。

関数名

handson-20210320-linebot

ランタイム

Node.js 12.x

実行ロールの選択または作成

既存のロールを使用する

既存のロール

handson-20210320-role-linebot

作成できました。

コードタブのアップロード元として[.zipファイル]を選択し

資材のbot.zipをアップロードして[保存]をクリックします。

コードソースがアップロードできました。

設定タブ>一般設定>編集

外部APIコールによる音声データの取得、S3への保存処理があるため、タイムアウトを10秒に伸ばします。

環境変数メニューをクリックし

環境変数にメモしてあったチャネルシークレット、チャネルアクセストークン、音声ファイル保存先S3バケット名を以下のとおり追加します。

変数名

説明

CHANNEL_SECRET

チャネルシークレット

CHANNEL_ACCESS_TOKEN

チャネルアクセストークン(ロングターム)

TRANSCRIBE_BUCKET_NAME

音声ファイル保存先S3バケット名、transcribe-input-${AWSAccountID}

Amazon Transcribe用Lambda関数作成

ここを作成します。

先ほどと同様でLambda関数を新規作成します。

基本設定は以下とし、[関数の作成]をクリック

関数名

handson-20210320-startTranscribe

ランタイム

Node.js 12.x

実行ロールの選択または作成

既存のロールを使用する

既存のロール

handson-20210320-role-linebot

zipファイルとしてstartTranscribe.zipをアップロードします。

先ほどと同様にタイムアウトを10秒に伸ばして

Amazon Transcribeで文字起こしした結果を保存する先の環境変数として以下を追加します。

変数名

説明

OUTPUT_BUCKET

文字起こしした結果保存先S3バケット名、transcribe-output-${AWSAccountID}

Lambda関数の音声データ格納トリガー設定

今の状態だとLINEボットのLambda関数でS3バケットに保存された音声データが格納されますが、その後続のLambda関数が動がない状態になっていますので、トリガーを設定してつなげます。

handson-20210320-startTranscribe関数の[トリガーを追加]をクリックします。

プルダウンからS3を選択して

以下を設定します。

バケット

transcribe-input-${AWSAccountID}

イベントタイプ

すべてのオブジェクト作成イベント

プレフィックス - オプション

(空)

サフィックス - オプション

.mp4

再帰呼び出しの✔を付けて[追加]をクリック

追加されました。これでS3に音声データが格納されたことをきっかけとして文字起こしのためのLambda関数が動くようになります。

プッシュ通知用Lambda関数作成

先ほどと同じ流れでLambda関数を新規作成します。Lambda関数画面で[関数の作成]をクリック

関数名

handson-20210320-push

ランタイム

Node.js 12.x

実行ロールの選択または作成

既存のロールを使用する

既存のロール

handson-20210320-role-linebot

zipファイルをアップロード

push.zipをアップロードして保存

一般設定でタイムアウトを10秒に伸ばして

Amazon Transcribeで文字起こしした結果をLINEに通知するために必要となる環境変数として以下を追加します。

変数名

説明

CHANNEL_ACCESS_TOKEN

チャネルアクセストークン

関数が作成できました。

Lambda関数の文字起こし格納トリガー設定

先ほどと同様で、トリガーを設定してつなげます。

handson-20210320-push関数の[トリガーを追加]をクリックします。

以下のトリガー追加設定を行い[追加]をクリックします。

バケット

transcribe-output-${AWSAccountID}

イベントタイプ

すべてのオブジェクト作成イベント

プレフィックス - オプション

(空)

サフィックス - オプション

.json

トリガーが追加できました。

Amazon API Gateway作成

APIを作ります。

マネジメントコンソールの検索バーでAPI Gatewayを検索しHTTP APIの[構築]ボタンをクリックします。

[統合を追加]をクリック

統合タイプはLambdaを選択します。

以下の設定を行い[次へ]をクリックします。

ルートを設定します。LINEのWebhookはHTTP POSTで受ける必要がありますのでメソッドをPOST、リソースパスは/webhookとしてください。統合ターゲットは自動で選択されているはずですのでそのまま次へをクリックしてください。

ステージ設定はデフォルトのままで[次へ]をクリック

設定を確認し[作成]をクリック

このAPIをLINEからPOSTすればLINEボットLambda関数が動くことになりますね。

Lambda関数との統合を行ったので、LINEボットのLambda関数のトリガーにも追加されてます。

LINEからメッセージ投稿されたらAPI Gatewayで作ったURIがPOSTされるようにLINE DeveloperのWebhookの設定を行います。

LINE DevelopersコンソールのボットチャンネルMessagins API設定タブの中にある

Webhook URLの[編集]ボタンをクリックし

先ほどメモしたAPI GatewayのURL+/webhookをWebhook URLとして入力し[更新]します。

[検証]ボタンをクリックし

成功と表示されることを確認します。

Webhookの利用をONにします。

これでAWSとつながった状態になりました。今の状態ではLINE公式アカウントが自動応答する状態になっているため無効化する設定を行います。LINE DeveloperコンソールのMessaging APIタブ内にある応答メッセージ項目の[編集]をクリックすると

LINE 公式アカウントマネージャーコンソール画面が別タブで開きます。応答設定の応答メッセージをオフに変更しましょう。

ボットの動作確認をしましょう。

まず、英語のメッセージを送ってみます。AWSエバンジェリストJeff Barrのブログなどからコピーペーストして英語の文章を送信して日本語訳のメッセージが返ってくるかを試してください。

次に、LINEの音声入力ボタンから音声メッセージを送ると文字起こしされてテキストメッセージが返ってくるかの確認を行います。

「JAWS DAYS 2021」など固有名詞だとうまく文字起こしできない場合があるのは仕方ないですが、色々入力してAWSのAI精度を試してみてください。

動作確認でうまくいかない場合、以下の内容を確認してみてください。

うまく動作しない場合やハンズオンの時間があまったらCloudWatchでどういうログがどこに出力されるのかを確認しましょう。

Lambdaのログ

AWSマネジメントコンソールの検索バーでCloudWatchを入力して検索し、ログをクリックします。

[View log groups]をクリックします。

3つのLambda関数が表示されるので知りたいログのLambda関数をクリックし

任意のログストリームのリンクをクリックするとログイベント画面でログを確認することができます。

Lambdaサービス画面からでも同じ情報に辿りつくこともできますので目的や観点によって使い分けて調べることができます。

使われ続けないかぎりは課金が発生するものではないですが、課金が発生しないようリソースの削除を行いましょう。今日は残しておき、復習してからでも構いません。

Lambda関数削除

1つずつLambda関数を選択して削除します。

今回作成したLambda関数3つともなくなればOKです。

S3バケット削除

S3は、バケット内が空の状態でないと削除できませんのでバケットを選択し[空にする]をクリックしてデータ削除します。

[完全に削除する]と入力して[空にする]をクリックすることでデータが削除できます。

バケットが空になりました。

次に、バケットを削除します。

これを繰り返して2つのバケットを削除することができます。

API Gateway削除

API Gatewayを選択して[Delete]をクリックします。

IAM削除

IAMロールを削除します。

削除されたら完了です。

LINEチャネル削除

LINE 公式アカウントは課金されることはありませんが、後始末として削除しておきましょう。LINE Developersコンソールのプロバイダー画面で[チャネルの削除]ボタンをクリックします。

ポップアップを確認し、[LINE Official Account Managerを表示]をクリックします。

LINE Official Account Managerコンソールのアカウント削除画面が別タブで開きますので内容の同意の上で[アカウントを削除]をクリックします。

もし、LINEプロバイダーまで削除したい場合にはDevelopersコンソールのプロバイダー設定から[削除]を行うことができます。

まとめ

What you'll learn

手を動かしながら学ぶことを楽しんでもらえたら幸いです。