Lambda + Kinesis Data Streams で Amazon Connect のエージェントの不在着信をEメールに送信してみた

アノテーションのスライマンです。
今回は Amazon Connect のエージェントイベントストリームを活用して、エージェントが不在着信の際に Eメールに送信する仕組みを作っていきたいと思います。
Amazon Connect の CloudWatch メトリクスには MissedCalls というメトリクスがありますが、こちらのメトリクスではどのエージェントが不在着信をしているのか判別することはできません。
そこで、どのエージェントが不在着信をしているのかを把握するためには、別の手段を取る必要がございます。
Amazon Connect ではエージェントのイベントストリームが存在しており、エージェントのアクティビティをほぼリアルタイムでレポートすることができます。
このエージェントのイベントストリームには、エージェントが MISSED (不在の状態)状態のイベントが含まれており、こちらのイベントで不在着信をしているエージェントを把握することができます。

構成図

構成は下記の通りとなります。

Amazon Connect のエージェントのイベントストリームを Kinesis Data Streams (KDS) で処理します。
イベントストリームが KDS で処理されていることをトリガーに Lambda が起動します。
Lambda では MISSED 状態のイベントが含まれているかどうかを判別して、MISSED 状態のイベントが含まれている場合は、SNS Topic より Eメールに通知します。

概要

下記の手順で必要なリソースを作成、設定していきます。

  • Kinesis Data Streams の作成
  • Amazon Connect の設定(インスタンス、番号取得、問い合わせフローの設定、データストリーミングの有効化)
  • SNS Topic の作成
  • Lambda 関数の作成

必要なリソースを準備した後、実際に動作を確認していきたいと思います。

実際にやってみた

Kinesis Data Streams の作成

Amazon Kinesis にてデータストリームを作成します。
下記の通り、データストリーム名を任意で記載して、容量はプロビジョンドを選択します。
この設定でデータストリームを作成します。

Amazon Connect の設定(インスタンス、番号取得、問い合わせフローの設定、データストリーミングの有効化)

Amazon Connect のリソース作成について、本記事では、既に作成している前提として、進めていきます。
Amazon Connect 環境の構築については、下記のブログ記事をご参照ください。

利用する問い合わせフローは下記となります。
内容はシンプルで、電話を受けた際に、「お電話いただきまして、ありがとうございます。」のメッセージが再生され、設定したキューへ転送する流れとなります。
利用するキューもデフォルトで用意されている BasicQueue を利用しています。

今回は、データストリーミングによる連携を実施するため、データストリーミングの設定を有効化する必要があります。
マネジメントコンソールの Amazon Connect インスタンスのページへ進み、データストリーミングの項目で、有効化にクリックします。
その後、先程作成したデータストリームをエージェントイベントに設定して、保存します。

SNS Topic の作成

SNS トピックを作成します。
下記の通り、スタンダードタイプで作成していきます。

次に、サブスクリプションを作成します。
今回はメールに送信するため、プロトコルを Eメールと選択して、エンドポイントに送信先 Eメールを記載します。
サブスクリプションを作成後、確認する必要があるので、該当メールにて確認メールが届いているので、「Confirm Subscription」をクリックします。
その後、サブスクリプションのステータスを確認して「確認済み」になっている場合は、設定完了です。

Lambda 関数の作成

Lambda 関数を作成します。
名前を選択して、ランタイムを Python 3.11 と選択します。
それ以外の設定はデフォルトのままで、関数を作成していきます。

Kinesis Data Streams と SNS との連携をするため、Lambda 実行ロールに下記の IAM ポリシーを追記していきます。

  • AWSLambdaKinesisExecutionRole →Kinesis用
  • 下記のインラインポリシー(例:sns-publish-policy)→SNS用
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": "sns:Publish",
            "Resource": "*"
        }
    ]
}

既存のポリシーに加え、上記の2つを追加して、下記のように3つ存在していれば問題ありません。

続いて、Lambda のトリガーを設定していきます。
下記のように、Kinesis を選択して、作成したデータストリームを選択します。
それ以外の設定はデフォルトのままで、作成します。

コードの設定をしていきます。
今回は Python を利用しました。
下記の通りとなります。

import base64
import json
import boto3
import os
from datetime import datetime
from zoneinfo import ZoneInfo

def lambda_handler(event, context):
    client = boto3.client('sns')
    arn_sns = os.environ['TOPIC_ARN']

    for record in event['Records']:
        # Decode the Kinesis data
        payload = base64.b64decode(record["kinesis"]["data"]).decode('utf-8')
        data = json.loads(payload)

        # Check agent event stream
        for contact in data['CurrentAgentSnapshot']['Contacts']:
            if contact['State'] == 'MISSED':
                state_start_timestamp = contact['StateStartTimestamp']
                username = data['CurrentAgentSnapshot']['Configuration']['Username']

                # Convert timestamp from UTC to JST
                timestamp_date = datetime.strptime(state_start_timestamp, "%Y-%m-%dT%H:%M:%S.%fZ")
                timestamp_utc = timestamp_date.astimezone(ZoneInfo("UTC")) 
                timestamp_jst = timestamp_utc.astimezone(ZoneInfo("Asia/Tokyo")) 

                # Create the message and subject for email
                message = f"Amazon Connect からのお知らせです。\n状態:MISSED\n発生時間:{timestamp_jst}\nエージェント名:{username}"
                subject = "不在着信のお知らせ (Amazon Connect)"

                # Publish the message
                response = client.publish(
                    TopicArn=arn_sns,
                    Message=message,
                    Subject=subject,
                )

実施される処理は下記となります。

  • Kinesis のデータを Decode する
  • エージェントイベントストリーム内に MISSED の State が存在しているかを判別する
  • MISSED の State が存在している場合は、下記の処理が行われます。
  • タイムスタンプを UTC から JST に変換
  • タイムスタンプおよびエージェント名が含まれる不在着信に関する通知を作成する
  • 作成した通知をEメールに送信する

MISSED (不在の着信)の情報は State に含まれており、CurrentAgentSnapshot 内の Contacts より取得することができます。
StateStartTimestamp (開始時間)の情報も同じく、CurrentAgentSnapshot 内の Contacts より取得することができます。
Username(エージェント名)の情報は CurrentAgentSnapshot 内の Configuration より取得することができます。
エージェントイベントストリームで取得できるイベントについては、下記のドキュメントをご参照ください。

最後に SNS トピックの環境変数を設定します。

キー:TOPIC_ARN
値:arn:aws:sns:<region>:<accountid>:Connect-lambda

動作確認

Amazon Connect の電話番号に発信して、不在着信を発生させ、動作を確認します。
不在着信が発生した後、ほぼリアルタイムで下記の通知をEメールで確認しましたので、正常に動作していることがわかります。

参考情報

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。