3-3.ハンズオン#1 パーソナライズされた顧客体験

このハンズオンでは、顧客の電話番号をキーにして外部の Dynamo DB に格納された顧客情報を検索し、顧客の会員レベルを取得します。そして、会員レベルに応じたキューにルーティングします。これはレガシーな音声システムにおいて、”データベースルーティング”と呼ばれることもあるテクニックの一つです。データベースルーティングの例を以下に示します。

  • VIP ルーティング
  • Last Agent ルーティング
  • 迷惑電話切断 etc

また、こうしたテクニックを使うことで、Amazon Connect では問い合わせフローを集約し、運用効率を劇的に向上させることが可能です。例えば、公開している電話番号が100個あり、対応するキューも100個ある場合、データベースルーティングを活用することでシンプルな問い合わせフローを一つ用意するだけですみます。

  • 着信番号と対応するキューを定義する Dynamo DB を用意する
  • 顧客からの呼が着信したら、Dynamo DB を検索して着信番号に対応するキュー ARN を取得する
  • 取得したキュー ARN を作業キューにセットし、キューに転送する

こうしておけば、番号の追加・削除を行う場合も、Dynamo DB の項目をメンテナンスするだけですみます。問い合わせフローを編集する必要はありません。

ハンズオン #1 パーソナライズされた顧客体験

このハンズオンでは、以下のような作業を実施します。

  1. Lambda 関数用の IAM ポリシー, IAM ロール を作成する
  2. “顧客データベース”となる Dynamo DB を作成する
  3. 顧客の電話番号をキーにして Dynamo DB を検索する Lambda 関数を作成する
  4. 作成した Lambda 関数を Amazon Connect インスタンスに紐づける
  5. Amazon Connect の設定を行う
    • キューの作成、ルーティングプロファイルの作成
    • 問い合わせフローの作成と電話番号の紐付け
  6. テストコール

このハンズオンでは、“1.準備” の章の作業が完了していることを前提にしています。まだ、Amazon Connect インスタンスの作成や電話番号の取得が済んでいない方は、先に “1.準備” の作業を実施してください。


1. Lambda 関数用のIAM ポリシー, IAM ロール を作成する

IAM ポリシーの作成

  1. AWS マネジメントコンソールで、IAM を選択します。
  2. 左側のナビゲーションペインで”ポリシー”を選択し、右上の方にある”ポリシーの作成”ボタンを押します。
  3. ポリシーの作成画面で”JSON”タブを選択し、以下のテキストをエディターに貼り付けます。

    {
     "Version": "2012-10-17",
     "Statement":  [
       {
         "Effect": "Allow",
         "Action": [
           "lambda:*",
           "dynamodb:*"
         ],
         "Resource": "*"
       }
     ]
    }
    
  4. 右下の”次のステップ:タグ”ボタンを押し、続いて”次のステップ:確認”ボタンを押します。

  5. 名前の欄には lambdaDynamo と入力し、右下の”ポリシーの作成”ボタンを押します。

IAM ロールの作成

  1. IAMのコンソールで、左側のナビゲーションペインの”ロール”を選択し、右上の上にある”ロールの作成”ボタンを押します。
  2. “ユースケースの選択”で Lambda を選択して、”次のステップ:アクセス権”ボタンを押します。
  3. “ポリシーのフィルタ”検索欄に lambdaDynamo と入力します。先ほど作成した lambdaDynamo ポリシーが表示されるので、チェックボックスをオンにして、”次のステップ:タグ”を押します。
  4. “次のステップ:確認”ボタンを押します。
  5. ロール名に lambdaDynamoRole と入力して、”ロールの作成”ボタンを押します。

2. “顧客データベース”となる Dynamo DB を作成する

  1. AWS マネジメントコンソールで DynamoDB を表示し、”テーブルの作成”ボタンを押します。
  2. 以下の様に項目を設定します。
    • テーブル名: membershipTable
    • パーティションキー: phoneNumber
    • ソートキー: membershipLevel
  3. 下までスクロールして、”テーブルの作成”ボタンを押して、状態が Active になるのを待ちます。
  4. 状態が Active になったら、テーブル名をクリックします。
  5. “インデックス”タブを選択し、”インデックスの作成”ボタンを押します。 createIndex

  6. パーティションキーに phoneNumber と入力し、下の方までスクロールして”インデックスの作成”ボタンを押します。 setIndex

  7. 左側のナビゲーションペインで”項目の探索”を選択し、membershipTable にチェックを入れます。そして、”項目の作成”ボタンを押します。 createItem

  8. phoneNumberフィールドには自分がテストに使う電話番号(例えば、自分の携帯電話番号)、メンバーシップレベルには Platinum と入力し、”項目の作成”ボタンを押します。 Item


3. 顧客の電話番号をキーにして Dynamo DB を検索する Lambda 関数を作成する

  1. AWS マネジメントコンソールで Lambda を選択し、”関数の作成”ボタンを押します。
  2. “一から作成”をチェックし、関数名に getMembership と入力します。ランタイムは Node.js 16.x を選択します。さらに、 デフォルトの実行ロールの変更 メニューを展開し、上で作成した lambdaDynamo ロールを選択します。最後に、右下の”関数の作成”ボタンを押します。 createLambda
  3. index.js のコードを以下のものに置き換え、”Deploy”ボタンを押します。

    var AWS = require("aws-sdk");
    var docClient = new AWS.DynamoDB.DocumentClient();
    
    exports.handler = (event, context, callback) => {
      var phoneNumber = event.Details.ContactData.CustomerEndpoint.Address;
      var paramsQuery = {
            TableName: 'membershipTable',
              KeyConditionExpression: "phoneNumber = :varNumber",
              IndexName: "phoneNumber-index",
    
              ExpressionAttributeValues: {
                ":varNumber": phoneNumber
              }
          };
    
      docClient.query(paramsQuery, function(err, data) {
          if (err) {
            console.log(err); // an error occurred
            context.fail(buildResponse(false));
          } 
        else {
            console.log("DynamoDB Query Results:" + JSON.stringify(data));
              
            if (data.Items.length === 1) {
            console.log(data.Items[0].membershipLevel);
            var membershipLevel = data.Items[0].membershipLevel;
            callback(null, buildResponse(true, membershipLevel));
            } 
          else {
              console.log("PhoneNumber not found");
              callback(null, buildResponse(true, "none"));
            }
          }
      });
    };
    
    function buildResponse(isSuccess, membershipLevel) {
      if (isSuccess) {
          return { 
          membershipLevel: membershipLevel,
          lambdaResult: "Success"
        };
      } 
      else {
          console.log("Lambda returned error to Connect");
          return { lambdaResult: "Error" };
      }
    }
    
  4. “Test”ボタンの右の ▼ を押して、”Configure test event”を選択します。イベント名に amazonConnectTestEvent と入力し、イベントのペイロードを以下のものに置き換えて、右下の”作成”ボタンを押します。

    {
      "Name": "ContactFlowExecution",
      "Details": {
        "Parameters": {
          "key1": "value1",
          "key2": "value2"
        },
        "ContactData": {
          "ContactId": "ASDAcxcasDFSSDFs",
          "InitialContactId": "Acxsada-asdasdaxA",
          "PreviousContactId": "Acxsada-asdasdaxA",
          "Channel": "Voice",
          "InstanceARN": "",
          "InitiationMethod": "INBOUND/OUTBOUND/TRANSFER/CALLBACK",
          "SystemEndpoint": {
            "Type": "TELEPHONE_NUMBER",
            "Address": "01234567"
          },
          "CustomerEndpoint": {
            "Type": "TELEPHONE_NUMBER",
            "Address": "+8190********"
          },
          "Queue": {
            "Name": "PrimaryPhoneQueue",
            "ARN": ""
          },
          "Attributes": {
            "key1": "value",
            "key2": "value"
          }
        }
      }
    }
    

    ここで、 CustomerEndpoint.Address の値は先ほど DynamoDB に登録した電話番号に変更してください。

  5. “Test” ボタンを押してテストを実行し、以下の様な結果が表示されることを確認してください。 lambdaTestResult


4. 作成した Lambda 関数を Amazon Connect インスタンスに紐づける

  1. AWS マネジメントコンソールで Amazon Connect を選択し、作成したインスタンスのエイリアスをクリックします。
  2. 左側のナビゲーションペインで問い合わせフローを選択し、”AWS Lambda” の項目で先ほど作成した getMembership を選んで Add Lambda Function をクリックします。 addLambda

5. Amazon Connect の設定を行う

  1. Amazon Connect の管理コンソールにログインし、左側のナビゲーションメニューから ルーティング > キュー を選択します。
  2. “新しいキューの追加” ボタンを押し、以下の様に Silver という名前のキューを作成します。オペレーション時間は Basic Hours を選択してください。 createSilverQueue
  3. 同様にして、Platinum キューと、 Gold キューも作成します。 listOfQueue
  4. 左側のナビゲーションメニューから ユーザー > ルーティングプロファイル を選択し、”Basic Routing Profile”をクリックします。”ルーティングプロファイルのキュー”に先ほど作成した3つのキューを登録し、キューの優先度を以下の図の様に設定します(Platinum = 1, Gold = 2, Silver = 3)。完了したら最後に、右上の”保存”ボタンを押します。 basicRoutingProfile
  5. 以下の様な問い合わせフローを新規に作成し、公開します。 contactFlow
    • “Lambda 関数を呼び出す”ブロックでは、上で作成した getMembership を選択します。
    • “コンタクト属性を確認する”ブロックは以下の様に設定します。直近の Lambda 関数からの戻り値は外部属性として参照することを思い出してください。 checkAttrib
  6. “1. 準備”の章で取得した電話番号に、ここで作成した問い合わせフローを紐づけます。 phoneNumber

6. テストコール

テストコールを実行してみてください。

  • DynamoDBにPlatinumとして登録した電話番号から架電し、保留音を再生してください。そしてこの時、キューのリアルタイムメトリクスでPlatinumキューに待ち呼がカウントされていることを確認しましょう。 realtimeMetrics
  • テストに使える電話番号が複数ある場合は、それらをDynamoDBに登録してテストコールをしてみましょう。この時、Platinum以外のMembership Level(GoldやSilver)を設定すると良いでしょう。
  • さらに、同時に複数の電話からテストコールをして、優先度の高いキューが先にAgentに着信することも確認してみてください。

ハンズオン #1は以上となります。