こんにちは。katoです。
今回は先日Amazon ConnectのAPIに追加されたGetCurrentMetricData APIをご紹介したいと思います。
概要
先日のアップデートでリアルタイムキューメトリクスを取得可能なGetCurrentMetricData APIが追加されました。
これまでは、APIから一括でAmazon Connectのエージェントステータスを取得することができず、amazon-connect-streamsを利用してエージェント個別で現在のステータスを取得し、DBに連携するなどの処理が必要となっておりました。
GetCurrentMetricData APIを利用すれば、DB連携などの手間が必要なく、リアルタイムのエージェントステータスを取得することが可能です。
今回はこのGetCurrentMetricData APIを利用したアウトバウンドコールシステムを構築していきます。
以前からアウトバウンド用のAPIは用意されておりましたが、エージェントステータスのリアルタイム取得ができなかったため、エージェントのステータスに応じた発信を行うことができず、エージェントの不要な待ち時間やエージェントの空き待ちが発生するなどの問題がありました。
GetCurrentMetricData APIを利用することで、エージェントステータスに応じたより優れたアウトバウンドコールシステムを構築することが可能となりました。
手順
それでは実際に構築を行っていきましょう。
今回はエージェントへの転送を行うのみの単純なフローとなっておりますので、Amazon Connect側のセットアップは省略させていただきます。
今回はPython 3.6を利用し、Linux Server上でスクリプトの作成・実行を行っていきます。
2018/9/28現在のLambdaでは最新バージョンのAWS SDK(Boto3)を利用できませんでしたので、ご注意ください。
まずはじめにスクリプトで必要となるパッケージ類をインストールします。
yum install -y https://centos7.iuscommunity.org/ius-release.rpm yum install python36u python36u-libs python36u-devel python36u-pip mkdir /work cd /work pip install boto3 -t /work
次にスクリプトを作成します。
#!/usr/bin/python3.6 import boto3 import json import sys import time connect = boto3.client('connect', region_name='RegionName') filename = sys.argv[1] data = open(filename, "r") lists = data.readlines() print (str(len(lists))+"件のリストに発信します。") count = 0 def agents_status_check(count): if (len(lists) > count): status = connect.get_current_metric_data( InstanceId='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', Filters={ 'Queues': [ 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx' ] }, CurrentMetrics=[ { 'Name': 'AGENTS_AVAILABLE', 'Unit': 'COUNT' }, { 'Name': 'AGENTS_ONLINE', 'Unit': 'COUNT' } ] ) available = status['MetricResults'][0]['Collections'][0]['Value'] online = status['MetricResults'][0]['Collections'][1]['Value'] if (online == 0.0): print ("全てのエージェントがオフラインです。発信を中止します。") sys.exit() if (available == 0.0): print ("利用可能なエージェントが存在しません。10秒後に発信を再開します。") for i in range(int(available)): if (len(lists) <= count): print ("全てのリストへの発信が完了しました。") sys.exit() phonenum = lists[count].replace('\n','') start_outboundcall(phonenum) count += 1 print (str(count)+"番目のリストに発信しています。") time.sleep(10) agents_status_check(count) elif (len(lists) <= count): print ("全てのリストへの発信が完了しました。") def start_outboundcall(phonenum): outbound = connect.start_outbound_voice_contact( DestinationPhoneNumber=phonenum, ContactFlowId='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx', InstanceId='xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx', SourcePhoneNumber='+xxxxxxxxxxxx' ) agents_status_check(count)
スクリプトの内容としては下記の様になります。
①引数から発信先のリストを取得 ②エージェントのステータスを確認(オンラインのユーザがいない場合はここで処理終了) ③ 利用可能(Available)なエージェントの数だけリストの電話番号に発信 ④10秒のスリープを入れて再度ステータスチェック~発信の処理を実行 ⑤リストの件数への発信が完了するまで上記の処理を繰り返します
上記のスクリプトにおいてsleepを用いているのは、発信からエージェントの割り当てまでに少し時間を要するためです。
実際には、発信→通話確立→エージェントへの転送となるため、発信後の待ち時間を適切に管理する必要が御座います。
10秒以上のコールの後に通話が確立した場合などには、利用可能なエージェントの数を超えて転送が発生してしまう場合が御座います。
実際にご利用される場合には、stop_contactの処理を追加するなどして、コールの秒数とsleepの秒数を適切に管理する必要が御座います。
動作確認
それでは実際に動作を見ていきましょう。
今回はリストとして下記の内容を記述したテキストファイルを用意いたしました。
+810000000001 +810000000002 +810000000003
※実際には確認可能な電話番号を記載しています。
上記テキストファイルを引数としてスクリプト実行した結果が下記になります。
2人のエージェントがオンラインとなっていたため、2番目の電話番号まで発信を行い、利用可能なエージェントが存在しない間は発信を待機しています。 エージェントが利用可能な状態となると、発信を再開し、全てのリストへの発信が完了しました。
まとめ
今回はGetCurrentMetricData APIを利用したAmazon Connectのエージェントステータスの取得に関してご紹介しました。
これまではエージェントのステータスを一括で取得することができなかったため、エージェントの管理にかなりの労力が必要となっておりました。
GetCurrentMetricData APIを利用することで、リアルタイムのエージェントステータスを簡単に取得することが可能となりました。
Amazon Connectを利用したコールセンターのシステムなどを構築するうえで、エージェントのステータスを管理することは重要となってきます。
今回ご紹介したアウトバウンドのシステム以外でも様々な用途でご利用いただけると思います。
例えば、インバウンド時にエージェントのステータスをチェックし、利用可能なエージェントが存在しない場合には、自動応答やコールバックのフラグを設定するなどの用途に利用できます。
Amazon Connectを利用したコールセンターのシステムを構築するうえで、必須ともいえるような機能となっておりますので、是非お試しになってみてはいかがでしょうか。