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

Lambda生成的S3 getObject预签名URL访问报AccessDenied错误排查

问题根本原因

核心是你初始化S3客户端时未显式指定桶所在的区域,导致签名逻辑和访问端点不匹配,和你是否手动传入AKSK没有直接关系:

  • 当你不显式指定region_name初始化boto3 S3客户端时,Lambda运行环境中的boto3默认会使用S3全局端点(s3.amazonaws.com),对应默认区域us-east-1生成签名
    • 若你的S3桶实际部署在非us-east-1区域,且未开启全局端点兼容配置,使用全局端点生成的签名和桶所在区域的端点签名规则不匹配,S3服务端校验签名时就会返回AccessDenied
    • 若你的桶策略/存储桶配置强制要求使用SigV4签名,旧版本boto3使用全局端点时默认会采用SigV2算法签名,也会触发签名校验失败
  • 你修复时传入了正确的region_name,boto3会自动使用对应区域的S3端点(s3.<region>.amazonaws.com)和匹配的签名算法生成预签名URL,签名校验自然通过。你可以自行验证:去掉手动传入的AKSK,仅保留region_name参数初始化客户端,使用Lambda默认的执行角色临时凭证,生成的URL同样可以正常访问
  • 你在Cloud Shell中用aws s3 presign命令生成的URL可正常访问,也是因为Cloud Shell的AWS CLI默认已经配置了正确的对应区域参数,签名逻辑匹配
  • 你此前无需指定区域就能正常工作,大概率是之前使用的S3桶部署在us-east-1区域,或者之前的桶配置了全局端点兼容、未开启SigV4强制校验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 10:54:00