Amazon Connect触发的Kinesis视频流名称不被识别问题排查
我在Amazon Connect中创建了包含Start Streaming Data块的流程,已验证呼叫可触发Kinesis Video Streams的实时音频流。通过AWS CLI命令aws resourcegroupstaggingapi get-resources获取到流ARN如下:
{ "ResourceTagMappingList": [ { "ResourceARN": "arn:aws:kinesisvideo:us-west-2:0123456789012:stream/<my-prefix>-connect-<my-username>-contact-b7443850-6b5b-4def-b3c2-d5b7d92cfc53/1691776084391", "Tags": [ { "Key": "connect:source-type", "Value": "contact" }, { "Key": "connect:instance-id", "Value": <my-connect-instance-id> } ] } ] }
我推断流名称为<my-prefix>-connect-<my-username>-contact-b7443850-6b5b-4def-b3c2-d5b7d92cfc53/1691776084391,但执行AWS CLI命令时出现错误:
aws kinesis describe-stream --stream-name "<my-prefix>-connect-<my-username>-contact-b7443850-6b5b-4def-b3c2-d5b7d92cfc53/1691776084391"
错误信息:
An error occurred (ValidationException) when calling the DescribeStream operation: 1 validation error detected: Value '<prefix>-connect-<username>-contact-fdc70c90-0153-4b78-9012-00316c829524/1691776086035' at 'streamName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-zA-Z0-9_.-]+
我的疑问:
- 此处的流名称到底是什么?
- 若名称正确,为何
describe-stream命令会报错?
注:我的最终目标是搭建一个Go应用以读取实时音频流,需要在呼叫触发时接入对应的Kinesis Video Stream,且不使用AWS Lambda等AWS服务,实现外部应用在流启动时触发并读取音频流。
1. 正确的流名称
Kinesis Video Stream的ARN格式为arn:aws:kinesisvideo:<region>:<account-id>:stream/<stream-name>/<creation-timestamp>,其中斜杠/后的1691776084391是流的创建时间戳,不属于流名称的一部分。
正确的流名称为:<my-prefix>-connect-<my-username>-contact-b7443850-6b5b-4def-b3c2-d5b7d92cfc53
其中b7443850-6b5b-4def-b3c2-d5b7d92cfc53是Amazon Connect的联系ID,用于唯一标识该呼叫对应的流。
2. describe-stream命令报错的原因
你存在两个核心错误:
- 误用命令:你使用的是Kinesis Data Streams的
aws kinesis describe-stream命令,但实际操作的是Kinesis Video Streams,对应的CLI命令应为aws kinesisvideo describe-stream。 - 流名称格式错误:你传入的名称包含了创建时间戳,导致不符合命令要求的正则表达式
[a-zA-Z0-9_.-]+(该规则不允许斜杠/)。
使用正确的命令和流名称即可解决问题,示例命令:
aws kinesisvideo describe-stream --stream-name "<my-prefix>-connect-<my-username>-contact-b7443850-6b5b-4def-b3c2-d5b7d92cfc53" --region us-west-2
3. Go应用读取实时音频流的实现思路
要实现外部Go应用在流启动时触发并读取音频流,可按以下步骤操作:
- 监听流创建事件:通过Amazon EventBridge监听Kinesis Video Stream的创建事件(事件类型为
aws.kinesisvideo),外部应用可通过轮询EventBridge或配置Webhook接收流创建通知。 - 获取流的媒体端点:使用Go SDK中的
kinesisvideo客户端调用GetDataEndpoint接口,获取流的媒体访问端点。 - 读取实时流数据:通过获取的端点,使用
kinesis-video-media客户端调用GetMedia接口,以字节流形式读取实时音频数据。 - 解码音频数据:按照Connect默认的G.711编码格式解码音频数据,完成后续业务逻辑。
注意:需为Go应用配置足够的IAM权限,包括kinesisvideo:DescribeStream、kinesisvideo:GetDataEndpoint、kinesisvideo:GetMedia等。
内容的提问来源于stack exchange,提问作者Kode Charlie

