Amazon Connect エージェントワークスペースで顧客対応内容や問い合わせ種別をコンタクト詳細に記録する仕組みを実装
はじめに
Amazon Connect では、エージェントが顧客対応した内容や問い合わせ種別を記録し、後からコンタクト詳細で確認できる機能が提供されています。
公式ドキュメントではステップバイステップガイドを利用して実現できると記載されていますが、具体的な実装手順は詳細に説明されていません。
そこで本記事では、以下の機能を実装する方法を具体的に解説します。
- 通話中や通話後にエージェントが顧客対応記録とお問い合わせ種別を入力できるフォームを表示する
 - コンタクト検索でお問い合わせ種別によるフィルタリングを可能にする
 - コンタクト詳細画面からエージェントの対応記録を確認できるようにする
 
検索可能なカスタムコンタクト属性の設定
まず最初に、コンタクト検索でお問い合わせ種別によるフィルタリングを可能にするため、「検索可能なカスタムコンタクト属性」を設定します。
この設定は実装の前提条件となるため、最初に行います。
設定手順
- Amazon Connect の「コンタクト検索」画面を開きます
 - フィルターから「カスタム問い合わせ属性」(= カスタムコンタクト属性)を選択します

 - 右上の歯車アイコンをクリックして「検索可能なカスタムコンタクト属性」設定画面に移動します

 - 「コンタクト属性」欄に 
typeを入力し、保存します

 
- この設定は設定後に発生するコンタクトにのみ適用されます
 - Amazon Connect 管理画面から直接この設定画面へ遷移する方法はないため、上記の手順で移動するか、以下の URL パターンで直接アクセスします。
https://[Access URL]/connect/contact-attributes-config 
ビュー作成
次に、エージェントワークスペースに表示する入力フォームを作成します。
このビューでは、対応記録を入力するテキストエリアとお問い合わせ種別を選択するドロップダウンを配置します。
ビューの構成要素
- 
フォームコンテナ
すべてのコンポーネントを格納する基本コンテナです。
 - 
テキストエリア(対応記録用)
エージェントが顧客対応の詳細を記録するための複数行テキスト入力欄です。

 - 
ドロップダウン(問い合わせ種別選択用)
問い合わせの種類をカテゴリ分けするためのドロップダウンリストです。

- Optionsには以下を記載しています。
- Options-1:商品関連
 - Options-2:支払い関連
 - Options-3:その他

 
 
 - Optionsには以下を記載しています。
 - 
送信ボタン
入力内容を保存するためのボタンです。

 
後続のフロー設定で使用するため、以下のコンポーネント名を記録しておきます。
- テキストエリアの Name: 
memo - ドロップダウンの Name: 
type 
これらの名前は、後でコンタクト属性として保存する際に参照するキーとなります。
Amazon Connect フローの作成
この実装では、2種類のフローを作成する必要があります
- ビューを表示するフロー(ステップバイステップガイド)
 - 電話を受けるフロー(メインフロー)
 
ビューを表示するフロー
このフローは、エージェントワークスペースに入力フォームを表示し、入力された情報をコンタクト属性として保存する役割を担います。[ログ記録動作の設定]ブロックは、 電話を受けるフローで設定していますので、ビューを表示するフローでは不要です。

(クリックで展開)
{
  "Version": "2019-10-30",
  "StartAction": "2a664ed7-cded-4d87-87f0-3e4383820e83",
  "Metadata": {
    "entryPointPosition": {
      "x": 40,
      "y": 40
    },
    "ActionMetadata": {
      "2a664ed7-cded-4d87-87f0-3e4383820e83": {
        "position": {
          "x": 183.2,
          "y": 63.2
        },
        "parameters": {
          "ViewResource": {
            "Id": {
              "displayName": "cm-hirai-post-processing-entry-form"
            }
          },
          "InvocationTimeLimitSeconds": {
            "unit": 60
          }
        }
      },
      "a1a876b1-c384-408c-92ad-ac2c1cd8754e": {
        "position": {
          "x": 428,
          "y": 32
        },
        "dynamicParams": []
      },
      "a41a0a48-0898-41da-a465-853ccac49f98": {
        "position": {
          "x": 664.8,
          "y": 266.4
        }
      }
    },
    "Annotations": [],
    "name": "cm-hirai-post-processing-entry-form-stepbystep-guide",
    "description": "",
    "type": "contactFlow",
    "status": "published",
    "hash": {}
  },
  "Actions": [
    {
      "Parameters": {
        "ViewResource": {
          "Id": "arn:aws:connect:ap-northeast-1:111111111111:instance/3ff2093d-af96-43fd-b038-3c07cdd7609c/view/ff1d7283-6c44-43d8-97e7-bc57a1af98ce:$LATEST"
        },
        "InvocationTimeLimitSeconds": "36000",
        "ViewData": {}
      },
      "Identifier": "2a664ed7-cded-4d87-87f0-3e4383820e83",
      "Type": "ShowView",
      "Transitions": {
        "NextAction": "a41a0a48-0898-41da-a465-853ccac49f98",
        "Conditions": [
          {
            "NextAction": "a1a876b1-c384-408c-92ad-ac2c1cd8754e",
            "Condition": {
              "Operator": "Equals",
              "Operands": [
                "ActionSelected"
              ]
            }
          }
        ],
        "Errors": [
          {
            "NextAction": "a41a0a48-0898-41da-a465-853ccac49f98",
            "ErrorType": "NoMatchingCondition"
          },
          {
            "NextAction": "a41a0a48-0898-41da-a465-853ccac49f98",
            "ErrorType": "NoMatchingError"
          },
          {
            "NextAction": "a41a0a48-0898-41da-a465-853ccac49f98",
            "ErrorType": "TimeLimitExceeded"
          }
        ]
      }
    },
    {
      "Parameters": {
        "Attributes": {
          "memo": "$.Views.ViewResultData.memo",
          "type": "$.Views.ViewResultData.type.0"
        },
        "TargetContact": "Related"
      },
      "Identifier": "a1a876b1-c384-408c-92ad-ac2c1cd8754e",
      "Type": "UpdateContactAttributes",
      "Transitions": {
        "NextAction": "a41a0a48-0898-41da-a465-853ccac49f98",
        "Errors": [
          {
            "NextAction": "a41a0a48-0898-41da-a465-853ccac49f98",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {},
      "Identifier": "a41a0a48-0898-41da-a465-853ccac49f98",
      "Type": "EndFlowExecution",
      "Transitions": {}
    }
  ]
}
フローの主要コンポーネント
- ビューを表示
- 表示するビュー:先ほど作成した入力フォーム
 - バージョン:$LATEST
 - タイムアウト:適切な値を設定
 - 入力:未入力でよいです

 
 - コンタクト属性の設定
- 属性を設定する対象:「関連するコンタクト」
(重要:電話対応のコンタクトに属性を反映させるため) - 設定する属性:
- キー:
memo、値:$.Views.ViewResultData.memo - キー:
type、値:$.Views.ViewResultData.type.0

 
 - キー:
 
 - 属性を設定する対象:「関連するコンタクト」
 
フローの動作は以下の通りです。
- エージェントに入力フォームを表示
 - エージェントが情報を入力して送信ボタンをクリック
 - 入力された情報を関連するコンタクト(電話対応)の属性として保存
 - フローを終了
 
ビューデータの構造と参照方法
ステップバイステップガイドでビューを使用する際は、データの構造と参照方法を正しく把握しなければなりません。
ここでは、エージェントが入力したデータをどのように取得し、コンタクト属性として保存するかを解説します。
ビュー実行時に生成されるデータ
ビューが実行されると、主に2種類のデータが生成されます。
- アクション情報:エージェントが実行したアクション(例:送信ボタンのクリック)
 - 入力データ:
ViewResultDataオブジェクトに格納されるエージェントの入力値 
データ構造の例
エージェントが対応記録とお問い合わせ種別を入力して送信すると、以下のような JSON データが生成されます。
{
  "action": "ActionSelected",
  "data": {
    "memo": "支払い期限(1月1日)について問い合わせあり。システムで確認し回答。お客様了承。追加対応不要。",
    "type": {
      "0": "支払い関連"
    }
  },
  "version": "1.0"
}
データの参照方法
カスタムビュー (フォームコンポーネント付き)の場合、このデータをコンタクト属性として保存するには、「コンタクト属性の設定」ブロックで以下のように JSONPath 形式で参照します。
$.Views.ViewResultData.<コンポーネント名>
AWS マネージドビュー (フォームビュー) の場合、以下の通りです。
$.Views.ViewResultData.FormData.<コンポーネント名>
コンポーネントタイプ別の参照パターン
重要なポイントとして、コンポーネントの種類によって参照方法が異なります。
| コンポーネントタイプ | 参照パス | 例 | 
|---|---|---|
| テキストエリア | $.Views.ViewResultData.<名前> | 
$.Views.ViewResultData.memo | 
| ドロップダウン | $.Views.ViewResultData.<名前>.0 | 
$.Views.ViewResultData.type.0 | 
ドロップダウンなどの選択コンポーネントでは、値が配列として格納されるため、末尾に .0 を追加して最初の要素を参照する必要があります。
この正しい参照方法を使用することで、エージェントの入力内容を確実にコンタクト属性として保存し、後からの検索や参照を可能にします。
電話を受けるフロー
次に、実際に電話を受け付けるメインフローを作成します。
このフローでは、エージェントワークスペースに入力フォームを表示するためのイベントフックを設定しています。

(クリックで展開)
{
  "Version": "2019-10-30",
  "StartAction": "62416ee0-7b7d-406f-8df5-4888d812fa9a",
  "Metadata": {
    "entryPointPosition": {
      "x": 40,
      "y": 40
    },
    "ActionMetadata": {
      "62416ee0-7b7d-406f-8df5-4888d812fa9a": {
        "position": {
          "x": 169.6,
          "y": 52.8
        }
      },
      "fba2c05b-c6a2-4795-acaf-200e9f6c39da": {
        "position": {
          "x": 387.2,
          "y": 53.6
        }
      },
      "9dd48a44-601a-4b29-959c-01267ed08155": {
        "position": {
          "x": 171.2,
          "y": 258.4
        },
        "parameters": {
          "EventHooks": {
            "DefaultAgentUI": {
              "displayName": "cm-hirai-post-processing-entry-form-stepbystep-guide"
            }
          }
        }
      },
      "d7f03407-1f71-4852-9ca0-1a8e00d17409": {
        "position": {
          "x": 396.8,
          "y": 251.2
        },
        "parameters": {
          "QueueId": {
            "displayName": "cm-hirai"
          }
        },
        "queue": {
          "text": "cm-hirai"
        }
      },
      "433d0be0-48cb-44da-a24f-6aa745e3f242": {
        "position": {
          "x": 639.2,
          "y": 250.4
        }
      },
      "8e1110a3-e055-4bf4-9c5a-2b5c2b48f6bc": {
        "position": {
          "x": 852.8,
          "y": 448.8
        }
      }
    },
    "Annotations": [],
    "name": "cm-hirai-post-processing-entry-form-stepbystep",
    "description": "",
    "type": "contactFlow",
    "status": "published",
    "hash": {}
  },
  "Actions": [
    {
      "Parameters": {
        "FlowLoggingBehavior": "Enabled"
      },
      "Identifier": "62416ee0-7b7d-406f-8df5-4888d812fa9a",
      "Type": "UpdateFlowLoggingBehavior",
      "Transitions": {
        "NextAction": "fba2c05b-c6a2-4795-acaf-200e9f6c39da"
      }
    },
    {
      "Parameters": {
        "RecordingBehavior": {
          "RecordedParticipants": [
            "Agent",
            "Customer"
          ],
          "ScreenRecordedParticipants": [
            "Agent"
          ]
        },
        "AnalyticsBehavior": {
          "Enabled": "True",
          "AnalyticsLanguage": "ja-JP",
          "AnalyticsRedactionBehavior": "Disabled",
          "AnalyticsRedactionResults": "None",
          "ChannelConfiguration": {
            "Chat": {
              "AnalyticsModes": []
            },
            "Voice": {
              "AnalyticsModes": [
                "PostContact"
              ]
            }
          }
        }
      },
      "Identifier": "fba2c05b-c6a2-4795-acaf-200e9f6c39da",
      "Type": "UpdateContactRecordingBehavior",
      "Transitions": {
        "NextAction": "9dd48a44-601a-4b29-959c-01267ed08155"
      }
    },
    {
      "Parameters": {
        "EventHooks": {
          "DefaultAgentUI": "arn:aws:connect:ap-northeast-1:111111111111:instance/3ff2093d-af96-43fd-b038-3c07cdd7609c/contact-flow/8e56826d-403b-4596-bc0d-740b399f8faa"
        }
      },
      "Identifier": "9dd48a44-601a-4b29-959c-01267ed08155",
      "Type": "UpdateContactEventHooks",
      "Transitions": {
        "NextAction": "d7f03407-1f71-4852-9ca0-1a8e00d17409",
        "Errors": [
          {
            "NextAction": "d7f03407-1f71-4852-9ca0-1a8e00d17409",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {
        "QueueId": "arn:aws:connect:ap-northeast-1:111111111111:instance/3ff2093d-af96-43fd-b038-3c07cdd7609c/queue/ba8d05d9-27b3-406e-b089-f5707174697e"
      },
      "Identifier": "d7f03407-1f71-4852-9ca0-1a8e00d17409",
      "Type": "UpdateContactTargetQueue",
      "Transitions": {
        "NextAction": "433d0be0-48cb-44da-a24f-6aa745e3f242",
        "Errors": [
          {
            "NextAction": "8e1110a3-e055-4bf4-9c5a-2b5c2b48f6bc",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {},
      "Identifier": "433d0be0-48cb-44da-a24f-6aa745e3f242",
      "Type": "TransferContactToQueue",
      "Transitions": {
        "NextAction": "8e1110a3-e055-4bf4-9c5a-2b5c2b48f6bc",
        "Errors": [
          {
            "NextAction": "8e1110a3-e055-4bf4-9c5a-2b5c2b48f6bc",
            "ErrorType": "QueueAtCapacity"
          },
          {
            "NextAction": "8e1110a3-e055-4bf4-9c5a-2b5c2b48f6bc",
            "ErrorType": "NoMatchingError"
          }
        ]
      }
    },
    {
      "Parameters": {},
      "Identifier": "8e1110a3-e055-4bf4-9c5a-2b5c2b48f6bc",
      "Type": "DisconnectParticipant",
      "Transitions": {}
    }
  ]
}
フローで [DefaultFlowForAgentUI] イベントフックを設定することで、どのフローをいつ表示するかを動的に決定できます。
以下の設定にします。
- イベントフックの選択:エージェント UI のデフォルトフロー
 - フローの選択:先ほど作成したビューフロー

 
試してみる
実際に動作確認を行いました。
電話を受けると、エージェントワークスペースに入力フォームが自動的に表示されます。

通話中表示が確認できます。対応記録欄に入力し、お問い合わせ種別を選択し、送信します。

送信が成功すると、確認メッセージが表示されます。

通話中だけでなく、通話終了後のアフターコールワーク中でも同様に情報を入力・送信することができます。
ただし、一度送信を完了すると、その後の情報修正や再送信はできません。

コンタクトの確認
実行後、コンタクト検索画面で確認すると、2種類のコンタクトが生成されます。
- ガイド用コンタクト(チャネル:チャット、チャネルサブタイプ:ガイド)
ステップバイステップガイドの実行記録

 - 音声コンタクト(チャネル:音声、チャネルサブタイプ:テレフォニー)
実際の顧客対応記録

 
コンタクト属性の保存内容
エージェントが入力した情報は、以下のような形式でコンタクト属性に保存されていました。
{
  "action": "ActionSelected",
  "data": {
    "memo": "支払い期限(1月1日)について問い合わせあり。システムで確認し回答。お客様了承。追加対応不要。",
    "type": {
      "0": "支払い関連"
    }
  },
  "version": "1.0"
}
検索機能の確認
コンタクト検索画面で「カスタム問い合わせ属性」フィルターを使用すると、特定のお問い合わせ種別(例:「支払い関連」)のコンタクトのみを抽出できることが確認できました。

これにより、当初の目標である「お問い合わせ種別による検索」と「対応記録の確認」が実現できました。
参考







