使用AWS Lambda上传图片至S3时遇Access Denied错误求助
解决AWS Lambda部署后S3上传Access Denied问题
我之前踩过完全一样的坑!本地用serverless invoke local function --function khanh测试正常,一部署到Lambda就报S3权限错误,核心原因是本地测试和Lambda运行时用的是不同的AWS凭证体系,给你几个最有效的排查和解决步骤:
1. 检查Lambda执行角色的S3权限
本地测试时,你的代码用的是本地环境的AWS凭证(比如~/.aws/credentials里的密钥),而Lambda运行时用的是它的执行IAM角色。这个角色必须拥有对目标S3桶的写入权限:
- 打开AWS IAM控制台,找到这个Lambda函数对应的执行角色
- 确认角色的权限策略里包含
s3:PutObject(如果是上传操作),并且资源范围正确指向你的S3桶,比如:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-bucket-name/*" } ] }
2. 确保Serverless框架配置了正确的权限
如果你用Serverless.yml管理部署,一定要在函数配置里添加iamRoleStatements,不然部署时不会自动给Lambda角色加上S3权限。示例配置:
functions: khanh: handler: handler.yourHandler iamRoleStatements: - Effect: Allow Action: - s3:PutObject Resource: "arn:aws:s3:::your-bucket-name/*"
修改后重新执行serverless deploy,让框架更新Lambda的角色权限。
3. 排查S3桶的Bucket Policy
有时候S3桶本身的策略会拒绝外部角色的访问,检查桶的Bucket Policy:
- 打开S3控制台,找到目标桶的「权限」标签
- 确认没有拒绝Lambda执行角色ARN的语句,必要时添加允许规则:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::your-account-id:role/your-lambda-execution-role" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::your-bucket-name/*" } ] }
4. 验证桶名和区域配置是否一致
本地测试时可能用了正确的桶名和区域,但部署后Lambda的环境变量或代码里的配置可能出错,比如区域不匹配导致请求到错误的S3端点,也会触发权限类错误。确保代码里的S3客户端配置了正确的区域:
const s3 = new AWS.S3({ region: 'us-east-1' }); // 替换为你的桶所在区域
先从Lambda执行角色的权限开始排查,这是最常见的问题!
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

