【ZeroRange WebRTC】Amazon Kinesis Video Streams WebRTC Data Plane REST API 深度解析

基于官方文档与 amazon-kinesis-video-streams-webrtc-sdk-c-main 源码(v1.7.0+)


1. 职责定位

维度 说明
所属平面 Data Plane REST(信令数据面 REST)
主要用途 1. 获取短期 STUN/TURN 列表与临时凭证(GetIceServerConfig) 2. 存储会话管理(JoinStorageSession / UpdateStorageSession) 3. 支持录制与回放场景
协议 HTTPS(TLS 1.2+)+ SigV4 签名
终端节点 GetSignalingChannelEndpoint 返回的 ResourceEndpointList.Protocol=HTTPS
幂等性 全部幂等
默认配额 5--20 TPS/Region/Channel(见下表)

2. 接口速览

API 典型调用者 幂等 默认配额 SDK 封装函数
GetIceServerConfig 所有客户端 20 TPS getIceConfigLws()
JoinStorageSession 存储场景 Master 5 TPS joinStorageSessionLws()
UpdateStorageSession 运维/存储场景 5 TPS updateStorageSessionLws()

配额提升路径:AWS Support → Service Quotas → Kinesis Video Streams


3. 端到端交互时序

Client (SDK) Data-Plane Endpoint (HTTPS) KVS Signaling Service 1. 获取终端(控制面已完成) POST /getIceServerConfig {ChannelARN, ClientId} 200 {IceServerList:[{Username,Password,Ttl,Uris:[...]}]} 2. 存储场景(可选) POST /joinStorageSession {ChannelARN} 200 {StorageStatus:ENABLED} alt [enableMediaStorage] Client (SDK) Data-Plane Endpoint (HTTPS) KVS Signaling Service


4. 请求/响应详解

4.1 GetIceServerConfig

  • Method : POST
  • URI : /{AccountId}/channel/{ChannelARN}/getIceServerConfig
  • Body:
json 复制代码
{
  "ChannelARN": "arn:aws:kinesisvideo:us-east-1:123456789012:channel/myChannel/12345678901234567",
  "ClientId": "web-123",          // 可选,用于审计
  "Service": "TURN"               // 固定值
}
  • Response:
json 复制代码
{
  "IceServerList": [
    {
      "Username": "1600000000:abc123",
      "Password": "def456...",
      "Ttl": 86400,
      "Uris": [
        "turns:turn-12345678.kinesisvideo.us-east-1.amazonaws.com:443?transport=tcp",
        "turn:turn-12345678.kinesisvideo.us-east-1.amazonaws.com:3478?transport=udp"
      ]
    }
  ]
}

4.2 JoinStorageSession(可选)

  • URI : /joinStorageSession
  • Body:
json 复制代码
{
  "ChannelARN": "arn:aws:kinesisvideo:us-east-1:123456789012:channel/myChannel/12345678901234567"
}
  • Response:
json 复制代码
{
  "StorageStatus": "ENABLED",
  "StorageSessionARN": "arn:aws:kinesisvideo:us-east-1:123456789012:storage-session/..."
}

5. SigV4 签名与终端拼装

  • 终端来源:GetSignalingChannelEndpoint 返回的 ResourceEndpointList.Protocol=HTTPS
  • 签名入口:createRequestInfo()generateSignature() @ <src/source/Common/Auth.c>
  • 关键头:
http 复制代码
Authorization: AWS4-HMAC-SHA256 Credential=AKIA.../20251114/us-east-1/kinesisvideo/aws4_request, SignedHeaders=host;x-amz-date, Signature=...
X-Amz-Date: 20251114T123456Z
X-Amz-Security-Token: <session-token>

6. 源码级映射(amazon-kinesis-video-streams-webrtc-sdk-c-main)

API SDK 封装函数 HTTPS 实现 状态机推进 关键日志
GetIceServerConfig getIceConfig() getIceConfigLws() @ LwsApiCalls.c:1188 SIGNALING_STATE_GET_ICE_CONFIGCONNECT IceServerList/Ttl
JoinStorageSession joinStorageSession() joinStorageSessionLws() @ LwsApiCalls.c:1570 存储场景下调用 StorageStatus:ENABLED
UpdateStorageSession updateStorageSession() updateStorageSessionLws() @ LwsApiCalls.c:1600 运行时更新存储配置 StorageStatus:UPDATED

所有请求统一走 lwsCompleteSync()lwsHttpCallbackRoutine(),JSON 拼装模板见 LwsApiCalls.h:131-144


7. JSON 模板与字段说明

7.1 IceServerConfig 模板(src/source/Signaling/LwsApiCalls.h)

c 复制代码
#define SIGNALING_ICE_SERVER_LIST_TEMPLATE_START ",\n\t\"IceServerList\": ["
#define SIGNALING_ICE_SERVER_TEMPLATE \
    "\n\t\t{\n" \
    "\t\t\t\"Password\": \"%s\",\n" \
    "\t\t\t\"Ttl\": %" PRIu64 ",\n" \
    "\t\t\t\"Uris\": [%s],\n" \
    "\t\t\t\"Username\": \"%s\"\n" \
    "\t\t},"

7.2 字段含义

字段 类型 说明
Username string 临时用户名,格式 {unixTime}:{random}
Password string 基于 AWS 签名密钥派生,有效期 = Ttl
Ttl long 凭证有效期(秒),默认 24 h
Uris array 支持 turn:turns:,端口 3478/443

8. 重试与退避

  • 指数退避:初始 100 ms → 最大 30 s,因子 1.5
  • 幂等:相同 ChannelARN+ClientId 多次调用返回相同结果
  • 时钟偏差:> 5 min 返回 RequestTimeTooSkewed,SDK 自动校正

9. IAM 最小权限模板

json 复制代码
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "kinesisvideo:GetIceServerConfig",
        "kinesisvideo:JoinStorageSession",
        "kinesisvideo:UpdateStorageSession"
      ],
      "Resource": "arn:aws:kinesisvideo:*:*:channel/myAppPrefix*"
    }
  ]
}

10. 日志关键词与快速检索

bash 复制代码
# IceServerConfig
grep -E "getIceConfigLws|IceServerList|Ttl" master.log

# 存储会话
grep -E "joinStorageSessionLws|StorageStatus" master.log

# SigV4 头
grep -E "Authorization:|X-Amz-Date:" master.log

# 时钟偏差
grep "Clock skew" master.log

11. 常见错误与处置

HTTP 错误名 根因 排查
403 AccessDenied IAM/签名/时钟 核对 IAM、Region、NTP
404 ResourceNotFound ChannelARN 错误 ARN 与终端 Region 一致
400 ThrottlingException 超配额 控制台提升 TPS;退避已内置
400 RequestTimeTooSkewed 时钟 > 5 min 容器/VM 时区同步

12. 小结

  • 职责:Data-Plane REST 仅负责"网络配置获取"与"存储会话管理",不承载媒体与信令消息
  • 安全:TLS + SigV4 + 短期凭证,独立配额与审计
  • 可靠:幂等 + 指数退避 + 自动时钟校正
  • 易用:JSON 模板透明,SDK 封装拼装/重试/错误处理

附录:引用源码(行号随版本略有浮动)


如需 PlantUML 高清时序图、CloudWatch Insights 查询模板或一键 IAM 策略生成脚本,请告诉我!

相关推荐
张人玉5 小时前
技术开发文档:MES 系统与西门子 PLC 通信软件集成方案
https·c#·plc·mes系统·西门子s7
00后程序员张7 小时前
HTTPS Everywhere 时代的抓包挑战,从加密流量解析到底层数据流捕获的全流程方案
网络协议·http·ios·小程序·https·uni-app·iphone
似水流年QC11 小时前
深入理解 WebRTC:实时音视频通信的原理与实现全流程
webrtc·实时音视频
三十_A11 小时前
WebRTC 入门:一分钟理解一对多直播的完整实现流程
webrtc
2501_9159214314 小时前
Bundle Id 创建与管理的工程化方法,一次团队多项目协作中的流程重构
服务器·ios·小程序·重构·https·uni-app·iphone
2501_9159090616 小时前
深度解析 iOS 内存占用,构建多工具协同的内存诊断、监控与优化体系
android·ios·小程序·https·uni-app·iphone·webview
2501_9159184117 小时前
iOS CPU 使用率深度分析,多工具协同定位高占用瓶颈的工程化方法
android·ios·小程序·https·uni-app·iphone·webview
network_tester1 天前
IXIA XM2网络测试仪电源模块损坏维修方法详解
网络·网络协议·tcp/ip·http·https·信息与通信·信号处理
成空的梦想1 天前
除了加密,它还能验明正身:SSL如何防范网络钓鱼?
网络·https·ssl
张人玉1 天前
Https协议数据格式
网络协议·http·https