【Amazon Connect+Lex】 ListPickerのタイトルをコンタクト属性で動的に設定する

# はじめに
Amazon Connectのフローではユーザーに選択肢を提示する際に、`Get customer input` ブロックのListPicker機能を利用できます。ListPickerを使うと、タイトル、サブタイトル、選択肢をリスト形式で表示することができます。
本記事では、ListPickerのタイトル（content > title）部分にコンタクト属性を使用して動的な値を設定する方法を記載します。動的に値を設定する事でインタラクティブで状況に応じたチャットフローを作成できます。


# ゴール

下記画像の赤枠に部分（ListPicker のcontent > title 部分）に、セッション属性から取得した動的な値が表示されることを、Connectのテストチャットで確認します。
図の「カテゴリ1」のように、`数字` の部分が動的に変更される仕組みを実装します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/fe91ec3e-15d7-acaf-0b9e-d3540d607777.png)



# 対象の方
- ListPicker のcontent > title 部分に動的な値を設定したい方
- Conncetのフローのテストチャットをやりたい方


# 作成するもの
- Amazon Connectのフロー：1つ
- Amazon Lex：1つ


# 本記事で書かない事
Connectのインスタンスの作成方法

:::note warn
Amazon Connectのインスタンスは作成済みであることを想定しています。
:::

# 1.Amazon Lex の作成
Connectのフローにおいて `Get customer input` ブロックで使用するLexを作成します。
本記事ではLex Botは次のようにインテント（Intent name）とサンプル発話（Sample utterances）を設定しておきます。

| Intent name | Sample utterances |
|--------|--------|
| category1 | カテゴリ1 |
| category2 | カテゴリ2 |
| category3 | カテゴリ3 |

マネジメントコンソールでの入力イメージは下記の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/4fcb1796-9190-fe5f-728f-a0cd1c08433c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/28b6519f-bfb9-0dd3-6aba-6e1dd73e47a6.png)

設定出来たら `Save Intent` を押下し、botをビルドしておきます。

# 2. Amazon Connectのフロー作成

## 2.1 ConnectのインスタンスにLexを追加

フローでLex Botを使用できるように設定します。
問い合わせフロー > Amazon Lex から上記で作成したLex BotをConnectのインスタンスに追加しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/4eb8caaf-94ac-6273-fcd2-2b99b4312706.png)

## 2.2 フローの作成

次の図のような簡単なフローを作成します。
正常に進めば 開始⇒①⇒②⇒③⇒④⇒⑤⇒切断 の流れで進んでいきます。

▼ Connectのフロー図

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/92ed8fc2-a4d6-0a4e-8487-9feb01f3949f.png)


上記フローで使用しているブロックは下記の通りです。

```
①：コンタクト属性の設定（言語設定）
②：コンタクト属性の設定（セッション属性を設定）
③：プロンプトの再生（こんにちは）
④：顧客の入力を取得する（カテゴリを表示3つ表示）
⑤：プロンプトの再生（成功）
```
:::note warn

**言語設定について**

本記事のように`顧客の入力を取得する` ブロックでLexと紐づけてユーザ入力を取得する場合、`コンタクト属性の設定` ブロックで図のように設定しないと、`顧客の入力を取得する` ブロックで入力を受け付けた際にエラーに落ちたので注意してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/cbdc054b-5334-6cd1-aaec-55da116b2e93.png)

エラーの調査はCloudWatchのログから追えます。
言語設定をしない場合のエラーは下記の通りでした。

```json:log
{
    "Results": "Error",
     ～～～
    "ErrorDetails": {
        "ErrorCode": "ResourceNotFoundException",
        "Message": "Service returned error code ResourceNotFoundException (Service: LexRuntimeV2, Status Code: 404～～～"
    }
}
```

参考：https://repost.aws/questions/QUn9bLLnclQxmD_DMBgfB9_Q/amazon-connect-error-using-lex-as-customer-input#ANi8beR-L4SQSJz8z5bQJdcA

:::



## リストピッカー（ListPicker）の設定値について

本記事の `顧客の入力を取得する` ブロックでは次のようにリストピッカーを設定しています。

```json:テキスト読み上げまたはチャットテキスト > 手動で設定 
{
   "templateType": "ListPicker",
   "version": "1.0",
   "data": {
      "content": {
         "title": "カテゴリ$.Attributes.set_category を選んでください",
         "subtitle": "",
         "elements": [
            { "title": "カテゴリ1" },
            { "title": "カテゴリ2" },
            { "title": "カテゴリ3" }
         ]
      }
   }
}
```

データの構造は下記のドキュメントが参考になります。

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/interactive-messages.html


上記では `$.Attributes.set_category` のようにセッション属性の値をListPickerのcontent > title に設定しており、動的に値が入るようにしています。

属性の設定周りについては下記のドキュメントが参考になります。

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/connect-attrib-list.html#user-defined-attributes

:::note warn

**content > title のセッション属性の設定について**

下記のようにコンタクト属性の名前の後ろに半角スペースを入れておかないと、チャットを開始した際に動的に値が入らないので注意してください。

```
×："title": "カテゴリ$.Attributes.set_categoryを選んでください",
〇："title": "カテゴリ$.Attributes.set_category を選んでください",
```

×の場合、テストチャットすると下記のようになってしまいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/edfe90cc-da85-6bf2-32d9-fcf2f43a7a9d.png)

:::


# 3.テストチャットしてみる

ここまでできたらフローを保存＋公開してマネジメントコンソールのからテストチャットしてみます。
Connectの管理者ワークスペース > チャットをテスト > テスト設定 をクリック。
フローを選択して `適用` ボタンを押下するとフローのテストチャットができます。

実際にテストチャットしてみると、想定通りの挙動になっている事が確認できました。

![connect-test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/422bf567-dce3-52a3-a143-07d42a1bc2c8.gif)




**セッション属性の設定について**

`上記ではコンタクト属性の設定` ブロックで（②）ListPickerで使用する値を設定しましたが、このブロックでなくても次の図のようにテスト設定　＞問い合わせ属性で同じように属性の設定ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/1db7162b-55ac-fdc5-43d2-0886ce37a728.png)

コンタクト属性の設定ブロックを削除し、次の属性で試してみます。

```:テスト設定 > 問い合わせ属性
{"set_category":"2"}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/007a2569-33c6-3cfc-a316-d31f04119975.png)


ListPickerの属性部分に、テスト設定で入力した `2` が入っており、動的に値が入る事を確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/2c7230a8-4fb7-47c7-7730-f5bcf231e33a.png)


# 4.参考

- https://repost.aws/questions/QUn9bLLnclQxmD_DMBgfB9_Q/amazon-connect-error-using-lex-as-customer-input
- https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/connect-attrib-list.html#user-defined-attributes
- https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/interactive-messages.html