AWS Lambda调用S3 GetObject出现AccessDenied错误如何排查?
核心问题根因
你使用的Serverless Framework配置文件中的IAM权限配置存在错误,优先级高于你单独配置的IAM角色权限,导致最终生效的权限不符合要求:s3:GetObject、s3:PutObject属于S3对象级操作,仅配置存储桶本身的ARN(arn:aws:s3:::my_bucket)无法覆盖桶内的具体对象,需要补充对象通配符路径arn:aws:s3:::my_bucket/*作为权限作用资源。
修复步骤
- 修正yml配置中的IAM语句Resource字段,修改后配置如下:
provider: name: aws runtime: python3.8 lambdaHashingVersion: 20201221 iam: role: statements: - Effect: 'Allow' Action: - 's3:GetObject' - 's3:PutObject' Resource: - "arn:aws:s3:::my_bucket" - "arn:aws:s3:::my_bucket/*"
- 重新部署Serverless服务,确认新的IAM权限已经同步到Lambda执行角色中。
仍未解决时的额外排查项
- 检查S3存储桶的桶策略,如果存在针对Lambda执行角色的Deny语句,会直接覆盖IAM角色的Allow权限,需要删除对应Deny配置。
- 如果存储桶启用了KMS默认加密,需要给Lambda执行角色额外添加
kms:Decrypt权限,作用资源为对应KMS密钥的ARN。 - 排查对象不存在的场景:S3默认会对无ListBucket权限的请求返回
AccessDenied而非404,避免泄露对象存在性。你可以给Lambda角色添加s3:ListBucket权限(Resource配置为桶本身ARNarn:aws:s3:::my_bucket),确认报错是否变为404,再排查Key参数是否正确。
内容的提问来源于stack exchange,提问作者J. Doe
相关产品推荐
相关产品推荐

