Amazon LexとLambdaを連携させて簡単な応答システムを作る

# はじめに
本記事ではAmazon LexとAWS Lambdaを連携させて、入力に対してLambdaがレスポンスを返す簡単なBot的なものを作ります。Lexのチャットテスト画面から入力された値をLambdaで受け取り、LambdaからLexへレスポンスを返すところまで確認します。


# ゴール
Lexのチャットテスト画面（テスト ドラフトバージョン）でテキストを入力後に、Lambdaから応答が返ってくる事を確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/6544e539-0a7e-fccb-dc5a-b42b85bd6ef8.png)


# 環境
- Python：3.12
- Lex：v2



# Lambda側の準備
Lexと連携させるLambda関数を作成します。
詳細はコメントアウトの通りです。

```python:lambda_function.py
def lambda_handler(event, context):

    # インテント名を取得
    intent_name = event['sessionState']['intent']['name']
    # スロットを取得
    slots = event['sessionState']['intent']['slots']
    # ユーザーの入力テキストを取得
    user_input = event['inputTranscript']
    # レスポンスとして返す文言を作成
    response_text = f"{user_input}について問い合わせありがとうございます。"
    
    # レスポンスを作成
    response = {
        'messages': [{'contentType': 'PlainText', 'content': response_text}],
        'sessionState': {
            'dialogAction': {
                'type': 'Close',
            },
            'intent': {
                'name': intent_name,
                'slots': slots,
                'state': 'Fulfilled'
            }
        }
    }
    
    # Lambda 関数のレスポンスを返す
    return response
```

https://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/lambda-input-format.html

https://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/lambda-response-format.html



# Lex側の準備

## 1. Botの構築
コンソール画面から Lex > ボットを作成を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/9a80166c-e8c6-9450-3bb8-02d2f7805c40.png)

今回は下記の内容で作成。
- 作成方法：「空のボットを作成します」を選択。
- ボット名：testBot
- IAM アクセス許可：「基本的な Amazon Lex 権限～～」を選択。
- 児童オンラインプライバシー保護法 (COPPA)：今回は対象外のため「いいえ」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/9d0cf93e-ca83-980f-e0da-ff47a3311486.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/137261f9-4033-6b22-0836-b7ec21f1806f.png)

ここまで設定できたら「次へ」をクリックし、「ボットに言語を追加」の画面に遷移。
「言語を選択」から「日本語」を選択して完了ボタンを選択し、LexのBotを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/f9ea8b8f-f5b9-fd28-714b-a34107d28cc4.png)


## 2. インテントの作成

サンプル発話に任意のワードを登録しておきます。
ここに登録しておいたワードがBotに入力されると、このインテントが選択されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/11bd4b6b-46dc-5d19-e00c-cdd031074692.png)

インテントが選択された際にLambdaを呼ぶように「コードフック」にチェックを入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/ce9da585-5c28-20fe-a980-cc09c6fcc6ef.png)


## 3. Lambda関数の選択

Lexから呼ぶLambdaはLex > ボット > ボット名 > エイリアス > エイリアス名 から「言語」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/0084da12-dd83-8cb0-6f90-b6bc94b46df0.png)

ソースから対象のLambdaを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/85c3587e-dfd5-b8c6-c89c-d0471539fdf8.png)

保存できたらインテントに戻り、画面右上の「Build」ボタンからBotをビルドします。少し待って正常に構築～と表示されれば成功です。

# 実行 & 結果

Lexのインテントを選択し、画面右上の「Test」ボタンから実際に値を入力し、Lambdaからのレスポンスが返ってくることを確認します。
入力する値は、先ほどインテントのサンプル発話に登録した内容のいずれかのワードを含む内容になります。
今回は「カレーの作り方」と入力してみると、レスポンスが返ってきている事が確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/886c8ae2-8c37-2e88-039e-146713cac8e6.png)

:::note info
リクエストとレスポンスの詳細について

Lexでは「テストドラフトバージョン」画面の「検査」ボタンからそれぞれJSON形式で確認可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/360f57d3-6d96-ae03-30dd-2502b1309404.png)

:::

# 参考
https://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/lambda-input-format.html

https://docs.aws.amazon.com/ja_jp/lexv2/latest/dg/lambda-response-format.html