📝
Amazon Connect のデータストリーミングのデータを Lambda で取得してみた
Enable data streaming for your Amazon Connect instance - Amazon Connect
以下の構成を試してみました。
前提
- リージョン: バージニア北部
- Amazon Connect インスタンス作成済み
- 電話番号取得済み
01. データストリームの作成
データストリーム名のみ入力し、その他設定はデフォルトで作成します。
02. Lambda 関数の作成
以下の内容で作成します。
- ランタイム: Python 3.13
- 実行ロールの権限: AdministratorAccess
- コード
import json
import base64
import logging
# ログレベルを設定
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def lambda_handler(event, context):
logger.info("Lambda function started")
for record in event['Records']:
payload = base64.b64decode(record['kinesis']['data'])
data = json.loads(payload)
logger.info(f"Connect Data: {json.dumps(data, indent=2)}")
return {
'statusCode': 200,
'body': json.dumps('Successfully processed records')
}
上記コードデプロイ後、Lambda トリガーに手順 01 のデータストリームを指定します。
トリガーの設定はデフォルトで OK です。
03. Amazon Connect インスタンスでデータストリーミングを有効化
Amazon Connect インスタンスでデータストリーミングを有効化します。
04. コンタクトフローの作成
以下の内容で作成します。
- ログ記録動作の設定
- 音声の設定: 日本語
- プロンプトの再生: テキスト読み上げまたはチャットテキスト
こんにちは。データストリーミングのテストです。
コンタクトフローの公開後、電話番号を上記フローに紐づけます。
05. 動作確認
CCP から上記電話番号に架電し、プロンプトが再生されれば OK です。
切電後、CloudWatch Logs に Lambda 関数の実行ログが出力されています。
{
"AWSAccountId": "012345678901",
"AgentARN": "arn:aws:connect:us-east-1:012345678901:instance/3d725830-a4c0-4e1d-8514-d94b67a0ed87/agent/966a5995-ff79-4e12-a09f-f93ec70e9001",
"CurrentAgentSnapshot": {
"AgentStatus": {
"ARN": "arn:aws:connect:us-east-1:012345678901:instance/3d725830-a4c0-4e1d-8514-d94b67a0ed87/agent-state/45d8f3a6-827e-4232-85bd-95cd8bdfa8f8",
"Name": "Available",
"StartTimestamp": "2025-07-16T01:16:30.363Z",
"Type": "ROUTABLE"
},
"Configuration": {
"AgentHierarchyGroups": null,
"AutoAccept": false,
"FirstName": "xxx",
"LanguageCode": "ja_JP",
"LastName": "xxx",
"Proficiencies": [],
"RoutingProfile": {
"ARN": "arn:aws:connect:us-east-1:012345678901:instance/3d725830-a4c0-4e1d-8514-d94b67a0ed87/routing-profile/68b91a77-1625-4467-9310-7892ed7115a0",
"Concurrency": [
{
"AvailableSlots": 0,
"Channel": "CHAT",
"CurrentAvailableSlots": 0,
"MaximumSlots": 2
},
{
"AvailableSlots": 0,
"Channel": "TASK",
"CurrentAvailableSlots": 0,
"MaximumSlots": 1
},
{
"AvailableSlots": 0,
"Channel": "VOICE",
"CurrentAvailableSlots": 0,
"MaximumSlots": 1
}
],
"DefaultOutboundQueue": {
"ARN": "arn:aws:connect:us-east-1:012345678901:instance/3d725830-a4c0-4e1d-8514-d94b67a0ed87/queue/7201f89c-93da-4859-8d46-5e3dff9a613e",
"Channels": ["VOICE"],
"Name": "BasicQueue"
},
"InboundQueues": [
{
"ARN": "arn:aws:connect:us-east-1:012345678901:instance/3d725830-a4c0-4e1d-8514-d94b67a0ed87/queue/7201f89c-93da-4859-8d46-5e3dff9a613e",
"Channels": ["CHAT", "TASK", "VOICE"],
"Name": "BasicQueue"
},
{
"ARN": "arn:aws:connect:us-east-1:012345678901:instance/3d725830-a4c0-4e1d-8514-d94b67a0ed87/queue/agent/966a5995-ff79-4e12-a09f-f93ec70e9001",
"Channels": ["CHAT", "TASK", "VOICE"],
"Name": null
}
],
"Name": "Basic Routing Profile"
},
"SipAddress": "",
"Username": "xxx"
},
"Contacts": [
{
"Channel": "VOICE",
"ConnectedToAgentTimestamp": "2025-07-16T01:18:02.190Z",
"ContactId": "badb0a74-30e5-4570-aa17-a5b469be7d91",
"InitialContactId": "badb0a74-30e5-4570-aa17-a5b469be7d91",
"InitiationMethod": "OUTBOUND",
"Queue": {
"ARN": "arn:aws:connect:us-east-1:012345678901:instance/3d725830-a4c0-4e1d-8514-d94b67a0ed87/queue/7201f89c-93da-4859-8d46-5e3dff9a613e",
"Name": "BasicQueue"
},
"QueueTimestamp": null,
"State": "CONNECTED",
"StateStartTimestamp": "2025-07-16T01:18:02.247Z"
}
],
"NextAgentStatus": null
},
"EventId": "f777283c-d9c2-4222-97bd-205f2b27791d",
"EventTimestamp": "2025-07-16T01:18:02.248Z",
"EventType": "STATE_CHANGE",
"InstanceARN": "arn:aws:connect:us-east-1:012345678901:instance/3d725830-a4c0-4e1d-8514-d94b67a0ed87",
"PreviousAgentSnapshot": {
"AgentStatus": {
"ARN": "arn:aws:connect:us-east-1:012345678901:instance/3d725830-a4c0-4e1d-8514-d94b67a0ed87/agent-state/45d8f3a6-827e-4232-85bd-95cd8bdfa8f8",
"Name": "Available",
"StartTimestamp": "2025-07-16T01:16:30.363Z",
"Type": "ROUTABLE"
},
"Configuration": {
"AgentHierarchyGroups": null,
"AutoAccept": false,
"FirstName": "xxx",
"LanguageCode": "ja_JP",
"LastName": "xxx",
"Proficiencies": [],
"RoutingProfile": {
"ARN": "arn:aws:connect:us-east-1:012345678901:instance/3d725830-a4c0-4e1d-8514-d94b67a0ed87/routing-profile/68b91a77-1625-4467-9310-7892ed7115a0",
"Concurrency": [
{
"AvailableSlots": 0,
"Channel": "CHAT",
"CurrentAvailableSlots": 0,
"MaximumSlots": 2
},
{
"AvailableSlots": 0,
"Channel": "TASK",
"CurrentAvailableSlots": 0,
"MaximumSlots": 1
},
{
"AvailableSlots": 0,
"Channel": "VOICE",
"CurrentAvailableSlots": 0,
"MaximumSlots": 1
}
],
"DefaultOutboundQueue": {
"ARN": "arn:aws:connect:us-east-1:012345678901:instance/3d725830-a4c0-4e1d-8514-d94b67a0ed87/queue/7201f89c-93da-4859-8d46-5e3dff9a613e",
"Channels": ["VOICE"],
"Name": "BasicQueue"
},
"InboundQueues": [
{
"ARN": "arn:aws:connect:us-east-1:012345678901:instance/3d725830-a4c0-4e1d-8514-d94b67a0ed87/queue/7201f89c-93da-4859-8d46-5e3dff9a613e",
"Channels": ["CHAT", "TASK", "VOICE"],
"Name": "BasicQueue"
},
{
"ARN": "arn:aws:connect:us-east-1:012345678901:instance/3d725830-a4c0-4e1d-8514-d94b67a0ed87/queue/agent/966a5995-ff79-4e12-a09f-f93ec70e9001",
"Channels": ["CHAT", "TASK", "VOICE"],
"Name": null
}
],
"Name": "Basic Routing Profile"
},
"SipAddress": "",
"Username": "xxx"
},
"Contacts": [
{
"Channel": "VOICE",
"ConnectedToAgentTimestamp": null,
"ContactId": "badb0a74-30e5-4570-aa17-a5b469be7d91",
"InitialContactId": "badb0a74-30e5-4570-aa17-a5b469be7d91",
"InitiationMethod": "OUTBOUND",
"Queue": {
"ARN": "arn:aws:connect:us-east-1:012345678901:instance/3d725830-a4c0-4e1d-8514-d94b67a0ed87/queue/7201f89c-93da-4859-8d46-5e3dff9a613e",
"Name": "BasicQueue"
},
"QueueTimestamp": null,
"State": "CONNECTING",
"StateStartTimestamp": "2025-07-16T01:17:54.944Z"
}
],
"NextAgentStatus": null
},
"Version": "2017-10-01"
}
上記データからリアルタイムにコンタクトを分析することができますが、今回は分析までは行いません。
リアルタイムモニタリングの方法については AWS 公式ブログなどをご参照ください。
- Amazon Timestream を使って Amazon Connect のリアルタイムモニタリングを実現する方法 | Amazon Web Services ブログ
- Amazon Connect と データ分析で実現する
顧客導線の見える化
まとめ
今回は Amazon Connect のデータストリーミングのデータを Lambda で取得してみました。
どなたかの参考になれば幸いです。
Discussion