AWS Lambda本地测试正常 部署后无法从S3桶获取对象如何解决?
排查方向
- S3对象键名未解码(最常见原因)
S3事件通知返回的对象key默认是URL编码格式,若对象名包含空格、中文、特殊符号,直接使用事件返回的key调用GetObjectAsync会找不到对象。你可以先打印调用接口时传入的key值,确认是否存在%20这类编码字符,需使用WebUtility.UrlDecode()对key做解码处理后再调用接口。 - KMS加密权限缺失
如果你的S3桶开启了默认加密,且使用的是客户管理的KMS密钥(非AWS托管的S3默认密钥),即便角色有s3:*权限,也需要额外给Lambda执行角色添加对应KMS密钥的kms:Decrypt权限。List类操作不需要访问KMS密钥,所以不会报错,仅GetObject时会触发权限校验失败。 - S3客户端配置错误
检查你代码中S3客户端的初始化逻辑:
- 确认部署环境下初始化时没有硬编码其他区域的配置
- 若你的桶名包含
.字符,需要显式开启S3路径样式访问,避免SSL证书校验失败:
var s3Config = new AmazonS3Config { RegionEndpoint = RegionEndpoint.你对应的区域, ForcePathStyle = true }; var s3Client = new AmazonS3Client(s3Config);
- 桶策略/VPC端点策略限制
- 如果Lambda部署在VPC内,检查你配置的S3 VPC端点的访问策略,是否允许
GetObject操作 - 检查S3桶的资源策略,是否存在限制源IP、限定特定ARN才能执行
GetObject的规则,排除策略误拦截的可能
- 对象访问级别限制
确认存入S3的对象没有设置私有ACL且不属于冰川归档存储类,如果是归档存储类需要先恢复才能读取。
内容的提问来源于stack exchange,提问作者schickf
相关产品推荐
相关产品推荐

