S3上传在sls offline正常,部署到AWS后出现Access Denied错误
问题原因分析
你的Lambda执行角色缺少对S3桶内对象的操作权限。在serverless.yml的IAM角色声明中,S3资源仅指定了桶本身(arn:aws:s3:::${self:custom.imagesBucketName}),但s3.putObject操作需要的是桶内对象层级的权限,当前配置无法覆盖这个操作。
解决方案
修改serverless.yml中provider.iam.role.statements里的S3资源配置,添加/*后缀,让权限覆盖桶内所有对象:
provider: iam: role: statements: - Effect: Allow Action: - "s3:*" Resource: - "arn:aws:s3:::${self:custom.imagesBucketName}" - "arn:aws:s3:::${self:custom.imagesBucketName}/*" # 新增该行,覆盖桶内对象权限
额外验证点
- 确认Lambda环境变量
BUCKET_NAME正确指向目标桶:可在AWS控制台的Lambda函数配置中查看环境变量值是否与实际桶名一致。 - 检查S3桶的公共访问设置:当前桶已关闭所有公共访问阻止规则,这部分配置无问题,但需确保没有其他桶策略或IAM策略冲突。
- 本地测试正常的原因:
sls offline通常使用本地AWS凭证(如~/.aws/credentials),该凭证可能拥有更宽泛的S3权限,因此不会触发权限错误;而线上Lambda使用专属IAM角色,权限限制更严格。
内容的提问来源于stack exchange,提问作者Alvee
相关产品推荐
相关产品推荐

