LoginSignup
5
6

More than 1 year has passed since last update.

Amazon Connect と、LambdaやLexとの連携方法

Last updated at Posted at 2022-01-30

はじめに

下記のような構成で、connectのシステムを構築した際、
お問い合わせフローから、LambdaやLexを使用する際のパラメータの渡し方などのまとめます。

パラメータを問い合わせ属性と呼びます。

Amazon Connectでは、顧客とのやり取りはそれぞれ問い合わせ として処理されます。やり取りには、音声通話、チャット、または Amazon Lex ボットを使用した自動的な対話があります。
各問い合わせは、特定のやり取りに固有の、いくつかのデータを保持することができます。このデータは、問い合わせ属性としてアクセスされます。
例:

  • 顧客の名前。
  • エージェントの名前
  • 電話やチャットなど、問い合わせに使用されるチャネル
  • その他

スクリーンショット 2022-01-30 18.01.56.png

Connectのお問い合わせフローにLexとLambdaを使用可能にする設定

Connectのお問い合わせフロータブから、LexとLambdaが追加できます。
スクリーンショット 2022-01-30 18.15.18.png

ConnectでのLexの連携設定

以下の2つの設定は、必須です!

1つめ

お問い合わせフローの顧客の入力を取得するから以下のように、Lexで使用するbot名インテントを選択します。

注意点として、使用したいインテントを選択したとしても、bot内のインテントは、すべて発動される可能性がありますので、1つのbotに多くのインテントを入れない方がよいです。

特に、インテントが発動するトリガー部分である発話が似ているインテントは、botごとを分けたほうがよいです。

スクリーンショット 2022-01-30 18.03.04.png

2つめ

Lexの言語が日本語の場合、connectの音声設定も合わせる必要があります。
Lex側
スクリーンショット 2022-02-19 19.14.54.png
connectの設定

  • 言語日本語
  • 音声Mizuki
  • 言語属性を設定現在選択せれている言語を属性として使用します

スクリーンショット 2022-02-17 11.25.39.png

#LexからLambdaに値を渡す
Lexで応答した情報(スロット値)をLambdaに渡すときは、以下のフローを作成します
スクリーンショット 2022-01-30 18.19.28.png

顧客の入力を取得するでLexの設定した後のフローにおいて、AWS Lambda 関数を呼び出すを使用します。
例えばLexのスロットでスロット名:ageがあった場合、Lambdaがそのageの値を受け取るためには、以下のようにします。

  • AWS Lambda関数を呼び出す
  • 属性を使用する
  • 宛先キー:任意(Lambdaで受け取る値)
  • タイプ:Lexスロット
  • 属性:age
  • タイムアウト値:8秒

スクリーンショット 2022-01-30 20.52.41.png

タイムアウト値は、必ず8秒にしましょう。
3秒だと、間に合わずタイムアウトエラーになります。

属性は、Lexのスロット名であるageを選択し、タイプは、Lexスロットを選択する必要があります。

スクリーンショット 2022-01-30 18.17.40.png

このとき、Lambdaが受け取るjsonデータは以下のものになります。
(LambdaがConnectで受け取るjsonデータのキーは、すべて同じです。)

{
  "Details": {
    "ContactData": {
      "Attributes": {},
      "Channel": "VOICE",
      "ContactId": "da689669-5a1b-48c9-bc85-4dfd31a9e416",
      "CustomerEndpoint": {
        "Address": "+09011111111",
        "Type": "TELEPHONE_NUMBER"
      },
      "CustomerId": "",
      "Description": "",
      "InitialContactId": "da689669-5a1b-48c9-bc85-4dfd31a9e416",
      "InitiationMethod": "INBOUND",
      "InstanceARN": "arn:aws~~~",
      "LanguageCode": "ja-JP",
      "MediaStreams": {
        "Customer": {
          "Audio": ""
        }
      },
      "Name": "",
      "PreviousContactId": "da689669-5a1b-48c9-bc85-4dfd31a9e416",
      "Queue": "",
      "References": {},
      "SystemEndpoint": {
        "Address": "+xxxxxxxxxx",
        "Type": "TELEPHONE_NUMBER"
      }
    },
    "Parameters": {
      "age": "20"
    }
  },
  "Name": "ContactFlowEvent"
}

"Parameters": {"age": "20"}値は、ここで受け取っていますね。

ageと20問い合わせ属性のキーと値と呼びます。

Lambdaでこの値を受け取り方は、このようになります。

Lambda(Python)
def lambda_handler(event, context):

age = event['Details']['Parameters']['age']
# age = 20
Lambda(Node.js)
const age = event.Details.Parameters.age

Lambdaで値を受け取れるか確認する方法は、上記のjsonデータをlambdaのテストイベントにペーストして、テストを実行してみるとよいでしょう。

Lambdaで発信電話番号を受け取る

connectに電話してきた発信電話番号を受け取り、lambdaで使用する場合、以下の設定で受け取れます。

  • AWS Lambda関数を呼び出す
  • 属性を使用する
  • 宛先キー:任意(Lambdaで受け取る値)
  • タイプ:システム
  • 属性:顧客電話番号

スクリーンショット 2022-01-30 20.00.51.png

{
  "Details": {
    "ContactData": {
      "Attributes": {},
      "Channel": "VOICE",
      "ContactId": "da689669-5a1b-48c9-bc85-4dfd31a9e416",
      "CustomerEndpoint": {
        "Address": "+09011111111",
        "Type": "TELEPHONE_NUMBER"
      },
           省略

属性の顧客電話番号のキーは、Addressになります。

Lambda(Python)
user_phone = event["Details"]["ContactData"]["CustomerEndpoint"]["Address"]
#user_phone = +09011111111
Lambda(Node.js)
const user_phone = event.Details.ContactData.CustomerEndpoint.Address

LambdaからLambdaに値を渡す

スクリーンショット 2022-01-30 18.38.30.png
LambdaからLambdaに値を渡すには、関数のコードにreturnが必要になります。

1つめのLambdaでreturn {"reservation": "false"}した場合、2つ目のLambdaで値を受け取るには以下の設定になります。

  • AWS Lambda関数を呼び出す
  • 属性を使用する
  • 宛先キー:任意(Lambdaで受け取る値)
  • タイプ:外部
  • 属性:reservation

スクリーンショット 2022-01-30 18.50.29.png

Lambdaの値を受け取る場合、タイプは外部になります。

2つめのLambdaで受け取るjsonデータは、Lexの時と同じです。

"Parameters": {"reservation": "true"}値は、このように受け取ります。

reservation = event['Details']['Parameters']['reservation']
# reservation = true

複数受け取る場合、以下のようにパラメータをまとめましょう

Parameters = event['Details']['Parameters']

reservation = Parameters['reservation']
age = Parameters['age']

Lambdaで受け取る値は、属性でなく、テキストの使用もできます。

スクリーンショット 2022-01-30 22.07.41.png

テキストの使用も先程と同様に値を受け取れますので、省略します。

問い合わせ属性を音声に反映

Lambdaでreturn {"age": "20"}し、その値をコンタクト属性の設定を使用し、ユーザー定義として、属性を保存します。
その属性を使用し、プロンプトの再生で音声を再生します。

スクリーンショット 2022-01-30 19.10.08.png

コンタクト属性の設定

  • 属性を使用する
  • 宛先タイプ:ユーザー定義
  • 宛先キー:任意(Lambdaで受け取る値)
  • タイプ:外部
  • 属性:age

スクリーンショット 2022-01-30 19.03.10.png

ユーザー定義したものは、jsonデータのAttributes内に入ります。

{
  "Details": {
    "ContactData": {
      "Attributes": {
        "age": "20"
      },

プロンプトのテキストの中で「$」記号を使うと、コンタクト属性に設定されている値をプロンプトに埋め込むことができます。
「$.Attributes」で参照したい属性が「ユーザー定義」属性であることを指定し、最後のピリオドに続いて「属性名」を指定します。

プロンプトの再生に以下のテキストを入れると、音声が属性の値を認識します。

スクリーンショット 2022-01-30 19.08.50.png

テキスト
お客様の年齢は、 $.Attributes.age 歳ですね。
ageが20の場合、音声
お客様の年齢は、 20歳ですね。

注意点
プロンプトのテキストに 「$.Attributes.属性」を埋め込む際、両端に半角スペースを入れないと、音声が認識せず、その箇所のみ無視されます。

テキスト
             ↓ 半角スペース        ↓ 半角スペース
お客様の年齢は、   $.Attributes.age   歳ですね。

ちなみに、ユーザー定義だけでなく、外部のタイプなども使用できます

  • タイプ:ユーザー定義:$.Attributes.[宛先キー]
  • タイプ:外部:$.External.[宛先キー]
  • タイプ:Lexのインテント名:$.Lex.[宛先キー]
  • タイプ:Lexのスロット名:$.Lex.Slots[宛先キー]

Lexの値も使用できるようです。

Amazon Lex での例
・ Amazon Lex ボットから属性を参照するには、参照する Amazon Lex ボットの一部を形式 $.Lex.[宛先キー] に含めて 、($.Lex.IntentName などとして) 使用します。
・ 顧客からの Amazon Lex ボットスロットへの入力を参照するには、$.Lex.Slots.slotName を使用します。この際、slotName はボットのスロット名と置き換えます。

Lambdaの実行結果によって、フローを分岐させる

年齢が20歳を超えているどうかでフローを分岐させたい場合があります。
Lambda返す値がreturn {"age": "20"}もしくはreturn {"age": "19"}の場合、フローを分岐させるためには、コンタクト属性を確認するの設定が必要です。

コンタクト属性を確認する

  • 確認する属性
  • 宛先タイプ:ユーザー定義
  • 属性:age
  • チェックする条件以上 20

スクリーンショット 2022-01-30 20.27.08.png
スクリーンショット 2022-01-30 20.27.52.png

ageが20以上の場合と20歳未満で分岐できました。

ちなみに、ageの属性値を外部タイプとして定義している場合$.External.ageが使えます。

スクリーンショット 2022-01-31 22.02.27.png

Lambdaの外部タイプが無効になるパターン

下記フローのように、Lambdaを連続して使用すると、1つめのLambdaの外部タイプの値は、プロンプト再生に使用できません。(値を渡せません)

スクリーンショット 2022-01-31 22.07.56.png
しかし、1つめのLambdaの後に、ユーザー定義でageを定義することで、フロー内のどのタイミングでもageを呼び出すことができます。
スクリーンショット 2022-01-31 22.18.48.png

Lambdaのコードの注意点

Connectで実際にテストし、Lambda実行時にエラーになった場合、CloudWatch Logsでエラー原因を確認します。
その際、Lambdaのログは、エラーになっておらず、Connectのログを見ると、エラーになっている場合、Lambdaにreturnを使用していない可能性があります。
returnがないと、connectが失敗するため、returnすることがなくても、適当な値をreturnしましょう。

参考記事

問い合わせ属性まとめ一覧↓

プロンプト再生のSSMLタイプを使用すると、音声の大きさや速度を調整できます。↓

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6