【Amazon Connect】エラー時の顧客情報をメール通知してみた
はじめに
こんにちは、フニです。
本記事では、Amazon Connect フローでエラーが発生した際に、顧客情報をメール通知する方法についてご紹介します。
全体像
全体像は以下の通りです。
エラーなどの例外処理を、AWS Step Functions が発信者番号でDBの顧客名を取得し、メール通知します。
これにより、どの顧客との電話でエラーが発生したのか特定しやすくなります。

解説
Amazon Connect フロー
AWS Lambda 関数ブロックでエラーを起こし、error:trueコンタクトタグを付与するフローです。


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 コンタクトタグ error=true を検知 -> DescribeContact の CustomerEndpoint.Address で電話番号を取得 -> 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": "connect-error-test-sfn 実行失敗",
"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
イベントパターンには以下のように設定します。
フローのコンタクトタグに、errorがtrueの場合、エラーが発生したと判断します。

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

結果
電話番号に発信すると、設定しておいたエラーの案内音声が流れてきました。
メール本文には電話番号とDBの顧客名が含まれていることがわかります。

注意点
Amazon Connectのコンタクトイベントは基本的にEventBridgeに送信されますが、配信はベストエフォート方式で行われます。
稀に取りこぼしが発生するため、100% の確実性が求められるケースでは別の仕組み(例えば Amazon Kinesis Data Streams など)の利用も検討してください。
別の仕組みについては、以下のブログ記事を参考ください。
さいごに
Amazon Connect フローでエラーが発生した際に、顧客情報をメール通知する方法についてご紹介しました。
エラーが発生した時に、どの顧客が混乱していたか把握できて、折り返しの電話に繋げられるので顧客満足にもつながるかと思います。
今回はエラーで解説しましたが、他にもコンタクトタグを活用すると例外処理といったことが可能ですので汎用的に活用できます。
ContactIdから属性を取得し、DBとの処理が必要な場合などは、このアーキテクチャも検討できるかと思います。
この記事が誰かの助けになれば幸いです。







