如何在AWS S3中实现视频上传时或上传后的自动压缩?
AWS S3自动压缩视频方案(结合MediaConvert)
核心实现逻辑
通过S3事件触发Lambda函数,由Lambda调用MediaConvert自动完成视频压缩任务,压缩后的文件可存储到指定S3桶(或同桶的特定前缀路径下),全程无需手动操作。
具体步骤
1. 配置IAM权限角色
- 创建IAM角色,为其添加以下权限:
- 读取源S3存储桶、写入目标S3存储桶的精细S3权限(避免全量权限)
- MediaConvert服务执行任务的权限(
AWSElementalMediaConvertFullAccess或更精细的任务创建权限)
- 在MediaConvert控制台中,将该角色设为服务默认执行角色。
2. 编写Lambda触发函数
新建Lambda函数(推荐Python/Node.js环境),实现以下逻辑:
- 接收S3对象上传事件,提取源文件的桶名和路径
- 调用MediaConvert的
CreateJobAPI,指定输入源文件、压缩参数(码率、分辨率等)、输出存储路径 - 示例Python代码片段:
import boto3 import os mediaconvert = boto3.client('mediaconvert', endpoint_url=os.environ['MEDIACONVERT_ENDPOINT']) def lambda_handler(event, context): # 提取S3上传事件中的文件信息 record = event['Records'][0] src_bucket = record['s3']['bucket']['name'] src_key = record['s3']['object']['key'] # 定义MediaConvert压缩任务配置 job_settings = { "Inputs": [{"FileInput": f"s3://{src_bucket}/{src_key}"}], "OutputGroups": [ { "Name": "Compressed_Videos", "Outputs": [ { "ContainerSettings": {"Container": "MP4"}, "VideoDescription": { "CodecSettings": { "Codec": "H_264", "H264Settings": { "Bitrate": 2000000, # 2Mbps,可按需调整 "ResolutionWidth": 1280, "ResolutionHeight": 720 } } }, "AudioDescriptions": [ { "CodecSettings": { "Codec": "AAC", "AacSettings": {"Bitrate": 128000} } } ] } ], "OutputGroupSettings": { "Type": "FILE_GROUP_SETTINGS", "FileGroupSettings": { "Destination": f"s3://{os.environ['TARGET_BUCKET']}/compressed/" } } } ] } # 启动压缩任务 mediaconvert.create_job( Role=os.environ['MEDIACONVERT_ROLE_ARN'], Settings=job_settings ) return {'statusCode': 200}
- 给Lambda函数配置环境变量:
MEDIACONVERT_ENDPOINT(MediaConvert服务端点,可在控制台获取)、TARGET_BUCKET(压缩后文件存储桶)、MEDIACONVERT_ROLE_ARN(之前创建的IAM角色ARN)
3. 配置S3事件通知
打开源视频存储桶的「属性」-「事件通知」:
- 创建新通知,名称自定义(如
Video_Compress_Trigger) - 事件类型勾选「Put」(对象上传事件)
- 可通过前缀/后缀过滤(比如只处理
.mp4/.mov格式视频) - 目标选择「Lambda函数」,关联刚才创建的Lambda函数
4. 业务逻辑调整(可选)
如果之前后端限制65MB以上视频无法上传,可根据业务需求放宽限制——毕竟上传后会自动压缩;也可保持限制,仅对符合条件的视频执行自动压缩。
5. 测试验证
上传大体积视频到源S3桶,通过Lambda日志确认事件触发,再到MediaConvert控制台查看任务状态,最后检查目标桶是否生成压缩后的视频文件。
注意事项
- 压缩参数(码率、分辨率等)需根据业务场景调整,平衡视频质量与文件大小
- 可在MediaConvert中创建任务模板,后续Lambda调用时直接引用模板ID,简化代码
- 权限配置遵循最小权限原则,避免过度授权
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

