在Amazon Connect通话结束后触发Java版AWS Lambda进行数据采集
Amazon Connect与Java Lambda集成:通话结束后触发数据采集工作流搭建指南
一、通话终止检测方案
Amazon Connect提供两种可靠的通话结束检测方式,按需选择:
- Contact Flow内置分支:无论用户主动挂断、客服结束通话还是系统中断,通话都会进入联系流的
Disconnect分支。这是最直接的触发点,适合需要在通话结束后立即执行动作的场景。 - EventBridge事件监听:Amazon Connect会向EventBridge发送
contact-ended事件(包含通话终止原因、contact ID等核心信息)。适合不需要实时触发、或者需要批量处理多通话数据的场景。
二、Lambda触发配置与方式
方式1:通过Contact Flow直接触发(推荐实时处理)
这是最常用的触发方式,配置步骤如下:
- 在Lambda控制台,给你的Java Lambda函数添加资源策略,允许Amazon Connect调用它:
{ "Version": "2012-10-17", "Id": "connect-invoke-lambda", "Statement": [ { "Sid": "AllowConnectInvoke", "Effect": "Allow", "Principal": { "Service": "connect.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:你的区域:你的账号ID:function:你的Lambda函数名", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:connect:你的区域:你的账号ID:instance/你的Connect实例ID" } } } ] } - 编辑Amazon Connect的联系流:
- 在流程末尾找到
Disconnect节点,在它之前添加Invoke Lambda Function模块(注意:不要放在Disconnect之后,否则流程已终止无法执行)。 - 选择你的Java Lambda函数,设置传递的参数(比如直接传递
$ContactId系统变量,后续Lambda通过这个ID拉取完整数据)。
- 在流程末尾找到
方式2:通过EventBridge触发(异步/批量处理)
- 在EventBridge控制台创建规则:
- 事件源选择
AWS Connect,事件类型选择contact-ended。 - 目标选择你的Java Lambda函数。
- 事件源选择
- 确保Lambda的执行角色有接收EventBridge事件的权限(默认执行角色通常已包含)。
三、通话数据采集方法
所有核心数据都可以通过两种方式获取:
- Contact Flow传递参数:在调用Lambda时,直接将需要的数据(比如来电ID、自定义属性)通过
Set Contact Attributes设置后,作为参数传递给Lambda。 - 调用Amazon Connect API拉取:通过Lambda调用Connect的API获取完整通话数据,Java环境下使用AWS SDK for Java v2实现。
核心数据采集说明:
- 通话时长:调用
DescribeContactAPI,从ContactDetails.Duration字段获取(单位:秒);或者在通话开始时用Set Contact Attributes记录当前时间戳,结束时计算差值。 - 来电ID:从
CustomerEndpoint.Address字段获取(在DescribeContact返回结果中),或者直接在Contact Flow中传递$CustomerEndpoint.Address变量。 - 自定义属性:调用
GetContactAttributesAPI,传入contact ID即可获取所有通过Set Contact Attributes设置的自定义键值对。
四、Java Lambda代码示例(基于AWS SDK v2)
以下是处理通话结束数据的Java Lambda handler示例,包含调用Connect API拉取数据的逻辑:
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.connect.ConnectClient; import software.amazon.awssdk.services.connect.model.DescribeContactRequest; import software.amazon.awssdk.services.connect.model.DescribeContactResponse; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import java.util.Map; public class ConnectPostCallHandler implements RequestHandler<Map<String, Object>, String> { private final ConnectClient connectClient; public ConnectPostCallHandler() { // 初始化Connect客户端,使用Lambda执行角色的默认权限 this.connectClient = ConnectClient.builder() .region(Region.US_EAST_1) // 替换为你的Connect实例区域 .build(); } @Override public String handleRequest(Map<String, Object> input, Context context) { // 从Contact Flow传递的参数中获取contact ID String contactId = (String) input.get("ContactId"); String connectInstanceId = "你的Connect实例ID"; // 替换为你的实例ID try { // 调用DescribeContact获取通话核心数据 DescribeContactRequest describeRequest = DescribeContactRequest.builder() .instanceId(connectInstanceId) .contactId(contactId) .build(); DescribeContactResponse describeResponse = connectClient.describeContact(describeRequest); // 提取所需数据 String callerId = describeResponse.contact().customerEndpoint().address(); long callDuration = describeResponse.contact().duration(); Map<String, String> customAttributes = describeResponse.contact().attributes(); // 这里添加你的数据处理逻辑(比如写入S3、DynamoDB等) context.getLogger().log("通话结束数据:来电ID=" + callerId + ",时长=" + callDuration + "秒"); context.getLogger().log("自定义属性:" + customAttributes.toString()); return "数据处理完成"; } catch (Exception e) { context.getLogger().log("处理失败:" + e.getMessage()); throw new RuntimeException("数据采集失败", e); } } }
五、关键配置注意事项
- 权限最小化:不要给Lambda执行角色全量的
AmazonConnectFullAccess,建议只添加connect:DescribeContact和connect:GetContactAttributes权限,遵循最小权限原则。 - 区域一致性:确保Connect实例、Lambda函数、EventBridge规则都在同一个AWS区域,避免跨区域调用的延迟和额外费用。
- 错误处理:在Contact Flow的Lambda调用模块中添加错误分支,处理Lambda调用失败的情况(比如重试或记录日志)。
内容的提问来源于stack exchange,提问作者Mahmudul Hasan Shafin
相关产品推荐
相关产品推荐

