能否通过Lambda函数使用预签名URL上传文件到S3及权限报错处理
实现需求的可选方案
你需要的上传流程经过Lambda并返回自定义响应的能力,有两种成熟实现方式,均完全支持图片上传场景:
方案1:API网关 + Lambda 组合(适用大多数场景)
整体流程调整为:
- 用户发起上传请求,请求先打到API网关,触发对应Lambda函数
- Lambda内完成自定义校验逻辑(如用户权限、图片大小/格式校验等)后,调用S3接口生成预签名PUT URL,将URL返回给前端用户
- 用户拿到预签名URL后直接上传图片到S3,若需要上传完成后的自定义处理,可配置S3的对象创建事件触发另一个Lambda执行后续逻辑,再将处理结果返回给用户
如果是小文件上传(单文件小于6MB),也可以直接让用户把文件二进制内容传给API网关,Lambda接收后直接上传到S3,全程经过Lambda,可直接返回你需要的任意自定义响应。
方案2:S3 Object Lambda 架构
你提到的S3对象转换能力完全适配图片上传场景,可直接使用:
- 配置S3 Object Lambda接入点,所有上传请求先发送到该接入点,自动触发你的Lambda函数
- Lambda内可完成自定义校验、图片预处理(压缩、加水印等)操作后,再将文件写入目标S3桶
- 处理完成后Lambda可直接返回自定义响应给请求方
AccessDenied报错排查
你当前遇到的调用Lambda权限报错,是因为权限配置错误导致,和你配置的AWSLambdaRole无关:AWSLambdaRole是Lambda函数自身的执行角色,用于给Lambda运行时访问其他AWS服务的权限,不是给调用Lambda的IAM用户的授权。
解决方案如下:
- 给调用Lambda的IAM用户附加包含
lambda:InvokeFunction动作的身份策略,参考策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:eu-east-1:<替换为你的AWS账号ID>:function:<替换为你的Lambda函数名>" } ] }
- 检查Lambda函数的资源策略,确认没有限制调用方身份,若有资源策略限制,需要将调用用户的ARN加入允许调用的列表中。
- 核实区域配置是否正确:AWS官方没有
eu-east-1区域,确认是否为拼写错误,区域填写错误也会触发权限报错。
内容的提问来源于stack exchange,提问作者code0x00
相关产品推荐
相关产品推荐

