【Amazon Connect】内線通話のようにオペレータ間で通話する設定

記事タイトルとURLをコピーする

Amazon Connectをオフィスの電話として利用検討されるお客様から、「内線通話」ができるか否かを確認されることがあります。
残念ながらAmazon Connectは内線通話機能は標準で備わっていませんが、仕組みを作ることで内部ユーザー同士の通話を可能にするソリューションが紹介されているので、これを設定し試してみます。

概要

基本的に下記のAWSナレッジ記事をトレースします。
表現が少し変更になっていたり、翻訳の都合で画面と表記が異なる部分など、少し補足しながら手順を示します。

aws.amazon.com

設定手順

DynamoDBテーブルを作成

マネジメントコンソール:DynamoDB画面を操作します。

テーブルの作成

ダッシュボードページで[テーブルの作成]をクリックします。

f:id:swx-shinsaka:20220126181056p:plain

[テーブルの作成]ページで下記のように指定し、[テーブルの作成] をクリック、しばらくするとテーブル作成が完了します(1分以内程度)。

項目 設定値
テーブル名 AgenttoAgent
パーティションキー Extension , 文字列
設定 デフォルト設定

f:id:swx-shinsaka:20220126181635p:plain

f:id:swx-shinsaka:20220126182044p:plain

テーブルARNをコピー

テーブル作成完了後、テーブル名リンクをクリック、[概要タブ]→[一般的な情報]→[追加情報]→[Amazon リソースネーム(ARN)] を確認してください。
コピーアイコンをクリック、ARNをコピーして控えておきます。

f:id:swx-shinsaka:20220126183631p:plain

内線番号を登録

確認用の内線番号データを登録します。
テーブル AgenttoAgent を選択し、[アクション]メニューから[項目を作成]を選択します。

f:id:swx-shinsaka:20220127185711p:plain

内線番号 1234 をユーザー名 ichiro-suzuki と関連付ける場合は、下記のようなJSONフォーマット文字列を指定し、[項目を作成] 操作します。

{
 "Extension": "1234",
 "AgentLoginName": "ichiro-suzuki"
}

f:id:swx-shinsaka:20220127190029p:plain

IAMロールを作成

マネジメントコンソール:IAM画面を操作します。

ロールを新規作成

ロールを作成(前半)

[IAM]→[ロール]→[ロールを作成] と操作します。

f:id:swx-shinsaka:20220126182728p:plain

[AWSサービス]→[Lambda]→[次のステップ] と操作します。

f:id:swx-shinsaka:20220126183037p:plain

[ポリシーの作成] をクリックします。
別タブでポリシーの作成ページが表示されます。

f:id:swx-shinsaka:20220126183224p:plain

ポリシーを新規作成

[JSON]タブをクリックし、JSONフォーマットの文字列をコピーペーストします。
ペースト後、[次のステップ] をクリックします。

ポリシーjson

Replace with ARN of DynamoDB table you created 部分を作成したDynamoDBのARN文字列に置き換えます。
arn:aws:dynamodb:~:table/AgenttoAgent のような文字列になります

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "dynamodb:BatchGetItem",
                "dynamodb:GetItem",
                "dynamodb:Query",
                "dynamodb:Scan",
                "dynamodb:BatchWriteItem",
                "dynamodb:PutItem",
                "dynamodb:UpdateItem"
            ],
            "Resource": "Replace with ARN of DynamoDB table you created"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        }
    ]
}

f:id:swx-shinsaka:20220126184748p:plain

タグ設定ページでは必要に応じてタグを設定し、[次のステップ] をクリックします。
ポリシーの確認ページでは、ポリシー名 AgenttoAgentPolicy を指定し、[ポリシーの作成] をクリックします。

f:id:swx-shinsaka:20220126185529p:plain

ポリシーが作成されたら、ポリシー作成タブを閉じて、ロールの作成タブへ戻ります。

ロールを作成(後半)

ロールの作成タブに戻り、ポリシー再読み込みします。
作成したポリシー AgentotoAgentPolicy を選択、[次のステップ] をクリックします。

f:id:swx-shinsaka:20220126185843p:plain

タグ設定ページでは必要に応じてタグを設定し、[次のステップ] をクリックします。
ロールの作成の確認ページでは、ロール名 AgenttoAgentRole を指定し、[ロールの作成] をクリックします。

f:id:swx-shinsaka:20220126191736p:plain

Lambda関数を作成

マネジメントコンソール:Lambda画面を操作し、内線番号からエージェント名を取得する関数を作成します。

[関数の作成] をクリックします。

f:id:swx-shinsaka:20220127120848p:plain

各情報を設定し[関数の作成] をクリックします。

項目 設定値
作成オプション 一から作成
関数名 getAgentLoginNameByExtension
ランタイム Python 3.9
実行ロール 既存のロールを使用する
既存のロール AgenttoAgentRole (上記手順で作成したロール)

f:id:swx-shinsaka:20220127121428p:plain

下記Pythonコードをペーストし、[Deploy] を操作します。

import json
import boto3
from boto3.dynamodb.conditions import Key


def get_agent_id(Extension, dynamodb=None):
    if not dynamodb:
        dynamodb = boto3.resource('dynamodb')

    table = dynamodb.Table('AgenttoAgent')
    response = table.query(
        KeyConditionExpression=Key('Extension').eq(str(Extension))
    )
    return response['Items']


def lambda_handler(event, context):
    Extension = event['Details']['Parameters']['Extension']
    AgentLoginName = get_agent_id(Extension)
    for agent in AgentLoginName:
        print(agent['Extension'], ":", agent['AgentLoginName'])
        
    print(AgentLoginName)
            
    return agent

f:id:swx-shinsaka:20220127122742p:plain

Amazon ConnectへLambda関数利用登録

マネジメントコンソール:Connect画面を操作し、Lambda関数を使用できるように設定します。
対象のConnectインスタンスページ左メニューで [Contact flows] を選択、 [AWS Lambda] セクションで上記手順で作成したLambda関数を選択し、 [Add Lambda Function] をクリックします。

f:id:swx-shinsaka:20220127123743p:plain

顧客キューフロー(AgentQueueFlow)を作成

Connect管理画面へログインし、左メニューから[ルーティング] → [問い合わせフロー]を選択、
コンタクトフローの作成の右側のプルダウンから[顧客キューフロー]を選択します。
※問い合わせフローには種別があり、はじめは少しわかりにくいかもしれません

f:id:swx-shinsaka:20220127124404p:plain

[人員の確認] ブロックを追加します

  • [ブランチ] を選択します
  • [人員の確認] ブロックをドラッグし、キャンパス部へドロップします
  • ブロックをクリックし、[チェックするステータス]へ[利用可能] を指定します

[人員の確認] ブロックの True分岐先へ[プロンプトのループ] ブロックを追加します

  • [操作] を選択します
  • [プロンプトのループ] をドラッグし、キャンバス部へドロップします
  • [人員の確認] ブロックの True分岐先へ接続します
  • ブロックをクリックし、[別のプロンプトをループに追加する]をクリック、[Text to Speech]を選択します
  • 読み上げるテキスト部へ $.External.AgentLoginName さんを呼び出し中です を指定します
  • さらに、[別のプロンプトをループに追加する]をクリック、[Audio recording]を選択します
  • 呼び出し中に再生する保留音を選択します
  • [割り込み] は 1分を設定します

f:id:swx-shinsaka:20220127130049p:plain

[人員の確認] ブロックの False、および、Error分岐先へ[プロンプトのループ] ブロックを追加します

  • [操作] を選択します
  • [プロンプトのループ] をドラッグし、キャンバス部へドロップします
  • [人員の確認] ブロックの False分岐先とError分岐先へ接続します
  • ブロックをクリックし、[別のプロンプトをループに追加する]をクリック、[Text to Speech]を選択します
  • 読み上げるテキスト部へ $.External.AgentLoginName さんはオフライン、または別の電話対応中です を指定します
  • [割り込み] は 4秒を設定します

f:id:swx-shinsaka:20220127130351p:plain

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

  • [終了/転送] を選択します
  • [切断] をドラッグし、キャンバス部へドロップします
  • すべてのブロックのタイムアウト、エラー分岐先へ接続します

顧客キューを保存

フロー名を AgentQueueFlow と指定し、[保存]をクリック、次に、[公開] をクリックし、フローを有効化します。
下記のような状態になります。

f:id:swx-shinsaka:20220127172842p:plain

問い合わせフロー(AgentToAgentCall)を作成

Connect管理画面で、左メニューから[ルーティング] → [問い合わせフロー]を選択、[コンタクトフローの作成]を選択します。

f:id:swx-shinsaka:20220127173123p:plain

[ログ記録動作の設定] ブロックを追加します

  • [設定] を選択します
  • [ログ記録動作の設定] ブロックをドラッグし、キャンパス部へドロップします
  • ブロックをクリックし、[ログ記録の動作]を[有効化] 指定します

※元記事にはありませんが、動作確認時に有用であるため、ログ記録を設定しています

[音声の設定] ブロックを追加します

  • [設定] を選択します
  • [音声の設定] ブロックをドラッグし、キャンパス部へドロップします
  • ブロックをクリックし、下記設定します
項目 設定値
言語 日本語
音声 Takumi
発話スタイルを上書き ニューラル発話スタイル - なし

※このブロックも元記事にはありませんが、日本語動作させるため、設定します。音声はニューラル対応したTakumiを指定しています。

f:id:swx-shinsaka:20220127173634p:plain

[顧客の入力を保存する] ブロックを追加します

内線番号の入力を受付・保存する部分です

  • [操作] を選択します
  • [顧客の入力を保存する] ブロックをドラッグし、キャンパス部へドロップします
  • ブロックをクリックし、下記設定します
項目 設定値 }
プロンプト テキスト読み上げまたはチャットテキスト
テキストの入力 内線番号を入力してください
顧客の入力 カスタム
最大桁数 4

f:id:swx-shinsaka:20220127174334p:plain

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

入力された内線番号をLambda関数でユーザー名に変換する部分です

  • [統合] を選択します
  • [AWS Lambda 関数を呼び出す] ブロックをドラッグし、キャンパス部へドロップします
  • ブロックをクリックし、[関数のARN]へ getAgentLoginNameByExtension を指定します (上記手順で作成したLambda関数名をプルダウンから選択します)
  • [別のパラメータの追加]をクリックし、 [属性を使用する] を選択します。続いて、[宛先キー]へ Extension 、[タイプ]へ システム、 [属性]へ 保存済みの顧客の入力 を指定します

f:id:swx-shinsaka:20220127175132p:plain

[作業キューの設定] ブロックを追加します

Lambdaで判定されたユーザー名を作業キュー(エージェントキュー)として設定する部分です

  • [設定] を選択します
  • [作業キューの設定] ブロックをドラッグし、キャンパス部へドロップします
  • ブロックをクリックし、[出力]を エージェント別に設定、[属性を使用する]を選択します。続いて、[タイプ] へ 外部、[属性]へ AgentLoginNameを指定します

f:id:swx-shinsaka:20220127175701p:plain

[顧客キューフローの設定] ブロックを追加します

上記手順で作成した顧客キューフロー(AgentQueueFlow)を設定する部分です

  • [設定] を選択します
  • [顧客キューフローの設定] ブロックをドラッグし、キャンパス部へドロップします
  • ブロックをクリックし、[フローの選択]を選択し、プルダウンから AgentQueueFlow を選択します

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

  • [終了/転送] を選択します
  • [キューへ転送] ブロックをドラッグし、キャンパス部へドロップします

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

  • [終了/転送] を選択します
  • [切断] ブロックをドラッグし、キャンパス部へドロップします

問い合わせフローを保存

キャンバス部へ配置した各ブロックを接続します。
基本的には[成功] または [Success] 分岐を次のブロックへ接続、[エラー] または [Error] 分岐は、最後の切断ブロックへ接続します。
(本番運用時はエラーハンドリングを検討します)

フロー名を AgentToAgentCall と指定し、[保存]をクリック、次に、[公開] をクリックし、フローを有効化します。
下記のような状態になります。

f:id:swx-shinsaka:20220127180851p:plain

電話番号を取得・問い合わせフロー設定

Connect管理画面で、左メニューから[ルーティング] → [電話番号]を選択し、電話番号を取得、または、取得済みの電話番号を使用して設定します。
オペレータ間通話用の電話番号を取得し、上記問い合わせフロー AgentToAgentCall へ関連付け設定します。
今回はUSの電話番号( +1 )を取得して確認しました。

f:id:swx-shinsaka:20220127181549p:plain

クイック接続を作成

Connect管理画面で、左メニューから[ルーティング] → [クイック接続]を選択、[新規追加]を選択します。
[名前] へ InternalCalling 、[タイプ] へ 外部 、[送信先] へ 上記手順で使用した電話番号を指定します。

f:id:swx-shinsaka:20220127182841p:plain

クイック接続をエージェントへ割り当てる

オペレータ間通話を利用するエージェントが上記のクイック接続を利用できるよう、キューへクイック接続を関連付けます。
たとえば、 BasicQueue キューのクイック接続へ設定すると、BasicQueueがルーティングされるエージェントへクイック接続 InternalCalling が表示されるようになります。

f:id:swx-shinsaka:20220127183540p:plain

f:id:swx-shinsaka:20220127183706p:plain

動作確認

今回は1台のPCで動作確認しました。
複数のPCが準備できれば、発信側・受信側それぞれの音声が分離されるので、動作が分かりやすいと思います。

発信側オペレータログイン

発信側オペレータとして、Amazon Connectへログイン、CCPを起動します。

受信側オペレータログイン

今回の手順で設定した ichiro-suzuki ユーザーとして、Amazon Connectへログイン、CCPを起動します。
今回は1台のPCで実施するため、Chrome プロフィール機能を利用し、別プロフィールでログインします。
ステータスをAvairableに変更しておきます。

発信側オペレータ操作

[クイック接続] をクリック、設定した InternalCalling を選択、[呼び出し] 操作します。
内線番号を聞かれますので、設定したとおり、数値パッドで 1234 を入力します。
この操作によって、受信側オペレータを呼び出します。

受信側オペレータ

着信しますので、通常の通話と同様に [通話を受信]操作し、通話します。

動画で確認

動作確認については動画を準備しました。こちらが分かりやすいかと思います。

youtu.be

注意点

オフィス電話として利用するPBXやビジネスフォンでは内線電話は無料で使えるのが一般的と思いますが、この仕組みの場合は通話ごとにコストが発生します。
動作としては同じAmazon Connectインスタンスへ外線発信、着信通話する仕組みとなっており、利用時間に応じた、Outbound料金・Inbound料金・サービス利用料金が発生します。

また、実際に運用を考えた場合は内線番号とユーザーを関連付けて管理する機能が必要になりますね。

最後に

内線通話を実現するソリューション例ではありますが、仕組みとしては外線通話であるため、外出先から特定のオペレータへの直通電話としても利用できそうですね。

記事としては、画像など入れたため手順としては少し長くなってしまいました。 😓
オペレータ間通話を実現する設定方法のひとつの例としてご参考になれば幸いです。