已授予S3访问权限的Lambda调用GetObjectRequest返回403 AccessDenied错误如何解决
Lambda访问S3返回AccessDenied错误排查方案
- IAM权限配置错误:首先确认你serverless配置里
s3:GetObject对应的Resource值是否符合要求,GetObject属于对象级操作,资源ARN需要精确到对象路径,若要授权桶内所有对象的访问权限,格式应为arn:aws:s3:::你的桶名/*,如果漏写末尾的/*只写到桶级别ARN,权限是不会生效的。 - S3桶策略限制:如果目标S3存储桶单独配置了Bucket Policy,就算Lambda角色有IAM权限,桶策略如果禁止了该角色访问、或者限制了访问源为指定VPC/IP段,也会返回403。你的Lambda部署在VPC内,优先确认桶策略是否允许该Lambda角色、或者该VPC的访问请求。
- KMS加密权限缺失:如果目标S3桶/对象开启了KMS自定义密钥加密,仅配置S3访问权限是不够的,还需要给Lambda执行角色添加对应KMS密钥的
kms:Decrypt权限,否则也会触发AccessDenied错误。 - 请求的对象不存在或路径错误:为了避免泄露桶内对象存在性,S3在请求方没有ListBucket权限的前提下,访问不存在的对象会返回403而非404,可以先核对你请求的对象Key是否正确,也可以给Lambda角色补充
s3:ListBucket权限验证是否是对象不存在的问题。 - VPC访问配置问题:你的Lambda部署在VPC内,如果VPC没有配置S3网关端点、且子网没有公网访问路由,Lambda无法正常访问S3;另外如果S3 VPC端点本身配置了访问策略限制了对该桶的访问,也会返回403。
- 请求参数错误:核对你调用
getObject时传入的桶名、Region参数是否和实际桶的配置一致,桶名拼写错误、Region不匹配也有可能触发403错误。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

