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

为何无法通过Lambda函数访问S3存储桶?

解决Lambda调用S3 Upload时的AccessDenied错误

从你的代码和CloudWatch日志来看,你的Lambda函数在执行S3的upload操作时被拒绝了访问权限,这是很常见的权限配置问题,咱们一步步来排查解决:

1. 检查Lambda关联的IAM角色权限

Lambda要访问S3,必须通过它关联的IAM角色获得对应的权限。你需要确保这个角色拥有s3:PutObject权限(因为upload操作最终对应S3的PutObject API)。

这里是一个最小权限的IAM策略示例,你可以添加到Lambda的角色中:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::你的Bucket名称/*"
    }
  ]
}

注意:尽量指定具体的Bucket和资源路径(比如/*匹配Bucket下所有对象),避免使用*这样的宽泛权限,遵循最小权限原则。

2. 验证S3 Bucket的权限设置

有时候即使Lambda角色有了权限,Bucket本身的配置也可能阻止访问:

  • 检查Bucket的Bucket Policy:有没有包含拒绝该Lambda角色访问的语句?如果有,需要调整或者移除。
  • 检查Bucket的ACL:确认Bucket的写入权限是否对Lambda角色的主体开放。
  • 如果Bucket开启了服务器端加密(SSE):如果用的是自定义KMS密钥,还要确保Lambda角色拥有kms:GenerateDataKey和kms:Decrypt权限,否则上传加密对象会失败。

3. 确认请求参数的正确性

别忽略了最基础的检查:

  • 确认param里的Bucket名称拼写完全正确,S3 Bucket名称是大小写敏感的(虽然推荐全小写)。
  • 检查Key的格式是否合法,比如有没有包含特殊字符或者不符合S3对象键的规则。

优化错误日志方便排查

你可以在错误分支里添加更多上下文信息,比如当前要上传的Bucket和Key,这样后续排查会更高效:

s3.upload(param, function(err, data) {
  if (err) {
    // 增加上下文信息的错误日志
    console.error(`上传S3失败 | Bucket: ${param.Bucket} | Key: ${param.Key}`, err, err.stack);
  } else {
    console.log(`上传S3成功 | 返回数据:`, data);
  }
});

内容的提问来源于stack exchange,提问作者Jesus is Lord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:43:13