You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python 3.6调用AWS Kinesis Video PutMedia接口授权错误求助

我之前在做Kinesis Video流推送的时候也踩过这个坑!你遇到的“Unable to determine service/operation name to be authorized”错误,本质是自定义PutMedia请求时,AWS的签名系统没识别到对应的服务和操作名称,导致授权失败。下面给你一步步拆解解决方法,附完整代码示例:

问题根源

boto3的Kinesis Video客户端没有内置PutMedia方法,当你自行构造HTTP请求时,默认的AWS签名流程不会自动关联Kinesis Video的服务名(kinesisvideo)和PutMedia操作,导致授权系统无法识别你的请求权限,从而抛出这个错误。

解决步骤与代码实现

要解决这个问题,我们需要手动使用botocore的签名工具,为PutMedia请求添加正确的SigV4签名,同时确保请求头和流式传输符合Kinesis Video的要求。

首先安装Python3.6兼容的依赖:

pip install boto3>=1.9.0 botocore>=1.12.0

然后是完整代码实现:

import boto3
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest
from botocore.endpoint import URLLib3Session

# 替换成你的配置信息
REGION = "us-east-1"
STREAM_NAME = "your-target-stream-name"
# 如果是实时流,这里换成你的视频流生成器(比如摄像头读取的字节流)
VIDEO_SOURCE_PATH = "/path/to/your/video.h264"

# 1. 获取PutMedia专用的数据端点
kinesis_video_client = boto3.client("kinesisvideo", region_name=REGION)
endpoint_response = kinesis_video_client.get_data_endpoint(
    StreamName=STREAM_NAME,
    APIName="PUT_MEDIA"
)
put_media_url = f"{endpoint_response['DataEndpoint']}/putMedia"

# 2. 构造PutMedia必填的请求头
request_headers = {
    "Content-Type": "application/octet-stream",
    "x-amzn-stream-name": STREAM_NAME,
    "x-amzn-fragment-timecode-type": "RELATIVE"  # 可选ABSOLUTE,根据你的时间码需求选择
}

# 3. 生成SigV4签名(关键!必须指定服务名为kinesisvideo)
session = boto3.Session()
credentials = session.get_credentials()
sigv4_signer = SigV4Auth(credentials, "kinesisvideo", REGION)

# 4. 构造带签名的AWS请求
aws_request = AWSRequest(
    method="POST",
    url=put_media_url,
    headers=request_headers
)
sigv4_signer.add_auth(aws_request)

# 5. 流式推送视频数据(避免大文件占用过多内存)
with open(VIDEO_SOURCE_PATH, "rb") as video_stream:
    http_session = URLLib3Session()
    response = http_session.send(
        aws_request.prepare(),
        body=video_stream,
        stream=True
    )

    # 处理响应结果
    if response.status == 200:
        print("视频流推送成功!")
    else:
        print(f"推送失败,状态码: {response.status},错误信息: {response.data.decode('utf-8')}")
关键注意事项
  • 权限配置:确保你的IAM实体(用户/角色)拥有kinesisvideo:PutMedia权限,策略示例如下:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": "kinesisvideo:PutMedia",
                "Resource": "arn:aws:kinesisvideo:REGION:ACCOUNT_ID:stream/STREAM_NAME/*"
            }
        ]
    }
    
  • 流式传输要求:PutMedia强制要求数据流式上传,不要一次性把整个视频文件读入内存,用文件流或实时流生成器作为请求体即可。
  • Python3.6兼容性:确保安装的boto3和botocore版本支持Python3.6,建议选择boto3<=1.26.0(后续版本不再支持Python3.6)。

内容的提问来源于stack exchange,提问作者hgcahez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:55:19