3-4. ボット用Lambda関数の追加

このセクションでは、ボットに動的な動きを与えるためにLambda関数と連携させていきます。AWS Lambda 関数を定義し、それをボットに関連付けて、Lex が Lambda を呼び出して入力データで何らかのアクションを実行できるようにします。実際のシナリオでは、バックエンドシステムに接続してユーザーの残高を調べることになりますが、このハンズオンでは Lambda コードは単にランダムな値を返します。

LexボットとLambdaの連携

Lex V2 では、ボットは言語ごとに単一の Lambda 関数に紐付きます。このLambda関数は、下記の2つのタイプの Lex インタラクションをサポートできる必要があります。

  1. Initialization/Validation - Lambda関数は会話の度に呼び出され、スロットデータ値を初期化、検証、または上書きすることができます
  2. Fulfillment - Lambda関数は全てのスロットが確定し、全ての確認メッセージがOKだった場合に呼び出されます。このタイミングでLambdaがインテントの結果を返すことができます。

Lambda関数は、各インテントが必要とするロジックを処理できる必要があります。またLambda関数は、多くのパッケージ化されたコードファイルで構成できるため、Lexから見るとLambda側には共有エントリポイントだけがあります。これはディスパッチャ関数であり、入力パラメータに基づいて複数の関数呼び出しをルーティングするように実装されています。実際に各インテントのインタラクションを処理するコードは別々のソースファイルに分離することもできます。

このワークショップでは、Lex と Lambda の間のインターフェイスの詳細については説明しないため、提供されたコードをそのまま使用して下さい。

Lex が Lambda 関数を呼び出すたびに、ボットがセッションについて現在知っているすべての値が連携されます。これには、引き出されたすべてのスロット値、現在のユーザー発話、現在引き出されているインテントとスロット、およびいくつかの以前のインテントトリガーからの情報などが含まれます。 Lambda が返す値によって、スロット値を上書きしたり、引き出される次のスロットを変更したり、インテントのフルフィルメントを指定することができます。

Lambdaの作成

このワークショップでは、単純なPythonファイルを使用します。次のリンクからコードをダウンロードして下さい(Pythonファイルがブラウザ上に表示される場合は右クリックして保存して下さい)。

AWS コンソール内で AWS Lambda サービスに移動します。コンソールの検索バーに Lambda と入力し、[Lambda] を選択します。

Lambda ページで [関数の作成] ボタンをクリックして、関数の作成を開始します。

「関数の作成」画面で以下のデータを入力し、画面右下の [関数の作成] ボタンをクリックします。

  • 一から作成 を選択
  • 関数名: CardBotJapanese
  • ランタイム: Python 3.8 (3.8が選択枝にない場合は最新バージョンを選択)

このワークショップでは必要ありませんが、オプションについて説明しておきます。

  • [アクセス権限] 特定の IAM ロールを Lambda 関数に関連付けることができます。これにより、どの AWS サービスを操作できるかが制限されます。今回はどのサービスとも連携しないため、関数に実行するのに十分な権限を与えるデフォルトのロールを使用します。
  • [詳細設定] コード署名設定と一部の高度なネットワーク設定を設定できますが、このワークショップではこれらは不要です。

右下の [関数の作成] ボタンを押します。

関数が作成されたら、[コードソース] セクションまでスクロールし、左側のファイルブラウザで lambda_function.py を ダブルクリック します。 ダウンロードしたPythonコードをテキストエディタで開き、ウィンドウ内のサンプルコードの上にコピーしたファイル全体を貼り付けます(デフォルトのサンプルコードを上書きする)。

Windows環境でダウンロードしたソースコードを開く場合は、メモ帳で開いて下さい。また、ブラウザ上で直接ファイルを開くと日本語が文字化けしている可能性がありますので注意して下さい。

[Deploy] ボタンをクリックすると、Lambda 関数が Lex によって呼び出される準備は完了です。

新規に関数を作成した場合やカスタマイズした場合には、この画面上でLambda関数をテストを実施することも可能です。

ボットの言語構成でLambada関数を指定する

次に、Lex コンソール画面に戻ります。コンソールの検索バーにLexと入力し、サービスを選択し、Lex コンソールのV2に入っていることを確認します。

作成済みのボットが見つからない場合は、V2ではなくV1コンソールを参照している可能性があrます。

Lambda 関数は言語ごとに定義します。具体的にはボットの エイリアス(これはバージョンに紐付ける別名)とLambda関数を紐付けます。現在開発中のボットのバージョンはドラフトなので、このバージョンと紐付けます。

Lex コンソールで CardBot をクリックし、左側のメニューで [エイリアス] リンクを選択すると、ボットに定義されたエイリアスのリストが表示されます。

ここから、デフォルトで作成されている TestBotalias (DRAFTバージョンに対してデフォルトで割り当てられているエイリアス) をクリックして詳細画面を開き、言語からJapanese(Japan)を選択します。

ダイアログが表示されるので、下記の値を入力して下さい

  • ソース: CardBotJapanese
  • Lambda関数のバージョン: $Latest

[保存ボタン] をクリックします。

Lambda では、関数のバージョンが管理され、特定のバージョンに対してエイリアスを紐付けることができます。Lex ボットは、Lambdaの特定のバージョンやエイリアスのいずれにも関連付けることができますが、$LATEST バージョンを使用することで、開発環境では常に最新バージョンの関数を使用することができます。これは多くの場合、最も簡単な作業方法です。

インテントで Lambda コードフックを有効にする

Lambda 関数が CheckBalance インテントで動作する準備ができましたが、最後にインテントとLambda 関数を紐付ける必要があります。

左端のメニューで [ボットのバージョン] をクリックして ドラフトバージョン を選択します。

左側のメニューで [インテント] リンクをクリックしてインテントを一覧表示し、CheckBalanceの詳細画面を開きます。

Lambda 関数を CheckBalance インテントにのみ関連付けます。画面の下部までスクロールして、このインテントに対して設定された [コードフック] セクションまでスクロールします。

今回はインテントの結果としてカード残高を返すためにLambda関数を使用しますので、「フルフィルメントにLambda関数を使用」チェックボックスだけをクリックしてください。

ボットの動作を確認

[インテントを保存][構築] をクリックして再度モデルをビルドします。[テスト] ボタンを押してボットの動作を確認します。このバージョンでは生年月日を答えた後にカードの未払い残高を回答しています。

左メニューの「Back to intents list」をクリックしてメインメニューに戻ります。