【Amazon Connect】不在着信があった際に顧客名をメール通知してみた
はじめに
こんにちは、フニです。
本記事では、Amazon Connect 不在着信があった際に発信者番号とDB顧客名をメール通知する方法についてご紹介します。
全体像
全体像は以下の通りです。
不在着信が発生した場合、AWS Step Functions が発信者番号でDBの顧客名を取得し、メール通知します。

解説
Amazon Connect フロー
今回は、以下のエージェントに繋ぐシンプルなフローを利用します。

Amazon Connect 顧客キュー
今回は、オペレータが留守だった場合の不在着信シナリオを仮定します。
30秒が経過したら電話が切断されるよう、顧客キューの設定を実施します。
なぜこの設定が必要かについては以下のブログをご参照ください。


Amazon DynamoDB
DBにサンプルデータを入れておきました。
以下はデータ投入の際に利用したサンプル CLI です。
aws dynamodb put-item \
--table-name <DynamoDB名> \
--item '{
"phonenumber": {"S": "+817012345678"},
"customername": {"S": "YAMADA TARO"}
}'

AWS Step Functions
以下のフローで実装しました。
サンプルコードは、以下を環境に合わせて変更する必要があります。
- <ConnectインスタンスID>
- <DynamoDB名>
- <AWSアカウントID>
- <SNSトピック名>

{
"Comment": "Amazon Connect コンタクトフロー不在着信検知 -> DynamoDB 顧客情報照会 -> SNS メール通知",
"StartAt": "コンタクト情報取得",
"States": {
"コンタクト情報取得": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:connect:describeContact",
"Parameters": {
"InstanceId": "<ConnectインスタンスID>",
"ContactId.$": "$.detail.contactId"
},
"ResultPath": "$.contactInfo",
"Retry": [
{
"ErrorEquals": [
"Connect.InternalServiceException",
"States.Timeout"
],
"IntervalSeconds": 2,
"MaxAttempts": 3,
"BackoffRate": 2
}
],
"Catch": [
{
"ErrorEquals": [
"States.ALL"
],
"ResultPath": "$.error",
"Next": "エラー通知"
}
],
"Next": "電話番号存在チェック"
},
"電話番号存在チェック": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.contactInfo.Contact.CustomerEndpoint.Address",
"IsPresent": true,
"Next": "DynamoDB検索"
}
],
"Default": "電話番号未取得"
},
"電話番号未取得": {
"Type": "Task",
"Resource": "arn:aws:states:::sns:publish",
"Parameters": {
"TopicArn": "arn:aws:sns:ap-northeast-1:<AWSアカウントID>:<SNSトピック名>",
"Subject": "Amazon Connect 通知エラー: 電話番号未取得",
"Message.$": "States.Format('ContactId: {} の CustomerEndpoint.Address が取得できませんでした。', $.detail.contactId)"
},
"End": true
},
"DynamoDB検索": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:getItem",
"Parameters": {
"TableName": "<DynamoDB名>",
"Key": {
"phonenumber": {
"S.$": "$.contactInfo.Contact.CustomerEndpoint.Address"
}
}
},
"ResultPath": "$.dynamoItem",
"Retry": [
{
"ErrorEquals": [
"DynamoDB.ProvisionedThroughputExceededException",
"DynamoDB.RequestLimitExceeded"
],
"IntervalSeconds": 2,
"MaxAttempts": 3,
"BackoffRate": 2
}
],
"Catch": [
{
"ErrorEquals": [
"States.ALL"
],
"ResultPath": "$.error",
"Next": "エラー通知"
}
],
"Next": "顧客情報存在チェック"
},
"顧客情報存在チェック": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.dynamoItem.Item",
"IsPresent": true,
"Next": "顧客名設定"
}
],
"Default": "顧客名未設定"
},
"顧客名設定": {
"Type": "Pass",
"Parameters": {
"value.$": "$.dynamoItem.Item.customername.S"
},
"ResultPath": "$.customerName",
"Next": "メール通知"
},
"顧客名未設定": {
"Type": "Pass",
"Parameters": {
"value": "未登録"
},
"ResultPath": "$.customerName",
"Next": "メール通知"
},
"メール通知": {
"Type": "Task",
"QueryLanguage": "JSONata",
"Resource": "arn:aws:states:::sns:publish",
"Arguments": {
"TopicArn": "arn:aws:sns:ap-northeast-1:<AWSアカウントID>:<SNSトピック名>",
"Subject": "Amazon Connect 不在着信通知",
"Message": "{% 'ContactId:' & $states.input.detail.contactId & '\n発生時刻:' & $fromMillis($toMillis($states.input.time), '[Y0001]-[M01]-[D01] [H01]:[m01]:[s01]', '+0900') & ' JST\n\n顧客名:' & $states.input.customerName.value & '\n電話番号:' & $states.input.contactInfo.Contact.CustomerEndpoint.Address & '\n\n不在着信がありました。担当者は折り返しの電話を実施してください。' %}"
},
"End": true
},
"エラー通知": {
"Type": "Task",
"Resource": "arn:aws:states:::sns:publish",
"Parameters": {
"TopicArn": "arn:aws:sns:ap-northeast-1:<AWSアカウントID>:<SNSトピック名>",
"Subject": "StepFunctions 実行失敗",
"Message.$": "States.Format('ステートマシンの処理中にエラーが発生しました。Error: {}', $.error.Error)"
},
"Next": "処理失敗"
},
"処理失敗": {
"Type": "Fail",
"Error": "ProcessingFailed",
"Cause": "DescribeContact または DynamoDB GetItem でエラーが発生しました。"
}
}
}
AWS Step Functions の IAM ロール側には、以下の権限を追加で付与してください。
本番環境などでは、ワイルドカードではなく、リソースを絞ることを推奨します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "connect:DescribeContact",
"Resource": "arn:aws:connect:ap-northeast-1:*:instance/*/contact/*"
}
]
}
Amazon EventBridge
イベントパターンには以下のように設定します。
connectedToAgentTimestampが存在しない場合、オペレータとの電話が繋がってないと判断します。

{
"source": ["aws.connect"],
"detail-type": ["Amazon Connect Contact Event"],
"detail": {
"eventType": ["COMPLETED"],
"agentInfo": {
"connectedToAgentTimestamp": [{
"exists": false
}]
}
}
}
ターゲットには AWS Step Functions を登録します。

結果
電話番号に発信し、30秒のタイムアウトを再現、不在着信のメール通知を検証しました。
結果、メール本文には電話番号とDBの顧客名が含まれていることがわかります。

注意点
Amazon Connectのコンタクトイベントは基本的にEventBridgeに送信されますが、配信はベストエフォート方式で行われます。
稀に取りこぼしが発生するため、100% の確実性が求められるケースでは別の仕組み(例えば Amazon Kinesis Data Streams など)の利用も検討してください。
別の仕組みについては、以下のブログ記事を参考ください。
さいごに
今回は、Amazon Connect 不在着信があった際に発信者番号とDB顧客名をメール通知する方法についてご紹介しました。
不在着信があった際に、顧客名と電話番号などをメールで通知できるので、折り返しの際に実用的な機能かと思います。
この記事が誰かの助けになれば幸いです。







