Amazon Connect コンタクトセンターで、エージェントがリアルタイムで番号にフラグを立てることができる拒否リストを設定するにはどうすればいいですか?

所要時間8分
0

Amazon Connect コンタクトセンターのエージェントが拒否リストにリアルタイムで番号を追加できるようにしたいと考えています。また、エージェントがリストに手動で番号を追加できるようにしたいと考えています。

簡単な説明

Amazon Connect コンタクトセンターのエージェントが拒否リストにリアルタイムで番号を追加できるようにするには、以下の手順を実行してください。

  • 拒否された番号を保持する Amazon DynamoDB テーブルを作成します。
  • AWS ID およびアクセス管理 (IAM) ロールを作成します。次に、AWS Lambda 関数がそのロールを引き受けるので、DynamoDB で拒否された番号を検索または追加することができます。
  • 拒否された番号を DynamoDB テーブルに格納する Lambda 関数 (関数 A) を作成します。
  • 拒否リストにある番号からの呼び出しを DynamoDB テーブルにクエリする 2 つ目の Lambda 関数 (関数 B) を作成します。
  • Amazon Connect インスタンスに Lambda 関数を追加します。
  • 請求された番号に関連するインバウンド連絡フローを作成します。対応フローは関数 B を呼び出して、着信コールを DynamoDB の拒否リストと照合します。
    その番号が拒否リストにない場合、関数はコールを通常のカスタマーキューフローに転送します。
    -または-
    この番号が拒否リストにある場合、関数はオーディオプロンプトを再生し、通話を切断します。
  • エージェントが拒否リストに番号を追加したときに関数 A を呼び出すキューへの転送フローを作成します。
  • エージェントがコンタクトコントロールパネル (CCP)を使用して拒否リストに番号を追加できるようになるクイック接続を作成します。

**注:**DynamoDB テーブルを直接編集し、拒否リストに手動で番号を追加することも可能です。

解決方法

Amazon Connect コンタクトセンターで拒否リストを設定するには、エージェントは関数 (関数 A) を使用してください。エージェントは関数 A を使用してフラグ付きの番号を追加し、関数 B を使用してフラグ付きリストをクエリします。

**重要:**Amazon Connect インスタンスが置かれているのと同じ AWS リージョンでこれらのステップを実行します。

拒否された番号を保持する DynamoDB テーブルを作成します。

  1. DynamoDB コンソールを開きます。
  2. [DynamoDB テーブルの作成] を選択します。
  3. [DynamoDB テーブルの作成] ページで、次の情報を入力します。
    [テーブル名] に、DenylistingTableと入力します。
    [パーティションパネル] の**[プライマリキー]** に ContactNumber と入力します。
    [データタイプ] で、[文字列] を選択します。
  4. [作成] を選択します。
    **注:詳細については、「**コンソールまたは AWS コマンドラインインターフェイス (AWS CLI) を使用してテーブルにデータを書き込む」を参照してください

Lambda 関数が DynamoDB で拒否された番号を検索または追加するために引き受けることができる IAM ロールを作成する

  1. 次の JSON ポリシーを使用する IAM ロールを作成 します。
    **重要:**ポリシーに、DynamoDB アクセス許可とともに、AWSLambdaBasicExecutionRole が含まれているかどうかを確認してください。AWSLambda BasicExecutionRole がポリシーに含まれていない場合、関数が呼び出さることはありません。
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": "cloudwatch:GetInsightRuleReport",
      "Resource": "arn:aws:cloudwatch:*:*:insight-rule/DynamoDBContributorInsights*"
    },
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "iam:PassedToService": [
            "application-autoscaling.amazonaws.com",
            "application-autoscaling.amazonaws.com.cn",
            "dax.amazonaws.com"
          ]
        }
      }
    },
    {
      "Sid": "VisualEditor2",
      "Effect": "Allow",
      "Action": "iam:CreateServiceLinkedRole",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "iam:AWSServiceName": [
            "replication.dynamodb.amazonaws.com",
            "dax.amazonaws.com",
            "dynamodb.application-autoscaling.amazonaws.com",
            "contributorinsights.dynamodb.amazonaws.com",
            "kinesisreplication.dynamodb.amazonaws.com"
          ]
        }
      }
    },
    {
      "Sid": "VisualEditor3",
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction",
        "cloudwatch:DeleteAlarms",
        "sns:Unsubscribe",
        "dynamodb:*",
        "lambda:GetFunctionConfiguration",
        "datapipeline:CreatePipeline",
        "kinesis:ListStreams",
        "logs:CreateLogStream",
        "kinesis:DescribeStreamSummary",
        "resource-groups:GetGroup",
        "cloudwatch:DescribeAlarmsForMetric",
        "lambda:DeleteFunction",
        "sns:Subscribe",
        "iam:GetRole",
        "application-autoscaling:RegisterScalableTarget",
        "sns:ListSubscriptionsByTopic",
        "datapipeline:ListPipelines",
        "dax:*",
        "lambda:ListFunctions",
        "sns:CreateTopic",
        "application-autoscaling:DeleteScalingPolicy",
        "cloudwatch:GetMetricStatistics",
        "logs:CreateLogGroup",
        "resource-groups:CreateGroup",
        "application-autoscaling:DescribeScalingPolicies",
        "lambda:ListEventSourceMappings",
        "application-autoscaling:PutScalingPolicy",
        "cloudwatch:DescribeAlarms",
        "resource-groups:ListGroupResources",
        "ec2:DescribeSubnets",
        "lambda:DeleteEventSourceMapping",
        "datapipeline:ActivatePipeline",
        "resource-groups:GetGroupQuery",
        "tag:GetResources",
        "sns:DeleteTopic",
        "cloudwatch:GetMetricData",
        "sns:ListTopics",
        "sns:SetTopicAttributes",
        "lambda:CreateEventSourceMapping",
        "datapipeline:DescribePipelines",
        "cloudwatch:ListMetrics",
        "cloudwatch:DescribeAlarmHistory",
        "application-autoscaling:DescribeScalingActivities",
        "kms:DescribeKey",
        "datapipeline:PutPipelineDefinition",
        "application-autoscaling:DescribeScalableTargets",
        "datapipeline:QueryObjects",
        "iam:ListRoles",
        "datapipeline:DescribeObjects",
        "kinesis:DescribeStream",
        "sns:ListSubscriptions",
        "resource-groups:ListGroups",
        "datapipeline:GetPipelineDefinition",
        "logs:PutLogEvents",
        "ec2:DescribeSecurityGroups",
        "resource-groups:DeleteGroup",
        "cloudwatch:PutMetricAlarm",
        "ec2:DescribeVpcs",
        "kms:ListAliases",
        "datapipeline:DeletePipeline",
        "application-autoscaling:DeregisterScalableTarget"
      ],
      "Resource": "*"
    }
  ]
}
  1. 次の 2 番目の JSON ポリシーを IAM ロールにアタッチします
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "lambda:*",
        "dynamodb:*"
      ],
      "Resource": "*"
    }
  ]
}

拒否された番号を DynamoDB テーブルに格納する Lambda 関数 (関数 A) を作成します。

次の Python コードを使用して Lambda 関数を作成します。Lambda 関数に関連付けられたロールに次の許可をアタッチします。

Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

import json
import boto3

client = boto3.client('dynamodb')

def lambda_handler(event, context):
    response = client.put_item(
    TableName='DenylistingTable',
    Item={
        'ContactNumber':{
            'S':event['Details']['ContactData']['CustomerEndpoint']['Address']
        }
    }
    )

    return{'Success':True}

  {
        "Version": "2012-10-17",
        "Statement": [{
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "dynamodb:PutItem",
            "Resource": "arn:aws:dynamodb:<region>:<account-number>:table/DenylistingTable"
      }
    ]
  }

DynamoDB テーブルにクエリする 2 つ目の Lambda 関数 (関数 B) を作成し、着信が拒否リストの番号からのものかどうかをチェックする

次の許可を持つ 2 つ目の Lambda 関数を作成します。

Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

import json
import boto3

client = boto3.client('dynamodb')

def lambda_handler(event, context):

    response = client.query(
        TableName="DenylistingTable",
        Select= 'ALL_ATTRIBUTES',
        KeyConditionExpression='ContactNumber = :ConNum',
        ExpressionAttributeValues={":ConNum":{
            "S": event['Details']['ContactData']['CustomerEndpoint']['Address']
        }
      }
    )
    if (len(response['Items']) == 0):
        return {'Success':'false'}
    else:
        return {'Success':'true'}

    {
     "Version": "2012-10-17",
     "Statement": [{
         "Sid": "VisualEditor0",
         "Effect": "Allow",
         "Action": "dynamodb:Query",
         "Resource": "arn:aws:dynamodb:<region>:<account-number>:table/DenylistingTable"
      }
    ]
  }

Amazon Connect インスタンスに Lambda 関数 (関数 A と関数 B) を追加する

  1. Amazon コネクトコンソールを開きます。
  2. [インスタンスエイリアス] 列で、Amazon Connect インスタンスの名前を選択します。
  3. 左のナビゲーションペインで、[問い合わせフロー] を選択します。
  4. [AWS Lambda] セクションで、[関数] ドロップダウンリストを選択します。次に、関数 A の名前を選択します。
    注:****[関数] ドロップダウンリストには、Amazon Connect インスタンスと同じ AWS リージョンにある関数のみが表示されます。関数が表示されない場合は、**[新しい Lambda 関数を作成)] ** を選択し、適切なリージョンに新しい関数を作成します。
  5. [Lamba 関数の追加] を選択します。次に、関数の Amazon リソースネーム (ARN) が Lambda 関数の下に追加されているかを確認します。
  6. 手順 1 ~ 5 を繰り返して、Amazon Connect インスタンスに関数 B を追加します。手順 4 では、関数 B の名前を選択しているかどうかを確認します。

詳細については、「AWS Lambda 関数の呼び出し」を参照してください。

インバウンド問い合わせフローを作成する

要求された番号に関連付けられた新しいインバウンド連絡フローを作成します。[問い合わせフローの作成]を選択すると、問い合わせフローデザイナーが開きます。

問い合わせフローデザイナーで、次の操作を行います。

**注:**以下に、基本的なインバウンド問い合わせフローの例を示しております。ユースケースに合わせてブロックを追加または編集することができます。

[ロギング動作の設定] ブロックを追加する

**重要:**インスタンスの問い合わせフローロギングをまだ有効にしていない場合は、有効にしてください

Amazon Connect CloudWatch Logs で問い合わせフローログを有効にするには、[ログ記録動作の設定] ブロックを使用します。

  1. [設定] を選択します。
  2. [ログ記録動作の設定] ブロックをドラッグし、[エントリーポイント] ブロックの右にあるキャンバスにドロップします。
  3. ブロックタイトル ([ログ記録動作の設定)]) を選択します。ブロックの設定メニューが開きます。
  4. [有効にする] を選択します。

[AWS Lambda 関数の呼び出し] ブロックを追加する

関数 B を呼び出し、着信が拒否リストの番号からのものかどうかを確認するには、[AWS Lambda 関数の呼び出し] ブロックを使用します。

  1. [統合] を選択します。
  2. ** [AWS Lambda 関数の呼び出し] ブロックをドラッグし、[ログ記録動作の設定]** ブロックの右にあるキャンバスにドロップします。
  3. ブロックのタイトルを選択します (AWS Lambda 関数の呼び出し)。ブロックの設定メニューが開きます。
  4. 関数 B の名前を選択します。
  5. [保存] を選択します。

[問い合わせ属性を確認する] ブロックを追加する

番号が拒否リストに追加されたかどうかを確認するには、[問い合わせ属性を確認する] ブロックを使用します。

  1. **[Branch]**を選択します。
  2. ** [問い合わせ属性を確認する]**ブロックをドラッグし、 [AWS Lambda 関数の呼び出し)] ブロックの右にあるキャンバスにドロップします。
  3. ブロックのタイトル ([問い合わせ属性を確認する]) を選択します。ブロックの設定メニューが開きます。
  4. [タイプ][外部] を選択します。
  5. [属性][成功] を選択します。
  6. [別のパラメータの追加] を 2 回選択すると、2 つのパラメータが作成されます。
  7. [チェックする条件] で、両方のパラメータに対して [等しい) を選択します。次に、最初のパラメータの値に true と入力します。2 番目のパラメーターの値には、false と入力します。
  8. [保存] を選択します。

[プロンプトの再生] ブロックを追加する

拒否リスト要求エラーが発生したときにエージェントに通知するプロンプトを再生するには、[プロンプトの再生] ブロックを使用します。

  1. [Interact] を選択します。
  2. [プロンプトの再生] ブロックをドラッグし、[AWS Lambda 関数の呼び出し] ブロックの右にあるキャンバスにドロップします。次に、**[AWS Lambda 関数の呼び出し]**ブロックの [エラー] 出力に [プロンプトの再生] ブロックを接続します。
  3. ブロックタイトル ([再生プロンプト]) を選択します。ブロックの設定メニューが開きます。
  4. [プロンプト] で、 [テキストの読み上げ] を選択します。その後、次のいずれかを選択します。
    [テキストを入力] では、テキストをリアルな音声メッセージとして再生することができます。
    -または-
    [動的に入力] では、.wav ファイルをアップロードして録音した音声メッセージを再生できます。
  5. [保存] を選択します。

[キューへ転送] ブロックを追加する

コンタクトフローを終了し、通話を通常のカスタマーキューフローに転送するには、 [キューへ転送] ブロックを使用します。

  1. [終了/転送] を選択します。
  2. [キューへ転送] ブロックをドラッグし、[プロンプトの再生] ブロックの右にあるキャンバスにドロップします。
    **注:**このユースケースでは、[キューへ転送] ブロックの設定を構成する必要はありません。

[切断] ブロックを追加する

着信が拒否リストにある番号からの場合、発信者をコンタクトフローから切断するには、[切断] ブロックを追加します。

  1. [終了/転送] を選択します。
  2. [切断] ブロックをドラッグし、[キューへ転送] ブロックの右にあるキャンバスにドロップします。
    **注:**このユースケースでは、[切断] ブロックの設定を構成する必要はありません。

問い合わせフローを有効化する

  1. フローの草稿を保存するには、[保存] を選択します。
  2. フローを有効にするには、[公開] を選択します。

エージェントがリアルタイムで拒否リストに番号を追加できるキューへの転送フローを作成する

新しいキューへの転送フローを作成します[問い合わせフローの作成] を選択すると、問い合わせフローデザイナーが開きます。

問い合わせフローデザイナーで、次の操作を行います。

[プロンプトの再生] ブロックを追加する

拒否リストに番号を追加中であることをエージェントに知らせるには、[プロンプトの再生] ブロックを使用します。

  1. [Interact] を選択します。
  2. [プロンプトの再生] ブロックをドラッグし、[エントリポイント] ブロックの右にあるキャンバスにドロップします。
  3. ブロックタイトル ([再生プロンプト]) を選択します。ブロックの設定メニューが開きます。
  4. [プロンプト] で、 [テキストの読み上げ] を選択します。次に、[テキストの入力] または [動的に入力する] を選択して、オーディオメッセージを作成します。
  5. [保存] を選択します。

[AWS Lambda 関数の呼び出し] ブロックを追加する

エージェントが CCP を使用して拒否リストに番号を追加するときに関数 A を呼び出すには、[AWS Lambda 関数の呼び出し] ブロックを使用します。

  1. [統合] を選択します。
  2. ** [AWS Lambda 関数の呼び出し]** ブロックをドラッグし、 [プロンプトの再生] ブロックの右にあるキャンバスにドロップします。
  3. ブロックのタイトルを選択します (AWS Lambda 関数の呼び出し)。ブロックの設定メニューが開きます。
  4. 関数 A の名前を選択します。
  5. [関数入力パラメータ] セクションで、[パラメータを追加する] を選択し、[属性を使用する] を選択します。次に、以下の操作を実行します。
    [宛先キー]CustomerNumber と入力します。
    [タイプ] では、[システム] を選択します。
    [属性] で、[顧客電話番号] を選択します。
  6. [保存] を選択します。

2 番目の [プロンプトの再生] ブロックを追加する

拒否リストに番号が追加されたことをエージェントに知らせるには、2 番目の [プロンプトの再生] ブロックを使用します。

  1. [Interact] を選択します。
  2. [プロンプトの再生] ブロックをドラッグし、[AWS Lambda 関数の呼び出し] ブロックの右にあるキャンバスにドロップします。次に、[プロンプトの再生] ブロックを** [AWS Lambda 関数の呼び出し]** ブロックの [成功] 出力に接続します。
  3. ブロックタイトル ([再生プロンプト]) を選択します。ブロックの設定メニューが開きます。
  4. [プロンプト] で、 [テキストの読み上げ] を選択します。次に、[テキストの入力] または [動的に入力する] を選択して、オーディオメッセージを作成します。
  5. [保存] を選択します。

3 番目の [プロンプトの再生] ブロックを追加する

エラーが原因で拒否リストに番号が追加されなかったことをエージェントに知らせるには、3 番目の [プロンプトの再生] ブロックを使用します。

  1. [Interact] を選択します。
  2. [プロンプトの再生] ブロックをドラッグし、[AWS Lambda 関数の呼び出し] ブロックの右にあるキャンバスにドロップします。次に、**[AWS Lambda 関数の呼び出し]**ブロックの [エラー] 出力に [プロンプトの再生] ブロックを接続します。
  3. ブロックタイトル ([再生プロンプト]) を選択します。ブロックの設定メニューが開きます。
  4. [プロンプト] で、 [テキストの読み上げ] を選択します。次に、[テキストの入力] または [動的に入力する] を選択して、オーディオメッセージを作成します。
  5. [保存] を選択します。

[切断] ブロックを追加する

エージェントをコンタクトフローから切断するには、[切断] ブロックを追加します。

  1. [終了/転送] を選択します。
  2. [切断] ブロックをドラッグし、3 つの [プロンプトの再生] ブロックの右にあるキャンバスにドロップします。
  3. すべてのフローのブランチを [切断] ブロックに接続します。
    注:このユースケースでは、[切断] ブロックの設定を構成する必要はありません。

キューへの転送フローを有効にする

  1. フローのドラフトを保存するには、[保存] を選択します。
  2. フローを有効にするには、[公開] を選択します。

エージェントが CCP を使用して拒否リストに番号を追加できるクイック接続を作成する

次の設定を持つ Amazon Connect コンソールを使用してクイック接続を作成します。

  1. [名前] で、クイック接続の名前を入力します。例: 拒否リスト
    [タイプ] に、[キュー] を選択します。
    [宛先] に、拒否リスト機能を持たせるキューの名前を入力します。
  2. 拒否リスト機能へのアクセスを許可するエージェントに割り当てられたキューにクイック接続を追加します
  3. 拒否リスト機能へのアクセスを許可するエージェントに割り当てられたキューにクイック接続を追加します

これで、エージェントが通話中のときに、CCP で拒否リストクイック接続を使用して、拒否リストに番号を追加できます。次にその番号から Amazon Connect コンタクトセンターに着信があると、キューに入れられずに自動的に切断されます。

**注:**このプロセスの最中に顧客が電話を切ると、通話は切断されます。接続が切断されている場合、クイックコネクトを使用してエージェントが拒否リストに番号を追加することはできません。番号は手動で追加する必要があります。

AWS公式
AWS公式更新しました 9ヶ月前
コメントはありません

関連するコンテンツ