如何在AWS视频流(Lambda+MediaConvert)中添加Token/Cookie授权及TS加密
修改Lambda函数实现HLS分片加密及密钥存储
核心修改步骤
1. 为MediaConvert作业添加加密配置
找到Lambda中构建MediaConvert作业请求的代码段,在HLS输出组的HlsGroupSettings里新增Encryption配置,指定加密规则:
"HlsGroupSettings": { # 保留原有分片长度、输出路径等配置 "Encryption": { "EncryptionMethod": "AES_128", "KeyProviderType": "STATIC_KEY", "StaticKeyProvider": { "Key": "", # 后续自动生成或从密钥管理服务读取 "KeyMd5": "", "KeyStoragePolicy": "STORE_WITH_CONTENT", "Url": "" # 密钥在S3输出桶的访问地址 } } }
若使用动态密钥(如SPEKE集成DRM),可替换StaticKeyProvider为SpekeKeyProvider,配置DRM服务商的API地址等参数。
2. 自动生成并上传加密密钥到输出桶
在Lambda中添加密钥生成与S3上传逻辑,替代手动配置密钥:
- 先导入依赖模块:
import boto3 import base64 import hashlib import os
- 在创建MediaConvert作业前,生成密钥并上传:
# 生成16字节AES-128密钥 aes_key = os.urandom(16) key_b64 = base64.b64encode(aes_key).decode('utf-8') # 计算密钥MD5用于校验 key_md5 = hashlib.md5(aes_key).digest() key_md5_b64 = base64.b64encode(key_md5).decode('utf-8') # 上传密钥到输出桶 s3_client = boto3.client('s3') key_s3_path = f"{输出前缀}/encryption.key" s3_client.put_object( Bucket=输出桶名称, Key=key_s3_path, Body=aes_key, ContentType='application/octet-stream' ) # 将生成的密钥信息填入MediaConvert配置 # 对应替换之前Encryption配置中的Key、KeyMd5、Url字段
3. 更新Lambda权限
为Lambda执行角色添加以下权限:
s3:PutObject:允许向输出桶写入密钥文件- 若使用SPEKE,需添加对应DRM服务的调用权限(如
execute-api:Invoke) - 保留原有
mediaconvert:CreateJob权限
4. 验证加密效果
转码完成后检查输出桶:
- 存在
encryption.key文件 - M3U8文件中包含
#EXT-X-KEY标签,指向密钥的S3地址及MD5校验值
注意事项
- 生产环境建议用AWS Secrets Manager存储静态密钥,避免硬编码
- SPEKE模式更适合企业级DRM场景,支持Widevine、FairPlay等主流DRM标准
- 确保MediaConvert服务角色拥有访问输出桶及密钥的权限
内容的提问来源于stack exchange,提问作者User
相关产品推荐
相关产品推荐

