【Amazon Connect】不在着信があった際に顧客名をメール通知してみた

【Amazon Connect】不在着信があった際に顧客名をメール通知してみた

Amazon Connect の不在着信時に、発信者番号と DB から取得した顧客名をメール通知する仕組みを実装してみました。Step Functions と EventBridge を使った実装方法をご紹介します。
2026.08.13

はじめに

こんにちは、フニです。
本記事では、Amazon Connect 不在着信があった際に発信者番号とDB顧客名をメール通知する方法についてご紹介します。

全体像

全体像は以下の通りです。
不在着信が発生した場合、AWS Step Functions が発信者番号でDBの顧客名を取得し、メール通知します。

CleanShot 2026-08-13 at 14.11.26@2x.png

解説

Amazon Connect フロー

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

CleanShot 2026-08-13 at 14.14.48@2x.png

Amazon Connect 顧客キュー

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

https://dev.classmethod.jp/articles/amazon-connect-timeout-queue/

CleanShot 2026-08-13 at 14.18.03@2x.png

CleanShot 2026-08-13 at 14.18.37@2x.png

Amazon DynamoDB

DBにサンプルデータを入れておきました。
以下はデータ投入の際に利用したサンプル CLI です。

aws dynamodb put-item \
  --table-name <DynamoDB名> \
  --item '{
    "phonenumber": {"S": "+817012345678"},
    "customername": {"S": "YAMADA TARO"}
  }'

CleanShot 2026-08-13 at 14.25.46@2x.png

AWS Step Functions

以下のフローで実装しました。
サンプルコードは、以下を環境に合わせて変更する必要があります。

  • <ConnectインスタンスID>
  • <DynamoDB名>
  • <AWSアカウントID>
  • <SNSトピック名>

CleanShot 2026-08-13 at 14.28.25@2x.png

{
  "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が存在しない場合、オペレータとの電話が繋がってないと判断します。

CleanShot 2026-08-13 at 15.12.23@2x.png

{
  "source": ["aws.connect"],
  "detail-type": ["Amazon Connect Contact Event"],
  "detail": {
    "eventType": ["COMPLETED"],
    "agentInfo": {
      "connectedToAgentTimestamp": [{
        "exists": false
      }]
    }
  }
}

ターゲットには AWS Step Functions を登録します。

CleanShot 2026-08-13 at 14.23.41@2x.png

結果

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

CleanShot 2026-08-13 at 14.36.00@2x.png

注意点

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/contact-events.html#subscribe-contact-events

Amazon Connectのコンタクトイベントは基本的にEventBridgeに送信されますが、配信はベストエフォート方式で行われます。

稀に取りこぼしが発生するため、100% の確実性が求められるケースでは別の仕組み(例えば Amazon Kinesis Data Streams など)の利用も検討してください。

別の仕組みについては、以下のブログ記事を参考ください。

https://dev.classmethod.jp/articles/amazon-eventbridge-not-triggering-connect-events/

さいごに

今回は、Amazon Connect 不在着信があった際に発信者番号とDB顧客名をメール通知する方法についてご紹介しました。
不在着信があった際に、顧客名と電話番号などをメールで通知できるので、折り返しの際に実用的な機能かと思います。
この記事が誰かの助けになれば幸いです。

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事